|
Затраты на обработку прерывания по переполнению таймера. |
|
|
|
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 22 2010, 14:39
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Все господа.... мысли кончились. Не гонясь за точностью, пытаюсь сделать хоть что-то. Завел Timer0 на 16 МГц. ПО переполнению инкрементирую OVF_count - счетчик переполнений. Timer1 в режиме PWM настроен на период 20 мс, выход поступает на вход INT0, фронту импульса запускается обработчик, который умножает OVF_count на 256 , прибавляет текущее значение TCNT0, после чего делит на 16 - получаем период в микросекундах. У меня же проказывает не 20 000 мкс, а 1610 либо 1594. Вот код, где я не прав? CODE #include <mega32.h> #include <delay.h> #include <stdio.h>
#asm .equ __lcd_port=0x15;PORTC #endasm #include <lcd.h>
#define FAN PORTB.4
#define FINEUP PIND.7 #define FINEDOWN PIND.4
#define SPEED_MINUS PIND.6 #define SPEED_PLUS PIND.1
#define SPEED_MIN 0x0490 #define SPEED_MAX 0x07D0
#define SPEED OCR1A
char lcd_buffer[33]; unsigned char s[8];
unsigned int a,b;
unsigned int OVF_count;
unsigned long int time;
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { a=TCNT0; time=(OVF_count*256+a)/16; OVF_count=0; lcd_clear(); lcd_gotoxy(0,0); sprintf(s,"%u", time); lcd_puts(s);
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { OVF_count++; }
main() {
unsigned char i,j, devices; int temp;
OVF_count=0;
// 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;
// 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;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0b00000001;
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x03; MCUCSR=0x00; GIFR=0x40;
SPEED=SPEED_MIN;
DDRA=0xFF; DDRD=0x00; PORTD=0xFF;
DDRD.5=1;
DDRB.4=1; FAN=1; delay_ms(500); FAN=0;
DDRD.2=0; PORTD.2=0;
DDRD.0=0; PORTD.0=1;
lcd_init(8); lcd_clear();
#asm sei #endasm
while (1) { if (!SPEED_PLUS) { if (SPEED<SPEED_MAX) SPEED++; delay_ms(2); }
if (!SPEED_MINUS) {
if (SPEED>SPEED_MIN) SPEED--; delay_ms(2); }
}
}
Сообщение отредактировал rezident - Jan 22 2010, 15:07
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
Сообщений в этой теме
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, 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 Камень 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|