top of page

Przerwania

Co to są przerwania i po co ich używamy?

Są dwa typy przerwań zewnętrzne i wewnętrzne. Na zajęciach robiliśmy przerwania zewnętrzne, więc postaram się je krótko omówić.

Przerwanie jest to zdarzenie które przerywa normalny ciąg programu i zaczyna wykonywać inne instrukcje. Po wykonaniu tych instrukcji program wraca do miejsca w którym został przerwany. Jest to bardzo przydatne, gdy naszą atmege łączymy z innymi urządzeniami i w ciągu pracy tych urządzeń wymagają one natychmiastowej obsługi, np przepełniony licznik.

Zewnętrzne przerwania są wyzwalane przez piny oznaczone jako INT0, INT1 i INT2, odpowiednio: PD2, PD3 oraz PB2.

Skoro już wiemy czym są przerwania, pora przejść do kodu.

Musimy zacząć od rejestru GICR - Główny rejestr kontroli przerwań.

To tutaj ustawiając bit na 1 aktywujemy zewnętrzne przerwanie na danym porcie.

Kolejnym krokiem jest rejestr MCUCR w którym ustawiamy jakie zdarzenie ma wywołać przerwanie.

Na zajęciach wyzwalaliśmy zwarciem do masy przez przycisk, więc zostawiamy wartość tego rejestru na domyślne 0.

Czas zbudować układ:

// Miejsce na układ //

Przejdźmy do gotowego kodu ( http://pastebin.com/thNMmeei )

/* * * Created: 2016-03-29 12:30:44 * Author : Michal */

#define F_CPU 1000000 #include <avr/io.h> #include <util/delay.h> // komendy znane nam z poprzednich zajęć #include <avr/interrupt.h> // ważne jest, aby dodać bibliotekę obsługującą przerwania

Jak wygląda przykładowa operacja

int main(void) { DDRD&=~(1<<PD2); DDRD&=~(1<<PD3); // ustawienie PD2 i PD3 jako wyjście

PORTD=0xff; GICR|=(1<<INT0)|(1<<INT1); // Ustawienie bitów w rejestrach GICR, co uruchamia //zewnętrzne przerwania na pinie INT0 i INT1 sei(); // Komenda uruchamiająca przerwania DDRA=0xff; PORTA=0xff; // Wszystkie porty A zostają ustawione jako wyjścia ze stanem wysokim. while (1) { PORTA^=0x03; // Operacja XOR której efektem będzie miganie diod _delay_ms(100); }

}

ISR (INT0_vect) // Komenda wyzwalająca przerwanie z portu INT0 { PORTA^=0x08; // Operacja XOR dezaktywująca pierwszą z diod _delay_ms(100); }

ISR(INT1_vect)

{ PORTA^=0x04; _delay_ms(100); // Analogicznie do przypadku wyżej }


Wyróżnione posty
Ostatnie posty
Archiwum
Wyszukaj wg tagów
Nie ma jeszcze tagów.
Podążaj za nami
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page