Рядовой
Сообщений всего: 3
Дата рег-ции: Апр. 2010
|
Вот могу привести пример моей программы с прерыванием, думаю вы поймете ее структуру.
*******************************************************************/
#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 (; { } // бесконечный цикл
} |