Может кто-нибудь сталкивался: есть тестовая программка написанная на C (IAR) для ATmega8, которая включает прерывание INT0, генерирует его программно и обрабатывает. В AVR Studio симуляция проходит успешно: ручное изменения значения PIND PD2 приводит к прерыванию, также нормально работает программная генерация прерывания. При симуляции в Proteus ни один из вариантов не работает (даже не становится на бряке в обработчике прерывания). Все настройки контроллера установлены по дефолту, копание в них ни к чему не привело. :-( В чем может быть проблема?
Исходный код:
#include <ioavr.h> #include <inavr.h>
#include <avr_macros.h>
int main() { int a; CLEARBIT(DDRD, PD2); // INT0 as input MCUCR = 0x01; // INT0 at any change of signal level SETBIT(GICR, INT0); // INT0 enabled SETBIT(SREG, 7); // interrupts are enabled __enable_interrupt(); SETBIT(DDRD, PD7); // PD7 as output CLEARBIT(PORTD, PD7); if (!TESTBIT(PORTD, PD7)) SETBIT(PORTD, PD7); while(true) { a++; if (a == 0) { SETBIT(DDRD, PD2); // PD2 (INT0) as output SETBIT(PORTD, PD2); CLEARBIT(PORTD, PD2); CLEARBIT(DDRD, PD2); // PD2 (INT0) as input } } return 0; }
#pragma vector = INT0_vect __interrupt void Int0(void) { CLEARBIT(GIFR, INTF0); PORTD ^= (0x01 << PD7); }
|