|
|
  |
Временные интервалы |
|
|
|
Jun 21 2010, 15:26
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Можно вот так оптимизировать Код tt=GetSystemTimeMS()-ms; for(unsigned char i=0;i<MAX_CHANEL;i++) { if(imageC & (1<<i)) { if(tt > tTiming1[i]) imageС |=(1<<i); } else { if(tt > tTiming0[i]) imageС &=~(1<<i); } } PORTC=imageC; ms=GetSystemTimeMS(); Думаю джиттер существенно сократится, ещё можно цикл развернуть.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 22 2010, 10:02
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(=GM= @ Jun 21 2010, 18:26)  Можно вот так оптимизировать Думаю джиттер существенно сократится, ещё можно цикл развернуть. А как такой цикл можно развернуть?
|
|
|
|
|
Jun 22 2010, 12:32
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(=GM= @ Jun 22 2010, 14:26)  Совершенно верно.
Андрукса, какой у вас джиттер получаетсся с вариантом из поста #16? джиттера нет, но получается меандр
|
|
|
|
|
Jun 22 2010, 13:13
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(=GM= @ Jun 22 2010, 15:58)  Похоже, это я лоханулся, переменная MS должна быть для каждого канала своя, т.е. массив MS(i). Возвращайте взад присвоение MS(i) в обоих ветвях цикла.
И лучше не вызывайте GetSystemTime, а просто где требуется вставьте тело подпрограммы. Я пробовал этот вариант, сути не меняет
|
|
|
|
|
Jun 22 2010, 13:35
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

|
Цитата(=GM= @ Jun 22 2010, 16:32)  Сути чего? сори, не правильно выразился, джиттер остается и в этом варианте
|
|
|
|
|
Jun 22 2010, 15:24
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Ну, при программном подходе джиттер будет всегда, вопрос состоит в том, удовлетворяет величина джиттера или нет? Чтобы ваш вариант привести в божеский вид, надо работать и работать, например можно вычислять не длительность текущего периода 1 или 0, а сразу время его завершения. Тогда в цикле будет только сравнение, а не вычисление и сравнение. А это ого-го сколько времени для 8 каналов. Вот как-то так: Код if(PORTC & _BV(i)) //if(PORTC & (1<<i)) { sysTime=(ulsysTime<<16)+TCNT1; if(sysTime>endTime[i]) { PORTC &=~_BV(i); //PORTC &=~(1<<i); endTime[i]=sysTime+tLow[i]; //новое время завершения 0 } } else { sysTime=(ulsysTime<<16)+TCNT1; if(sysTime>endTime[i]) { PORTC |=_BV(i); //PORTC |=(1<<i); endTime[i]=sysTime+tHigh[i]; //новое время завершения 1 } }
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 22 2010, 16:18
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Завести таймер на 5 мкс, в его прерывании делать только Код PORTC = tmpC; Flag_5us = 1; В основном цикле Код uint24_t ch1_cnt, ..., ch8_cnt; // uint24_t придумать, для счётчиков при 0.1 Гц и 5 мкс нужен 21 бит // с uint32_t будут лишние считания if(Flag_5us) { if(!--ch1_cnt) { tmpC ^= 1; ch1_cnt = (tmpC & 1)? ch1_high_time: ch1_low_time; } if(!--ch2_cnt) { tmpC ^= 2; ch2_cnt = (tmpC & 2)? ch2_high_time: ch2_low_time; } ... if(!--ch8_cnt) { tmpC ^= 128; ch8_cnt = (tmpC & 128)? ch8_high_time: ch8_low_time; } Flag_5us = 0; } Но в 5 мкс (100 тактов на 20 МГц) if(Flag_5us) {...} всё равно не уложится, так что урезайте осетра по разрешению.
|
|
|
|
|
Jun 23 2010, 18:26
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(xemul @ Jun 22 2010, 20:18)  uint24_t ch1_cnt, ..., ch8_cnt; // uint24_t придумать, для счётчиков при 0.1 Гц и 5 мкс нужен 21 бит это тока АСМ Цитата Но в 5 мкс (100 тактов на 20 МГц) if(Flag_5us) {...} всё равно не уложится, так что урезайте осетра по разрешению. А мне вот кажется что на АСМ такое можно изобразить, при этом осетра нужно урезать только в части возможности менять времена Ton Toff не на каждом цикле. Ну и конечно все 8 каналов за 5мкс считать невозможно, нужно буферирование на 16 тиков по 5мкс и рассчет не более 2х каналов за прерывание/тик.
|
|
|
|
|
Jun 24 2010, 14:33
|
Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586

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