Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
W tym rozdziale opisane są zasady obsługi przerwań w mikrokontrolerze ATtiny2313/3413. Ogólne wyjaśnienie sposobu obsługi przerwań na platformie AVR znajdziesz w rozdziale "Reset i obsługa przerwań".
Poniższa tabela opisuje wektory przerwań (ang. Interrupt Vectors) dostępne w mikrokontrolerze ATtiny2313A/4313:
Numer wektora | Adres programu | Źródło | Definicja przerwania |
1 | 0x0000 | RESET | Końcówka zewnętrzna, Reset przy uruchamianiu, Reset przy spadku VCC, Reset od licznika zegarowego |
2 | 0x0001 | INT0 | Żądanie przerwania zewnętrznego 0 |
3 | 0x0002 | INT1 | Żądanie przerwania zewnętrznego 1 |
4 | 0x0003 | TIMER1_CAPT | Zdarzenie Capture (zapamiętanie stanu licznika) w timerze/liczniku 1 |
5 | 0x0004 | TIMER1_COMPA | Zdarzenie Compare Match A (zgodność porównania) w timerze/liczniku 1 |
6 | 0x0005 | TIMER1_OVF | Przepełnienie w timerze/liczniku 1 |
7 | 0x0006 | TIMER0_OVF | Przepełnienie w timerze/liczniku 0 |
8 | 0x0007 | USART0_RX | USART0, zakończenie odbioru danych |
9 | 0x0008 | USART0_UDRE | USART0, rejestr danych pusty |
10 | 0x0009 | USART0_TX | USART0, zakończenie wysyłania danych |
11 | 0x000A | ANALOG_COMP | Komparator analogowy |
12 | 0x000B | PCINT0 | Przerwanie 0 od zmiany stanu logicznego końcówki |
13 | 0x000C | TIMER1_COMPB | Zdarzenie Compare Match B (zgodność porównania) w timerze/liczniku 1 |
14 | 0x000D | TIMER0_COMPA | Zdarzenie Compare Match A (zgodność porównania) w timerze/liczniku 0 |
15 | 0x000E | TIMER0_COMPB | Zdarzenie Compare Match B (zgodność porównania) w timerze/liczniku 0 |
16 | 0x000F | USI_START | Stan START dla USI |
17 | 0x0010 | USI_OVERFLOW | Przepełnienie USI |
18 | 0x0011 | EE_READY | Gotowość pamięci EEPROM |
19 | 0x0012 | WDT_OVERFLOW | Upływ okresu zliczania licznika zegarowego |
20 | 0x0013 | PCINT1 | Przerwanie 1 od zmiany stanu logicznego końcówki |
21 | 0x0014 | PCINT2 | Przerwanie 2 od zmiany stanu logicznego końcówki |
Jeśli program nigdy nie uaktywnia żadnego źródła przerwań, to wektory przerwań nie są używane i zajmowany przez nie obszar pamięci można wykorzystać na instrukcje normalnego programu.
Najbardziej typowe i ogólne ustawienie wektorów resetu oraz przerwań w ATtiny2313A/4313 wygląda następująco:
Adres Etykiety Kod Komentarze 0x0000 rjmp RESET ; Obsługa RESET 0x0001 rjmp INT0 ; Obsługa przerwania zewnętrznego 0 0x0002 rjmp INT1 ; Obsługa przerwania zewnętrznego 1 0x0003 rjmp TIM1_CAPT ; Obsługa zdarzenia Capture w timerze 1 0x0004 rjmp TIM1_COMPA ; Obsługa zdarzenia zgodności porównania A w timerze 1 0x0005 rjmp TIM1_OVF ; Obsługa przepełnienia w timerze 1 0x0006 rjmp TIM0_OVF ; Obsługa przepełnienia w timerze 0 0x0007 rjmp USART0_RXC ; Obsługa zakończenia odczytu w USART 0 0x0008 rjmp USART0_DRE ; Obsługa pustego rejestru danych w USART 0 0x0009 rjmp USART0_TXC ; Obsługa zakończenia wysyłania w USART 0 0x000A rjmp ANA_COMP ; Obsługa przerwania z komparatora analogowego 0x000B rjmp PCINT0 ; Obsługa przerwania 0 od zmiany stanu końcówki 0x000C rjmp TIMER1_COMPB ; Obsługa zdarzenia zgodności porównania A w timerze 1 0x000D rjmp TIMER0_COMPA ; Obsługa zdarzenia zgodności porównania A w timerze 0 0x000E rjmp TIMER0_COMPB ; Obsługa zdarzenia zgodności porównania B w timerze 0 0x000F rjmp USI_START ; Obsługa startu USI 0x0010 rjmp USI_OVERFLOW ; Obsługa przepełnienia USI 0x0011 rjmp EE_READY ; Obsługa gotowości EEPROM 0x0012 rjmp WDT_OVERFLOW ; Obsługa przepełnienia w liczniku zegarowym 0x0013 rjmp PCINT1 ; Obsługa przerwania 1 od zmiany stanu końcówki 0x0014 rjmp PCINT2 ; Obsługa przerwania 2 od zmiany stanu końcówki ; 0x0015 RESET: ldi r16, low(RAMEND) ; Start programu głównego 0x0016 out SPL,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x0017 sei ; Uaktywnij przerwania 0x0018 <instr> xxx ... ... ... ... |
Przerwania zewnętrzne są wyzwalane przez końcówkę INT0 lub INT1 albo przez końcówki PCINT17...0. Zwróć uwagę, że uaktywnione przerwania będą wyzwalane, nawet jeśli końcówki INT0, INT1 lub PCINT17...0 zostały skonfigurowane jako wyjścia. Ta cecha daje możliwość generowania przerwań programowych. Przerwanie 0 PCI0 przy zmianie stanu końcówki będzie wyzwalane, jeśli stan logiczny uaktywnionych końcówek PCINT7...0 zmieni się na przeciwny. Przerwanie 1 PCI1 przy zmianie stanu końcówki wyzwoli się, jeśli stan logiczny uaktywnionych końcówek PCINT10...8 zmieni się na przeciwny. Przerwanie 2 PCI2 przy zmianie stanu końcówki wyzwoli się, jeśli stan logiczny uaktywnionych końcówek PCINT17...11 zmieni się na przeciwny. Rejestry PCMSK0, PCMSK1 i PCMSK2 kontrolują, które z końcówek przyczynią się do przerwań przy zmianie stanu. Przerwania przy zmianie stanu od końcówek PCINT17..0 są wykrywane asynchronicznie, co oznacza, iż te przerwania mogą być użyte do wybudzania mikrokontrolera również z trybów uśpienia innych od trybu bezczynności.
Przerwania INT0 i INT1 mogą być wyzwalane przez opadające lub narastające zbocze oraz niski poziom. Ustawiane jest to zgodnie z informacją podaną w opisie rejestru MCUCR. Gdy przerwanie INT0 lub INT1 zostało włączone i skonfigurowane jako wyzwalane poziomem, to będzie wyzwalane tak długo, jak jego końcówka jest utrzymywana w stanie niskim. Zauważ, iż rozpoznanie przerwań od zbocza opadającego lub narastającego na końcówkach INT0 i INT1 wymaga obecności zegara we/wy.
Przerwania przy niskim poziomie na końcówce INT0 lub INT1 jest wykrywane asynchronicznie, co oznacza, iż źródło przerwania może być użyte do wybudzania mikrokontrolera również z trybów uśpienia innych od trybu bezczynności (zegar we/wy jest zatrzymywany we wszystkich trybach uśpienia z wyjątkiem trybu bezczynności).
Zauważ. iż jeśli do wybudzania z trybu wyłączenia używane jest przerwanie wyzwalane poziomem, to poziom ten musi być utrzymany dostatecznie długo, aby mikrokontroler zakończył wybudzanie i uruchomił przerwanie od poziomu. Jeśli poziom zaniknie przed końcem czasu startu, to mikrokontroler wciąż się wybudzi, ale żadne przerwanie nie zostanie wygenerowane. Czas startu definiowany jest przez bity bezpiecznikowe SUT i CKSEL, zobacz do rozdziału "Zegar systemowy i opcje zegarowe".
Jeśli niski poziom na końcówce przerwania zostanie usunięty zanim mikrokontroler się wybudzi, to wykonanie programu nie będzie skierowane do procedury obsługi przerwania, lecz rozpocznie się od instrukcji umieszczonej za rozkazem SLEEP.
Przykład synchronizacji w czasie przerwania od zmiany stanu końcówki pokazuje poniższy rysunek:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x35 (0x55) | PUD | SM1 | SE | SM0 | ISC11 | ISC10 | ISC01 | ISC00 | MCUCR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Przerwanie zewnętrzne 1 zostaje uaktywnione przez zewnętrzną końcówkę INT1, jeśli są ustawione bit I w rejestrze stanu SREG oraz odpowiedni bit w masce przerwań. Poziom i zbocza sygnału na końcówce INT1 aktywujące przerwanie są zdefiniowane w poniższej tabeli. Wartość sygnału na końcówce INT1 jest próbkowana przed wykrywaniem zboczy. Jeśli zostało wybrane przerwanie od zbocza lub zmiany stanu, to impulsy, które trwają dłużej od jednego taktu zegara wygenerują przerwanie. Jeśli wybrano przerwanie od niskiego poziomu, to poziom ten musi być utrzymany aż do zakończenia bieżąco wykonywanej instrukcji, aby zostało wygenerowane przerwanie.
ISC11 | ISC10 | Opis |
0 | 0 | Niski poziom na końcówce INT1 wygeneruje żądanie przerwania. |
0 | 1 | Każda zmiana poziomu logicznego na końcówce INT1 wygeneruje żądanie przerwania. |
1 | 0 | Opadające zbocze sygnału na końcówce INT1 wygeneruje żądanie przerwania. |
1 | 1 | Narastające zbocze sygnału na końcówce INT1 wygeneruje żądanie przerwania. |
Przerwanie zewnętrzne 0 zostaje uaktywnione przez zewnętrzną końcówkę INT0, jeśli są ustawione bit I w rejestrze stanu SREG oraz odpowiedni bit w masce przerwań. Poziom i zbocza sygnału na końcówce INT0 aktywujące przerwanie są zdefiniowane w poniższej tabeli. Wartość sygnału na końcówce INT0 jest próbkowana przed wykrywaniem zboczy. Jeśli zostało wybrane przerwanie od zbocza lub zmiany stanu, to impulsy, które trwają dłużej od jednego taktu zegara wygenerują przerwanie. Jeśli wybrano przerwanie od niskiego poziomu, to poziom ten musi być utrzymany aż do zakończenia bieżąco wykonywanej instrukcji, aby zostało wygenerowane przerwanie.
ISC01 | ISC00 | Opis |
0 | 0 | Niski poziom na końcówce INT0 wygeneruje żądanie przerwania. |
0 | 1 | Każda zmiana poziomu logicznego na końcówce INT0 wygeneruje żądanie przerwania. |
1 | 0 | Opadające zbocze sygnału na końcówce INT0 wygeneruje żądanie przerwania. |
1 | 1 | Narastające zbocze sygnału na końcówce INT0 wygeneruje żądanie przerwania. |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3B (0x5B) | INT1 | INT0 | PCIE0 | PCIE2 | PCIE1 | – | – | – | GIMSK |
Zapis/Odczyt | O/Z | Z/O | Z/O | Z/O | Z/O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Gdy są ustawione na 1 bit INT1 oraz bit I w rejestrze stanu (SREG), to uaktywnione jest generowanie przerwań z końcówki zewnętrznej INT1. Bity ISC11 i ISC10 w rejestrze MCUCR określają sposób generacji przerwania (narastające/opadające zbocze, zmiana stanu lub poziom niski na końcówce). Wybrane zdarzenie na końcówce spowoduje wygenerowanie przerwania, nawet jeśli końcówka ta została skonfigurowana jako wyjście. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania INT1.
Gdy są ustawione na 1 bit INT0 oraz bit I w rejestrze stanu (SREG), to uaktywnione jest generowanie przerwań z końcówki zewnętrznej INT0. Bity ISC01 i ISC00 w rejestrze MCUCR określają sposób generacji przerwania (narastające/opadające zbocze, zmiana stanu lub poziom niski na końcówce). Wybrane zdarzenie na końcówce spowoduje wygenerowanie przerwania, nawet jeśli końcówka ta została skonfigurowana jako wyjście. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania INT0.
Gdy są ustawione na 1 bit PCIE0 oraz bit I w rejestrze stanu (SREG), to uaktywnione jest generowanie przerwań 0 od zmiany stanu końcówek. Jakakolwiek zmiana na uaktywnionych końcówkach PCINT7...0 spowoduje wygenerowanie przerwania. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania PCI0. Końcówki PCINT7...0 są uaktywniane indywidualnie w rejestrze PCMSK0.
Gdy są ustawione na 1 bit PCIE2 oraz bit I w rejestrze stanu (SREG), to uaktywnione jest generowanie przerwań 2 od zmiany stanu końcówek. Jakakolwiek zmiana na uaktywnionych końcówkach PCINT17...11 spowoduje wygenerowanie przerwania. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania PCI2. Końcówki PCINT17...11 są uaktywniane indywidualnie w rejestrze PCMSK2.
Gdy są ustawione na 1 bit PCIE1 oraz bit I w rejestrze stanu (SREG), to uaktywnione jest generowanie przerwań 1 od zmiany stanu końcówek. Jakakolwiek zmiana na uaktywnionych końcówkach PCINT10...8 spowoduje wygenerowanie przerwania. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania PCI1. Końcówki PCINT10...8 są uaktywniane indywidualnie w rejestrze PCMSK1.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3A (0x5A) | INTF1 | INTF0 | PCIF0 | PCIF2 | PCIF1 | – | – | – | GIFR |
Zapis/Odczyt | O/Z | Z/O | Z/O | Z/O | Z/O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Gdy zbocze lub zmiana stanu logicznego na końcówce INT1 wyzwoli żądanie przerwania, ustawiany jest znacznik INTF1. Jeśli są ustawione bit I w rejestrze SREG oraz bit INT1 w rejestrze GIMSK, to mikrokontroler skoczy do odpowiedniego wektora przerwań. Znacznik jest zerowany przy wykonaniu procedury obsługi przerwania. Alternatywnie można go wyzerować przez zapisanie go bitem 1. Znacznik ten jest zawsze zerowany przy skonfigurowaniu INT1 jako przerwanie od poziomu.
Gdy zbocze lub zmiana stanu logicznego na końcówce INT0 wyzwoli żądanie przerwania, ustawiany jest znacznik INTF0. Jeśli są ustawione bit I w rejestrze SREG oraz bit INT0 w rejestrze GIMSK, to mikrokontroler skoczy do odpowiedniego wektora przerwań. Znacznik jest zerowany przy wykonaniu procedury obsługi przerwania. Alternatywnie można go wyzerować przez zapisanie go bitem 1. Znacznik ten jest zawsze zerowany przy skonfigurowaniu INT0 jako przerwanie od poziomu.
Gdy zmiana stanu logicznego na dowolnej końcówce PCINT7...0 wygeneruje żądanie przerwania, zostaje ustawiony znacznik PCIF0. Jeśli są ustawione bit I w rejestrze SREG oraz bit PCIE0 w GIMSK, to mikrokontroler skoczy do odpowiedniego wektora przerwań. Znacznik jest zerowany przy wykonaniu procedury obsługi przerwania. Alternatywnie można go wyzerować przez zapisanie go bitem 1.
Gdy zmiana stanu logicznego na dowolnej końcówce PCINT17...11 wygeneruje żądanie przerwania, zostaje ustawiony znacznik PCIF2. Jeśli są ustawione bit I w rejestrze SREG oraz bit PCIE2 w GIMSK, to mikrokontroler skoczy do odpowiedniego wektora przerwań. Znacznik jest zerowany przy wykonaniu procedury obsługi przerwania. Alternatywnie można go wyzerować przez zapisanie go bitem 1.
Gdy zmiana stanu logicznego na dowolnej końcówce PCINT10...8 wygeneruje żądanie przerwania, zostaje ustawiony znacznik PCIF1. Jeśli są ustawione bit I w rejestrze SREG oraz bit PCIE1 w GIMSK, to mikrokontroler skoczy do odpowiedniego wektora przerwań. Znacznik jest zerowany przy wykonaniu procedury obsługi przerwania. Alternatywnie można go wyzerować przez zapisanie go bitem 1.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x05 (0x25) | - | PCINT17 | PCINT16 | PCINT15 | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCMSK2 |
Zapis/Odczyt | O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Ten bit jest zarezerwowany i przy odczycie daje wartość 0.
Każdy z bitów PCINT17...11 uaktywnia generowanie przerwań od zmiany stanu logicznego na odpowiadającej mu końcówce we/wy. Jeśli są ustawione bit PCINT17...11 oraz bit PCIE2 w GIMSK, to zostaję uaktywnione przerwanie od zmiany stanu końcówki na odpowiedniej końcówce we/wy. Jeśli bit PCINT17...11 jest wyzerowany, to przerwanie od zmiany stanu na odpowiadającej mu końcówce we/wy zostanie wyłączone.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x04 (0x24) | - | - | - | - | - | PCINT10 | PCINT9 | PCINT8 | PCMSK1 |
Zapis/Odczyt | O | O | O | O | O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i przy odczycie dają wartość 0.
Każdy z bitów PCINT10...8 uaktywnia generowanie przerwań od zmiany stanu logicznego na odpowiadającej mu końcówce we/wy. Jeśli są ustawione bit PCINT10...8 oraz bit PCIE1 w GIMSK, to zostaję uaktywnione przerwanie od zmiany stanu końcówki na odpowiedniej końcówce we/wy. Jeśli bit PCINT10...8 jest wyzerowany, to przerwanie od zmiany stanu na odpowiadającej mu końcówce we/wy zostanie wyłączone.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x20 (0x40) | PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 | PCMSK0 |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Każdy z bitów PCINT7...0 uaktywnia generowanie przerwań od zmiany stanu logicznego na odpowiadającej mu końcówce we/wy. Jeśli są ustawione bit PCINT7...0 oraz bit PCIE0 w GIMSK, to zostaję uaktywnione przerwanie od zmiany stanu końcówki na odpowiedniej końcówce we/wy. Jeśli bit PCINT7...0 jest wyzerowany, to przerwanie od zmiany stanu na odpowiadającej mu końcówce we/wy zostanie wyłączone.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.