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

|
этот кусок занимает 22 команды в дизасме ulTmp = ((uint32_t)uSystemTime<<16) + TCNT1; Поскольку uSystemTime и ulTmp это 4-ч байтовые, думаю можно оптимизировать вычисление, только, честно говря, я не знаю как Я формирую ШИМ с высокой длительностью 1 млс и низкий 10 млс, на фронтах погрешность в 31 мкс. Вот как я формирую ШИМ: CODE for(unsigned char i = 0; i < MAX_CHANEL; i++) { if(endis & (1<<i)) //Канал вкл/Выкл? { tt = GetSystemTimeMS() - ms[i];
if(curate & (1<<i)) //Текущий уровень высокий { if(tt > tTiming[1][i]) { PORTC |= (1<<i); curate &= ~(1<<i); ms[i] = GetSystemTimeMS(); } }
if((curate & (1<<i)) == 0) { if(tt > tTiming[0][i]) { PORTC &= ~(1<<i); curate |= (1<<i); ms[i] = GetSystemTimeMS(); } } }//if(endis & (1<<i)) }//for(unsigned char i = 0; i < MAX_CHANEL; i++)
Сообщение отредактировал Andruxa-1 - Jun 21 2010, 10:26
|
|
|
|
|
Jun 21 2010, 10:32
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(MrYuran @ Jun 21 2010, 13:28)  "Погрешность" - это джиттер чтоли? Или постоянная величина? Да, джиттер. Цитата(MrYuran @ Jun 21 2010, 13:28)  А что мешает задействовать аппаратный ШИМ? Мне нужно генерировать ШИМ от 0,1 Гц до 2 кГц. И еще на 8 каналов.
|
|
|
|
|
Jun 21 2010, 10:55
|

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

|
Цитата(Andruxa-1 @ Jun 21 2010, 14:32)  Да, джиттер. Мне нужно генерировать ШИМ от 0,1 Гц до 2 кГц. И еще на 8 каналов. При такой организации процесса ничего не поделаешь. Непредсказуемая задержка возникает, когда в одном или нескольких n-1 предыдущих каналов происходит переключение уровня. Надо как-то симметрировать алгоритм. То есть, задержка процедуры обработки одного канала должна быть одинаковой, независимо от внешних условий и ветки алгоритма, по которой в данный момент пошла программа.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 11:07
|

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

|
Цитата(Andruxa-1 @ Jun 21 2010, 14:22)  Поскольку uSystemTime и ulTmp это 4-ч байтовые... Отводить четыре байта под uSystemTime - излишество. Достаточно выделить два - всё равно значение сдвигается влево на 16 разрядов... Цитата(MrYuran @ Jun 21 2010, 14:55)  Надо как-то симметрировать алгоритм. Автор вопроса не огласил всех требований - возможно и это не поможет... P.S. Может быть, подход к решению задачи - в корне неверный. Огласите исходнуя задачу: что генерить, с какими временами и точностью, как задаются времена (период/длительность)...
|
|
|
|
|
Jun 21 2010, 11:41
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Многоканальный генератор электрических импульсов переменной частоты и скважности на восемь каналов. Микроконтроллер ATMega8 с внешним кварцем 20Мгц, имеющая восемь выходов на которые и генерируется частота. Генерация импульсов в диапазоне частот: 0.1 Гц - 2 Кгц. Управление частотой и скважностью производится посредством установки длительности высокого, и низкого уровней. Уровни задаются квантами времени. Погрешность не более 1%.
|
|
|
|
|
Jun 21 2010, 11:47
|

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

|
Цитата(Andruxa-1 @ Jun 21 2010, 15:41)  Генерация импульсов в диапазоне частот: 0.1 Гц - 2 Кгц. Погрешность не более 1%. Посчитаем... 2кГц->500мкс, х1% = 5мкс. Нереально в принципе при софтовой реализации. Либо загрубляем требования, либо реализуем аппаратно. Например, внешней ЦПЛД-шкой
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 12:00
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(MrYuran @ Jun 21 2010, 14:47)  Посчитаем... 2кГц->500мкс, х1% = 5мкс. Нереально в принципе при софтовой реализации. Аппаратно, на 8 каналов, можно реализовать на этом камне? Подскажите куда копать.
|
|
|
|
|
Jun 21 2010, 12:36
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
ATMega8
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|