Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не срабатывает прерывание от переполнения таймера/счетчика Т0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Яrik
В чем может быть причина не срабытывания прерывания от переполнения таймера/счетчика Т0 (ATmega8)?
На выводы PB0(ICR1) и PD4(T0) подаю меандр с частотой 1кГц.
Код
#include <mega8.h>
#include <delay.h>

unsigned long int N=0;
unsigned int Perepol_Timer1=0, Perepol_Timer0=0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
Perepol_Timer0++;

}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
unsigned char a;
unsigned int b;
a=ICR1L;
TIMSK&=0xDF;
b=ICR1H;
N=((b<<8)|a);
TIMSK&=0x00;
}


void main(void)
{


PORTB=0x00;
DDRB=0x00;


PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: T0 pin Rising Edge
TCCR0=0x07;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x24;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
}
defunct
Да у вас программа просто перестартует постоянно.
В конце main() сделайте бесконечный цикл.
Яrik
Цитата(defunct @ Aug 19 2007, 21:36) *
Да у вас программа просто перестартует постоянно.
В конце main() сделайте бесконечный цикл.

Там стоял цикл на while, это пробывал без него.
Dj.Shadow
Цитата(defunct @ Aug 19 2007, 22:36) *
Да у вас программа просто перестартует постоянно.
В конце main() сделайте бесконечный цикл.


А еще WATCHDOG запретите...
Яrik
Так я его вроде и не включал, но проверю, спасибо.

Только что проглядел таблицу векторов прерывания и мне пришла мысля: может проц не успевает обработать запрос на прерывание и пропускает его т.к. в Vmlab флаг на прерывание усианавливается в TIMSK.
Dj.Shadow
Цитата(Яrik @ Aug 20 2007, 00:17) *
Так я его вроде и не включал, но проверю, спасибо.

Ну я то ж его не включаю... но если в WMLAB трасировать, то почемуто оно считает что включено.
офф: почемуто при запуске в WMLAB 3.12 оно не воспринимает запрещение сторожевого таймера, а вот если протрасировать программу дальше запрещения сторожевого таймера, то все дальше работает нормально.
Яrik
Попробывал отключить прерывание по переполнению таймера1, так теперь прерывание от таймера0 обрабатываются. Что можно сделать для нормальной работы обоих прерываний?
defunct
Цитата(Яrik @ Aug 19 2007, 23:57) *
Что можно сделать для нормальной работы обоих прерываний?

Убрать вот эту строку

TIMSK&=0x00;
man with no name
Цитата(defunct @ Aug 20 2007, 03:25) *
Убрать вот эту строку

TIMSK&=0x00;


ага. Вместе со строкой TIMSK&=0xDF; или в конце TIMSK&=0x00; заменить на TIMSK|=0x20;
Яrik
Сделал как говорите, но всё равно прерывание не происходит.

Нашел (протупил), при инициализации МК в регистр TIMSK нужно записать 0x25, а не как у меня 0x24 (само по себе прерывание по переполнению таймера/счетчика Т0 было запрещенно).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.