Внешние прерываниÑ
Материал из Automata.
(Различия между версиями)
м (Полностью удалено содержимое страницы) |
м (Правки Kern (обсуждение) откачены к версии Mrsnaut) |
||
Строка 1: | Строка 1: | ||
+ | #include <stdint.h> | ||
+ | #include <avr/io.h> | ||
+ | #include <avr/interrupt.h> | ||
+ | //обработчик внешнего прерыания на выводе контроллера PD2_INT0; | ||
+ | ISR(SIG_INTERRUPT0) | ||
+ | { | ||
+ | PORTB &= 0xfe;//включаем светодиод на плате контроллера; | ||
+ | } | ||
+ | |||
+ | //обработчик внешнего прерыания на выводе контроллера PD3_INT1; | ||
+ | ISR(SIG_INTERRUPT1) | ||
+ | { | ||
+ | PORTB |= 0x01;//выключаем светодиод на плате контроллера; | ||
+ | } | ||
+ | |||
+ | //главная функция; | ||
+ | int main (void) | ||
+ | { | ||
+ | DDRB = 0xff;//порт В настраиваем на выход; | ||
+ | PORTB = 0x00;//отправляем на выводы логический "0"; | ||
+ | DDRD = 0xff;//порт D настраиваем на выход; | ||
+ | PORTD = 0x00;//отправляем на выводы логический "0"; | ||
+ | SREG = 0x80;//глобальное разрешение прерываний; | ||
+ | MCUCR = _BV(ISC11) | _BV(ISC10) | _BV(ISC01) | _BV(ISC00);//обработчики INT0 и INT1 будут запускаться при изменении | ||
+ | //состояния соответствующих выводов с логических "0" на "1"; | ||
+ | GICR = _BV(INT1) | _BV(INT0);//разрешаем внешние прерывания INT0 и INT1; | ||
+ | } |
Текущая версия
#include <stdint.h> #include <avr/io.h> #include <avr/interrupt.h>
//обработчик внешнего прерыания на выводе контроллера PD2_INT0; ISR(SIG_INTERRUPT0) { PORTB &= 0xfe;//включаем светодиод на плате контроллера; }
//обработчик внешнего прерыания на выводе контроллера PD3_INT1; ISR(SIG_INTERRUPT1) { PORTB |= 0x01;//выключаем светодиод на плате контроллера; }
//главная функция; int main (void) { DDRB = 0xff;//порт В настраиваем на выход; PORTB = 0x00;//отправляем на выводы логический "0"; DDRD = 0xff;//порт D настраиваем на выход; PORTD = 0x00;//отправляем на выводы логический "0"; SREG = 0x80;//глобальное разрешение прерываний; MCUCR = _BV(ISC11) | _BV(ISC10) | _BV(ISC01) | _BV(ISC00);//обработчики INT0 и INT1 будут запускаться при изменении //состояния соответствующих выводов с логических "0" на "1"; GICR = _BV(INT1) | _BV(INT0);//разрешаем внешние прерывания INT0 и INT1; }