|
Временные интервалы |
|
|
|
Jun 21 2010, 08:55
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Я задействовал таймер1, прерывание по переполнению. Таймер служит для подсчета тиков ну и вычисления системного времени. Внешний кварц на 20 Мгц. Можно ли оптимизировать вычисления. CODE #include <avr\io.h> #include <avr\interrupt.h>
uint32_t ulSystemTime = 0; uint32_t ulTmp;
void SistemTimerInit(){ TCCR1A = 0; TIMSK |= (1<<TOIE1); TCCR1B |= (1<<CS10); }
uint32_t GetSystemTimeMS(){ cli();
ulTmp = (ulSystemTime<<16) + TCNT1; sei();
return (ulTmp); }
SIGNAL(SIG_OVERFLOW1) { cli();
ulSystemTime++;
sei(); }
|
|
|
|
|
 |
Ответов
|
Jun 25 2010, 05:57
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(singlskv @ Jun 25 2010, 01:04)  Кстати, задачка на самом деле очень интересная, и вполне решаемая... Не забываем что Ton+Toff >= 100 тиков для каждого канал и такта 5мкс, а всего смен значения порта за 100тиков не более 16 Вот и давайте посчитаем: сколько отводиться на смену выходного сигнала? Сто делим на 16 = 6 (четыре такта отдадим на смену Ton/Toff  ). Не все команды выполняются за один такт. Следовательно, нужно определить прошедшее время удержания сигнала, сравнить с некой константой, при необходимости изменить выходной сигнал и проделать некие действия по новому отсчету времени, и всё это улолжить максимум в шесть команд (точнее в несколько команд, которые выполняются за шесть тактов). Сможите? Пусть даже на ассемблере.
|
|
|
|
|
Jun 25 2010, 07:08
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Палыч @ Jun 25 2010, 09:57)  Вот и давайте посчитаем: сколько отводиться на смену выходного сигнала? Сто делим на 16 = 6 (четыре такта отдадим на смену Ton/Toff  ). Не все команды выполняются за один такт. Следовательно, нужно определить прошедшее время удержания сигнала, сравнить с некой константой, при необходимости изменить выходной сигнал и проделать некие действия по новому отсчету времени, и всё это улолжить максимум в шесть команд (точнее в несколько команд, которые выполняются за шесть тактов). Сможите? Пусть даже на ассемблере. Вы чего-то совсем не то насчитали, 16смен значения порта будет в самом худшем случае за 100*5мкс=500мкс (если на всех выходах нужно 2КГц и никакие фронты не совпадают) Цитата(=GM= @ Jun 25 2010, 02:35)  Тогда уж лучше весь if(Flag_5us) {...} вставить в прерывание, по крайней мере, флаг не придётся проверять. Почти так, только не совсем Цитата Но прерывание для данной задачи - зло, поэтому лучше делать без прерываний вообще, не будет потерь времени на сохранение контекста в прерывании. Прерывания позволят освободить основной цикл проги для приема обновленных значений Ton/Toff извне, например по уарту или с кнопочек. Большую часть сохранения контекста можно делать после вывода значения в порт перед вычислениями(это конечно только на АСМ). Видимо Вы не до конца поняли суть предлагаемого алгоритма. За 500мкс сменить значение порта нужно не более 16 раз. Если эти 16смен забуферировать и приделать к ним счетчики сколько времени не менять значение на порту, то у нас будет куча времени на рассчеты следующих значений. Вопрос только в правильной организации рассчетов в прерывании и одновременный вывод из буфера уже сохраненных. Так вот здесь очень красиво можно вписать вложенные прерывания, причем прерывание то будет одно, только оно может вызываться из уже работающего того же самого обработчика.
|
|
|
|
|
Jun 25 2010, 07:18
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(singlskv @ Jun 25 2010, 11:08)  Видимо Вы не до конца поняли суть предлагаемого алгоритма. За 500мкс сменить значение порта нужно не более 16 раз. Вы видимо, тоже не до конца. Эти смены не равномерно распределены по интервалу, а могут вплотную друг за другом идти, либо вообще накладываться. Вот в эти моменты и возникает джиттер. И требование в 5мкс накладывает очень жёсткие требования...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 25 2010, 07:24
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(MrYuran @ Jun 25 2010, 11:18)  Вы видимо, тоже не до конца. Эти смены не равномерно распределены по интервалу, а могут вплотную друг за другом идти, либо вообще накладываться. Вот в эти моменты и возникает джиттер. И требование в 5мкс накладывает очень жёсткие требования... Как раз для случаев когда они идут с интервалом в 5мкс и вводится буферирование, и вывод в порт при смене значения всегда из буфера в самом начале прерывания, а после этого дальнейший рассчет нового значения на освободившееся место в буфере.
|
|
|
|
Сообщений в этой теме
Andruxa-1 Временные интервалы Jun 21 2010, 08:55 Палыч По какому критерию Вы бы хотели провести оптимизац... Jun 21 2010, 09:56 Andruxa-1 этот кусок занимает 22 команды в дизасме ulTmp = (... Jun 21 2010, 10:22  MrYuran Цитата(Andruxa-1 @ Jun 21 2010, 14:2... Jun 21 2010, 10:28   Andruxa-1 Цитата(MrYuran @ Jun 21 2010, 13:28) ... Jun 21 2010, 10:32    MrYuran Цитата(Andruxa-1 @ Jun 21 2010, 14:3... Jun 21 2010, 10:55  Палыч Цитата(Andruxa-1 @ Jun 21 2010, 14:2... Jun 21 2010, 10:52  Палыч Цитата(Andruxa-1 @ Jun 21 2010, 14:2... Jun 21 2010, 11:07   Andruxa-1 Многоканальный генератор электрических импульсов п... Jun 21 2010, 11:41    MrYuran Цитата(Andruxa-1 @ Jun 21 2010, 15:4... Jun 21 2010, 11:47     Andruxa-1 Цитата(MrYuran @ Jun 21 2010, 14:47) Посч... Jun 21 2010, 12:00      MrYuran Цитата(Andruxa-1 @ Jun 21 2010, 16:0... Jun 21 2010, 12:19    Andruxa-1 ATMega8 Jun 21 2010, 12:36     Палыч Цитата(Andruxa-1 @ Jun 21 2010, 16:3... Jun 21 2010, 12:51      MrYuran Цитата(Палыч @ Jun 21 2010, 16:51) Восемь... Jun 21 2010, 15:23  =GM= Можно вот так оптимизировать Кодtt=GetSystemTimeMS... Jun 21 2010, 15:26   Andruxa-1 Цитата(=GM= @ Jun 21 2010, 18:26) Можно в... Jun 22 2010, 10:02    Палыч Цитата(Andruxa-1 @ Jun 22 2010, 14:0... Jun 22 2010, 11:00     =GM= Совершенно верно.
Андрукса, какой у вас джиттер п... Jun 22 2010, 11:26      Andruxa-1 Цитата(=GM= @ Jun 22 2010, 14:26) Соверше... Jun 22 2010, 12:32       demiurg_spb Цитата(Andruxa-1 @ Jun 22 2010, 16:3... Jun 22 2010, 12:33       =GM= Цитата(Andruxa-1 @ Jun 22 2010, 11:3... Jun 22 2010, 12:58        Andruxa-1 Цитата(=GM= @ Jun 22 2010, 15:58) Похоже,... Jun 22 2010, 13:13         =GM= Сути чего? Jun 22 2010, 13:32          Andruxa-1 Цитата(=GM= @ Jun 22 2010, 16:32) Сути че... Jun 22 2010, 13:35           =GM= Ну, при программном подходе джиттер будет всегда, ... Jun 22 2010, 15:24 xemul Завести таймер на 5 мкс, в его прерывании делать т... Jun 22 2010, 16:18 singlskv Цитата(xemul @ Jun 22 2010, 20:18) uint24... Jun 23 2010, 18:26 =GM= Цитата(xemul @ Jun 22 2010, 15:18) Завест... Jun 24 2010, 22:35  xemul Цитата(=GM= @ Jun 25 2010, 02:35) Тогда у... Jun 25 2010, 10:07   =GM= Из поста #26.
1) Ну смотрите, объясняю конструкци... Jun 25 2010, 11:30    xemul Цитата(=GM= @ Jun 25 2010, 15:30) Из пост... Jun 25 2010, 12:46     =GM= Немного повергло в шок, как компилятор WinAVR тран... Jun 25 2010, 15:56      xemul Цитата(=GM= @ Jun 25 2010, 19:56) Но по з... Jun 25 2010, 16:26       =GM= А зачем орить? После std сразу brne ... Но это не ... Jun 25 2010, 21:05       =GM= Вот, немного переделал алгоритм
if(sysTime>end... Jun 28 2010, 12:12      demiurg_spb Цитата(=GM= @ Jun 25 2010, 19:56) Немного... Jun 28 2010, 17:14       =GM= Цитата(demiurg_spb @ Jun 28 2010, 16:14) ... Jun 28 2010, 22:08        demiurg_spb Цитата(=GM= @ Jun 29 2010, 02:08) Где ж н... Jun 29 2010, 11:48         =GM= Това-а-рищ Иванов, не надо настаивать на глупости ... Jun 29 2010, 12:13          demiurg_spb Для волатильных объектов компилятор фактически не ... Jul 1 2010, 10:07 Andruxa-1 Спасибо за ответы и подсказки, буду пробовать. Jun 24 2010, 14:33 MrYuran В общем, если отбросить чисто академические изыски... Jun 25 2010, 06:07 =GM= Цитата(MrYuran @ Jun 25 2010, 05:07) -В о... Jun 25 2010, 09:12 XVR ЦитатаЕстественно, можно было оптимизировать и не ... Jul 2 2010, 06:22 demiurg_spb Цитата(XVR @ Jul 2 2010, 10:22) Если комп... Jul 2 2010, 12:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|