реклама на сайте
подробности

 
 
> Временные интервалы
Andruxa-1
сообщение Jun 21 2010, 08:55
Сообщение #1





Группа: Участник
Сообщений: 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();
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение Jun 24 2010, 21:04
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Кстати, задачка на самом деле очень интересная, и вполне решаемая...
Не забываем что Ton+Toff >= 100 тиков для каждого канал и такта 5мкс,
а всего смен значения порта за 100тиков не более 16
Ну и..., помойму это тот редкий случай когда вложенные прерывания могут быть очень даже к месту...
По моим прикидкам можно получить джиттер на каналах около 1-2мкс
ну и еще останется время на получение новых значений Ton/Toff сверху по уарту на 115200

Как-то так...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 25 2010, 05:57
Сообщение #3


Гуру
******

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



Цитата(singlskv @ Jun 25 2010, 01:04) *
Кстати, задачка на самом деле очень интересная, и вполне решаемая...
Не забываем что Ton+Toff >= 100 тиков для каждого канал и такта 5мкс,
а всего смен значения порта за 100тиков не более 16
Вот и давайте посчитаем: сколько отводиться на смену выходного сигнала? Сто делим на 16 = 6 (четыре такта отдадим на смену Ton/Toff rolleyes.gif ). Не все команды выполняются за один такт. Следовательно, нужно определить прошедшее время удержания сигнала, сравнить с некой константой, при необходимости изменить выходной сигнал и проделать некие действия по новому отсчету времени, и всё это улолжить максимум в шесть команд (точнее в несколько команд, которые выполняются за шесть тактов). Сможите? Пусть даже на ассемблере.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 25 2010, 07:08
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Палыч @ Jun 25 2010, 09:57) *
Вот и давайте посчитаем: сколько отводиться на смену выходного сигнала? Сто делим на 16 = 6 (четыре такта отдадим на смену Ton/Toff rolleyes.gif ). Не все команды выполняются за один такт. Следовательно, нужно определить прошедшее время удержания сигнала, сравнить с некой константой, при необходимости изменить выходной сигнал и проделать некие действия по новому отсчету времени, и всё это улолжить максимум в шесть команд (точнее в несколько команд, которые выполняются за шесть тактов). Сможите? Пусть даже на ассемблере.
Вы чего-то совсем не то насчитали, 16смен значения порта будет в самом худшем случае за
100*5мкс=500мкс (если на всех выходах нужно 2КГц и никакие фронты не совпадают)

Цитата(=GM= @ Jun 25 2010, 02:35) *
Тогда уж лучше весь if(Flag_5us) {...} вставить в прерывание, по крайней мере, флаг не придётся проверять.
Почти так, только не совсем
Цитата
Но прерывание для данной задачи - зло, поэтому лучше делать без прерываний вообще, не будет потерь времени на сохранение контекста в прерывании.
Прерывания позволят освободить основной цикл проги для приема обновленных значений Ton/Toff
извне, например по уарту или с кнопочек.
Большую часть сохранения контекста можно делать после вывода значения в порт перед вычислениями(это конечно только на АСМ).

Видимо Вы не до конца поняли суть предлагаемого алгоритма.
За 500мкс сменить значение порта нужно не более 16 раз.
Если эти 16смен забуферировать и приделать к ним счетчики сколько времени не менять значение на порту,
то у нас будет куча времени на рассчеты следующих значений.
Вопрос только в правильной организации рассчетов в прерывании и одновременный вывод из буфера уже сохраненных.
Так вот здесь очень красиво можно вписать вложенные прерывания, причем прерывание то будет одно,
только оно может вызываться из уже работающего того же самого обработчика.

Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 25 2010, 07:18
Сообщение #5


Беспросветный оптимист
******

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



Цитата(singlskv @ Jun 25 2010, 11:08) *
Видимо Вы не до конца поняли суть предлагаемого алгоритма.
За 500мкс сменить значение порта нужно не более 16 раз.

Вы видимо, тоже не до конца.
Эти смены не равномерно распределены по интервалу, а могут вплотную друг за другом идти, либо вообще накладываться.
Вот в эти моменты и возникает джиттер. И требование в 5мкс накладывает очень жёсткие требования...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - singlskv   Цитата(MrYuran @ Jun 25 2010, 11:18) Вы в...   Jun 25 2010, 07:24
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016