|
Затраты на обработку прерывания по переполнению таймера. |
|
|
|
Jan 21 2010, 18:11
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, пишу программку для подсчета периода импульсов. Могу применять только 8-битный таймер, ибо 16-ти битный таймер занят. Всвязи с тем что переполнение его наступает через каждые 256 тактов, их приходится точно просчитывать. Вот такой вот код: Код interrupt [TIM0_OVF] void timer0_ovf_isr(void) { //tacts++; a=TCNT0; TCCR0=0x00; lcd_gotoxy(0,0); lcd_putsf(" ");
lcd_gotoxy(0,0); sprintf(s," %i", a); lcd_puts(s);
TCCR0=0x01;
} То есть сразу по прерывания по переполнения таймер по идее должен сбрасываться. В самом начале обработчика значение TCNT0 записывается в переменную a. И ее значение выводится на экран. Так вот в данном случае оно равно 32 или 33 (в зависимости от фазы луны и того, чем я похмелялся )))) ). Что контроллер делает эти 32 такта? ПРичем 32 такта выдается хоть при 16 000 кГц, хоть при делении на 8 (2000 кГц). Инициализирую таймер так: Код // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x01; TCNT0=0x00; OCR0=0x00; Что делать и кто виноват? У кого нибьудь есть опыт написания таких программ, когда приходилось несколько циклов переполнения таймера складывать. Как-нибудь компенсировали время, затрачиваемое на обработку прерывания?
|
|
|
|
|
 |
Ответов
|
Jan 25 2010, 11:38
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480

|
Вот пример реализации измерения частоты импульсов на CPU188-MX5. Основная идея способа - считать количество импульсов и время между передними фронтами импульсов. Если время между фронтами превышает заданное (в данном случае 3 секунды), то полученые значения кол-ва импульсов и время между фронтами копируется в соответствующие переменные, из которых внешняя функция вычисляет уже частоту импульсов. CODE //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
namespace FI { word timeMS = -1; word freqCount = 0;
void __declspec(naked) interrupt IntHandler(); };
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void __declspec(naked) interrupt FI::IntHandler() { static word sMS = 0; static word count = 0;
__asm { push ax // 14 push dx // 14 push ds // 13
mov ax, seg millisecondsCount // 4 mov ds, ax // 2
inc [count] // 19 mov ax, [word ptr millisecondsCount] // 2 mov dx, [sMS] // 2 sub ax, dx // 3 cmp ax, 3000 // 3
jnc loc2 // 4, 13
locret:
pop ds pop dx pop ax iret
loc2:
add dx, ax
mov [byte ptr sMS], dl // 2 mov [byte ptr sMS+1], dh // 2 mov [byte ptr timeMS], al // 2 mov [byte ptr timeMS+1], ah // 2
mov al, [byte ptr count] // 2 mov ah, [byte ptr count+1] // 2
mov [byte ptr freqCount], al // 2 mov [byte ptr freqCount+1], ah // 2
xor al, al // 3 mov [byte ptr count], al // 2 mov [byte ptr count+1], al // 2
pop ds // 12 pop dx // 14 pop ax // 14 iret // 28
} }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
float FI::GetFreq() { TRACE float f1; float f2; _cli(); f1 = FI::freqCount; f2 = FI::timeMS; FI::freqCount = 0; FI::timeMS = -1;
_sti();
return 1000.0 * f1 / f2; }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Сообщение отредактировал fantex - Jan 25 2010, 11:39
|
|
|
|
Сообщений в этой теме
zheka Затраты на обработку прерывания по переполнению таймера. Jan 21 2010, 18:11 Goodefine Цитата(zheka @ Jan 21 2010, 22:11) ...Всв... Jan 21 2010, 18:34 zheka Господи, ну читайте же внимательно мой код. Или ук... Jan 21 2010, 18:37 rezident Цитата(zheka @ Jan 21 2010, 23:11) Что ко... Jan 21 2010, 18:37 zheka КодА листинг ассемблера посмотреть не догадались?
... Jan 21 2010, 18:52 defunct Цитата(zheka @ Jan 21 2010, 20:52) Никак ... Jan 21 2010, 19:14 rezident Цитата(zheka @ Jan 21 2010, 23:52) К сожа... Jan 21 2010, 19:07 zheka Господа, я в принципе только сейчас понял: вывод н... Jan 22 2010, 03:54 _Pasha Цитата(zheka @ Jan 22 2010, 07:54) на каж... Jan 22 2010, 04:54 Александр Куличок ЦитатаДлительность от 500 мкс до 1 сек. Точность -... Jan 22 2010, 06:15 fantex ЦитатаОпять таки-чисто практический вопрос - имея ... Jan 22 2010, 09:09 rezident Цитата(fantex @ Jan 22 2010, 14:09) При п... Jan 22 2010, 09:59 fantex Тогда какой смысл измерять с таким разрешением (0.... Jan 22 2010, 10:41 zheka ЦитатаПри периоде импульсов 1 сек, получается точн... Jan 22 2010, 11:37 _Pasha Если точность 1 клок, то Вам без input capture не ... Jan 22 2010, 12:40 zheka Все господа.... мысли кончились. Не гонясь за точн... Jan 22 2010, 14:39 Палыч Цитата(zheka @ Jan 22 2010, 17:39) Вот ко... Jan 22 2010, 15:36 zheka Хм.. а вот тут уже незнание мной матчасти, вопрос ... Jan 22 2010, 19:14 Александр Куличок ЦитатаTimer1 в режиме PWM настроен на период 20 мс... Jan 22 2010, 21:10 Палыч Цитата(Александр Куличок @ Jan 23 2010, 00... Jan 23 2010, 07:38 zheka ЦитатаА почему не используете одно из прерываний т... Jan 24 2010, 11:05 _Pasha Цитата(zheka @ Jan 24 2010, 15:05) PWM пе... Jan 24 2010, 13:11 zheka Дискретность? думаю, что той что обеспечит 8-битны... Jan 24 2010, 14:56 zheka В общем, конфликтуют у меня два таймера. Переделал... Jan 24 2010, 18:50 zheka Fantex, спасибо, но, с алгоритмом я разобрался, у ... Jan 25 2010, 12:44 ILYAUL Цитата(zheka @ Jan 25 2010, 15:44) ... ре... Jan 25 2010, 13:26 zheka Камень ATMega32.
Вот, господа, упростил до безобр... Jan 25 2010, 13:59 Палыч Цитата(zheka @ Jan 25 2010, 16:59) Почему... Jan 25 2010, 15:49 zheka Палыч, вообще-то прерывания тапймера1 запрещены. П... Jan 25 2010, 16:00 Палыч Цитата(zheka @ Jan 25 2010, 19:00) вообще... Jan 25 2010, 16:19 zheka Палыч, однако спасибо Вам. Вынес все наружу. Все з... Jan 25 2010, 17:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|