//Обработка прерываний через порты int1 int2
#include <mega8.h>
#include <delay.h>
//Прерывание_________________________________________________________________________________________________________
interrupt(2) void ExtInt0(void); // Обработка прерываний на рорте Int0 (порт PD2, Вывод 4)
{
PORTC=0b1; delay_ms(200);
PORTC=0b10; delay_ms(200);
}
interrupt(3) void ExtInt1(void); // Обработка прерываний на рорте Int1 (порт PD3, Вывод 5)
{
PORTC=0b100000; delay_ms(200);
PORTC=0b010000; delay_ms(200);
}
//Настройка портов и регистров________________________________________________________________________
void main(void)
{
DDRC=0b1111111; //Все порты С сконфигурированы как выходы
DDRD=0b11110011; //Вне порты кроме PD2 и PD3 выходы (2 и 3 это прерывания)
delay_ms(10); // задержка нужна для зарядки антидребезгого конденсатора для правельной работы
GICR=0b11000000; /* Регистр eneral Interrupt Control Register разрешает внешнее прерывание
10 000000 - по выводу int1
01 000000 - по выводу int0
11 000000 - по всем выводам */
MCUCR=0b00001111; /* Регистр Micro Controller Unit Control Registr настраиваетпрерывания на срабатывание:
int1 int0
0000 10 10 - по спадающему фронту сигнала на выводе
0000 11 11 - по нарастающему фронту
0000 00 00 - по низкому уровню сигнала
0000 01 01 - по любому игменению уровня сигнала */
#asm("sei") // или SREG=(1<<7); Status Register разрешает общее прерывание
//Основная программа___________________________________________________________________________________________
while(1)
{
PORTC=0b1; delay_ms(50);
PORTC=0b10; delay_ms(50);
PORTC=0b100; delay_ms(50);
PORTC=0b1000; delay_ms(50);
PORTC=0b10000; delay_ms(50);
PORTC=0b0100000;delay_ms(50);
PORTC=0b10000; delay_ms(50);
PORTC=0b1000; delay_ms(50);
PORTC=0b100; delay_ms(50);
PORTC=0b10; delay_ms(50);
PORTC=0b1; delay_ms(50);
}
}