Цитата(sf9 @ Sep 22 2008, 12:44)

Если можно,выложите примеры с-кодов с функциями обработки прерываний.
Ниже пример программы, показывающий как во время выполнения программы (мигание 1-ым светодиодом) зажечь 2-ой светодиод по нажатию кнопки. Короче говоря, показан обработчик внешнего прерывания. Компилятор - avr-gcc.
Код
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t led2IsOn = 0;
int main(void)
{
uint8_t led1IsOn = 0;
// Конфигурируем порт на выход.
DDRB |= (1 << DDB6) | (1 << DDB5);
// Настраиваем порт на котором висит кнопка на вход.
DDRE &= ~(1 << DDE6);
PORTE |= (1 << PORTE6);
// Прерывание по возрастающий фронту сигнала.
EICRB = (1 << ISC61) | (1<< ISC60);
sei(); // Глобальное разрешение прерываний.
EIMSK |= (1 << INT6); // Разрешаем внешнее прерывание, заведенное на PORTE6.
// Бесконечный цикл.
while(1)
{
uint16_t i;
// Задержка.
for(i = 65535; i != 0; i--);
if(led1IsOn)
{
led1IsOn = 0;
PORTB &= ~(1 << PORTB5); // Выключаем светодиод 1.
}
else
{
led1IsOn = 1;
PORTB |= (1 << PORTB5); // Включаем светодиод 1.
}
}
}
// Обработчик прерывания.
SIGNAL(SIG_INTERRUPT6)
{
if(led2IsOn)
{
led2IsOn = 0;
PORTB &= ~(1 << PORTB6); // Выключаем светодиод 2.
}
else
{
led2IsOn = 1;
PORTB |= (1 << PORTB6); // Включаем светодиод 2.
}
}
Сообщение отредактировал mandrew - Sep 22 2008, 16:20