/*******************************************************************
Title: Использование внешнего прерывания
Сopyright: myROBOT, http://myrobot.ru
Date: Ноябрь 2006
Software: AVR-GCC (WinAVR)
Hardware: ATmega8, 8 MHz
Description:
Пример демонстрирует использование внешнего прерывания.
В момент нажатия кнопки, вызывается внешнее прерывание INT0,
которое реализует выключение светодиода на 1 сек.
Кнопка подключается к выводу PD2 и отрицательному полюсу
источника питания. Светодиод подключается к выводу PD1
и отрицательному полюсу источника питания.
*******************************************************************/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
//////////////////////////////////////////////////////////////////
// Раздел функций
//////////////////////////////////////////////////////////////////
// Функция задержки. Минимальная задержка с кварцем 8MHz, равна 1 ms
void delay_ms2(unsigned short ms)
{
unsigned short i, j, k;
for (i=0; i<ms; i++) /*цикл формирования временной задержки*/
for(j=0; j<185;j++) /* вложенный цикл */
k++; /* произвольное действие */
}
// signal handler для внешнего прерывания int0
SIGNAL(SIG_INTERRUPT0)
{
PORTD &= ~_BV(PD1); // Сбросить бит PD1 в "0" = 0V,
// светодиод выключен , pin=0V
delay_ms2(1000); // Ждем 1 сек.
PORTD |= _BV(PD1); // Установить бит PD1 в "1" = 5V,
// светодиод включен, pin=1V
}
//////////////////////////////////////////////////////////////////
// ОСНОВНАЯ ПРОГРАММА
//////////////////////////////////////////////////////////////////
int main(void)
{
DDRD |= 1<<1; // вывод 1 порта D работает на вывод
PORTD |= _BV(PD1); // инициализировать начальное состояние,
// установить бит PD1 в "1"
DDRD &= ~(0<<2); // вывод 2 порта D работает на ввод
PORTD |= _BV(PD2); // активизировать подтягивающий резистор
GIMSK = 1<<INT0; // разрешить внешнее прерывание Int0
MCUCR = 1<<ISC01; // сигнал низкого уровня на Int0 вызовет
// внешнее прерывание
sei(); // разрешить прерывания
for (;;) { } // бесконечный цикл
}