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

 
 
> Затраты на обработку прерывания по переполнению таймера.
zheka
сообщение Jan 21 2010, 18:11
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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;


Что делать и кто виноват?

У кого нибьудь есть опыт написания таких программ, когда приходилось несколько циклов переполнения таймера складывать. Как-нибудь компенсировали время, затрачиваемое на обработку прерывания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zheka
сообщение Jan 25 2010, 13:59
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Камень ATMega32.

Вот, господа, упростил до безобразия:
По прерыванию INT0 сразу запоминаю значение TCNT0 и количество переполнений таймера0 (всего-то 256 тиков, вдруг чего...) Затем обнуляю таймер: если импульс первый, то начинаем жихнь с чистого листа, если второй, то пофиг, мы то уже запомнили его значение. Далее, чтобы свести к минмимуму влияние вывода на LCD на время, проверяю, первый ли импусьс? Если первый, то обнуляю счетчик переполнений и сбрасываю флаг "первого импульса", дабы при следующем срабатывании он считался вторым.

Код
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{

a=TCNT0;  
b=OVF_count;
TCNT0=0x00;


if (!first_pulse)
{

// time=((OVF_count*256+a)/16);
lcd_clear();
lcd_gotoxy(1,0);
sprintf(s,"%u", b);
lcd_puts(s);        
lcd_gotoxy(1,1);
sprintf(s,"%u", a);
lcd_puts(s);        
OVF_count=0;
first_pulse=1;
TCNT0=0x00;
}
else
{
   first_pulse=0;
   OVF_count=0;
}


}


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
OVF_count++;
}



Генерирую импульсы с периодом 1024 мкс. По идее таймер должен переполниться 64 раза на частоте 16 МГц. Показывает 80. Ну да ладно. Далее - запускаю таймер1. События на нем не обрабатываются, да и вообще, прерывания с него запрещены: TIMSK=0b00000001; Тем не менее, когда я его запускаю:
Код
/ Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x80;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x4E;
ICR1L=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


на экран выводится число переполнений 1248. Если упрощаю поведение таймера : TCCR1A=0x00;TCCR1B=0x01;, то ничего такого нет, показывает 80.
Господа, мысли кончились. Почему таймеры не уживаются?

кстати, чем больше делитель TIMER1, тем больше улетает величина OVF_count. Если ее не делить, то показывает 96.



А уж если включаю TOIE1, то контроллер начинает ресетиться.

В TIFR при проверке все время висит 0x3F.

Сообщение отредактировал zheka - Jan 25 2010, 13:39
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 25 2010, 15:49
Сообщение #3


Гуру
******

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



Цитата(zheka @ Jan 25 2010, 16:59) *
Почему таймеры не уживаются?
Вы предлагаете погадать? Ну, например, разрешены прерывания от таймера 1, а процедура обработки прерывания не написана. При прерываниях от таймера 1 МК попадает на вектора 7-10, но там не команды перехода. МК добирается до векторов таймера 0 (на вектор 12, например), и благополучно попадает на функцию обработки его (таймера 0) прерывания по переполнению...

Совет: выбросить вывод на LCD из обработчика прерывания таймера: поставьте взведение флага вывода в прерывании - перенесите сам вывод в main во внутрь бесконечного цикла с проверкой флага.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - fantex   Вот пример реализации измерения частоты импульсов ...   Jan 25 2010, 11:38
- - zheka   Fantex, спасибо, но, с алгоритмом я разобрался, у ...   Jan 25 2010, 12:44
|- - ILYAUL   Цитата(zheka @ Jan 25 2010, 15:44) ... ре...   Jan 25 2010, 13:26
- - zheka   Палыч, вообще-то прерывания тапймера1 запрещены. П...   Jan 25 2010, 16:00
|- - Палыч   Цитата(zheka @ Jan 25 2010, 19:00) вообще...   Jan 25 2010, 16:19
- - zheka   Палыч, однако спасибо Вам. Вынес все наружу. Все з...   Jan 25 2010, 17:32


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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 08:20
Рейтинг@Mail.ru


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