Всем привет! Задолбался я уже с ним. В одной части программы работает, а после прерывания INT1 - уже не пашет. Причем даже если заново его инициализовать. В чем дело то?
Вот упрощенная часть программы:
void main(void)
{
// Crystal Oscillator division factor: 3
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Low level
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x02;
EIFR=0x02;
PCICR=0x00;
LED = 1; delay_ms(25); LED = 0; // когда контроллер спит, строж. таймер работает как надо, тому подтверждение работа этого светодиода (кратковременное моргание)
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
#pragma optsize-
#asm("wdr")
WDTCSR=0x38;
WDTCSR=0x28;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
SMCR = 0b00000101; // Power-down Mode - страница 43 мануала ATmega48
#asm("sleep"); //Вводит контроллер в режим энергосбережения
// Просыпаемся от прерыванием INT1 и сразу на обработчик
while (1)
{
LED = 1; // Вот тут строж. таймер уже не работает - светодиод постоянно светиться
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
... // что тут, не важно
}
Раздел: AVR
Вот упрощенная часть программы:
void main(void)
{
// Crystal Oscillator division factor: 3
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Low level
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x02;
EIFR=0x02;
PCICR=0x00;
LED = 1; delay_ms(25); LED = 0; // когда контроллер спит, строж. таймер работает как надо, тому подтверждение работа этого светодиода (кратковременное моргание)
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
#pragma optsize-
#asm("wdr")
WDTCSR=0x38;
WDTCSR=0x28;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
SMCR = 0b00000101; // Power-down Mode - страница 43 мануала ATmega48
#asm("sleep"); //Вводит контроллер в режим энергосбережения
// Просыпаемся от прерыванием INT1 и сразу на обработчик
while (1)
{
LED = 1; // Вот тут строж. таймер уже не работает - светодиод постоянно светиться
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
... // что тут, не важно
}
Раздел: AVR