Przerwania zewnętrzne AVR cz3
W języku C wyglądałoby to :
GICR |= (1 << INT0);
Co w tym wypadku jak i poprzednim oznacza operator '<<' ? Jest to tzw przesunięcie bitowe, które za parametr obiera liczbę o ile mamy przeunąć daną "1". Jeśli o 0, to de facto oznacza to sumę logiczną rejestru GICR z 1. Jeśli o 1 to sumę logiczną z 2, o 2 to z 4 itd. Jest to niejawne, ale należy o tym pamiętać jeśli chcemy być świadomymi kontruktorami.
Aby móc korztać z przerwań na miktrokontrolerze AVR należy dołączyć bibliotekę:
#include <avr/interrupt.h>
oraz załączyć obsługę przerwań funkcją sei: (ang. Set Interrupts – ustaw przerwania)
sei();
Po ustawieniu niezbędnych rejestrów należy jeszcze wskazać co miktrokontroler ma wykonać w ramach przerwania. Do tego służy funkcja ISR (ang. Interrupt Service Routine). Jako argument przyjmują wskazany wektor przerwań.
Dla przerwania pochodzącego z pinu INT0, wywołanie funkcji wyglądać będzie następująco:
ISR(INT0_vect) {
//obsługa przerwania
}
Zbierajć wszystko w całość program poglądowy mógłby wyglądać następująco:
#include <avr/io.h>
#inculde <avr/interrupt.h>
ISR (INT0_vect) {
PORTB ^= 1;
_delay_ms(30);
}
int main() {
GICR |= (1<<INT0);
DDRB = 1; //ustawiamy pin jako output
sei();
while(1) {
}
}
Podsumowanie:
Zastosowanie przerwań z początku wydawć się może utrudnianiem życia, dla początkujących, jednak z czasem gdy projekt nie będzie miał za zadanie tylko zaświecić diody LED, ale i wiele innych czynności w tym samym momencie okaże się, że nie będzie innego wyboru. Stosowanie przerwań także pozwala na programistyczne uporanie się z tzw. drganiami styków, czyli efektowi gdy przycisk wcinął się dwkuktotnie, choć użytkownik zrobił to tylko raz.
Proszę o komentarze, pomysły na kolejne wpisy lub pytania, chętnie podzielę się zdobytą ciężko wiedzą jak i umiejętnościami nabytymi we własnym zakresie.
Autor: Dawid Sudowski