Камень 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