Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny2313A/4313

Przerwania

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

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ń".

Wektory przerwań w ATtiny2313A/4313

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
 ...   ...      ... ...
Na początek:  podrozdziału   strony 

Przerwania zewnętrzne

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.

Przerwanie od niskiego poziomu

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.

Przebiegi czasowe dla przerwania od zmiany stanu

Przykład synchronizacji w czasie przerwania od zmiany stanu końcówki pokazuje poniższy rysunek:

obrazek

Na początek:  podrozdziału   strony 

Opis rejestrów

MCUCR – MCU Control Register – Rejestr sterujący mikrokontrolerem

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  

Bity 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0 – Bity wybierające sposób generowania przerwania INT1

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.

Bity 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0 – Bity wybierające sposób generowania przerwania INT0

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.

GIMSK – General Interrupt Mask Register – Rejestr maski przerwań ogólnych

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  

Bit 7 – INT1: External Interrupt Request 1 Enable – Uaktywnienie żądań przerwań zewnętrznych 1

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.

 Bit 6 – INT0: External Interrupt Request 1 Enable – Uaktywnienie żądań przerwań zewnętrznych 0

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.

Bit 5 – PCIE0: Pin Change Interrupt Enable 0 – Uaktywnienie przerwań 0 od zmiany stanu końcówki

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.

Bit 4 – PCIE2: Pin Change Interrupt Enable 2 – Uaktywnienie przerwań 2 od zmiany stanu końcówki

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.

Bit 3 – PCIE1: Pin Change Interrupt Enable 1 – Uaktywnienie przerwań 1 od zmiany stanu końcówki

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.


GIFR – General Interrupt Flag Register – Ogólny Rejestr znaczników przerwań

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  

Bit 7 – INTF1: External Interrupt Flag 1 – Znacznik przerwania zewnętrznego 1

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.

Bit 6 – INTF0: External Interrupt Flag 0 – Znacznik przerwania zewnętrznego 0

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.

Bit 5 – PCIF0: Pin Change Interrupt Flag 0 – Znacznik 0 przerwania od zmiany stanu końcówki

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.

Bit 4 – PCIF2: Pin Change Interrupt Flag 2 – Znacznik 2 przerwania od zmiany stanu końcówki

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.

Bit 3 – PCIF1: Pin Change Interrupt Flag 1 – Znacznik 1 przerwania od zmiany stanu końcówki

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.


PCMSK2 – Pin Change Mask Register 2 – Rejestr 2 maski przerwań od zmiany stanu końcówki

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  

Bit 7 – Zarezerwowany

Ten bit jest zarezerwowany i przy odczycie daje wartość 0.

Bity 6...0 – PCINT17...11: Pin Change Enable Mask 17..11 – Maska uaktywniania przerwań od zmiany stanu końcówek

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.


PCMSK1 – Pin Change Mask Register 1 – Rejestr 1 maski przerwań od zmiany stanu końcówki

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  

Bity 7...3 – Zarezerwowane

Te bity są zarezerwowane i przy odczycie dają wartość 0.

Bity 2...0 – PCINT10..8: Pin Change Enable Mask 10..8 – Maska uaktywniania przerwań od zmiany stanu końcówek

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.


PCMSK0 – Pin Change Mask Register 0 – Rejestr 0 maski przerwań od zmiany stanu końcówki

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  

Bity 7...0 – PCINT7...0: Pin Change Enable Mask 7..0 – Maska uaktywniania przerwań od zmiany stanu końcówek

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.

Na początek:  podrozdziału   strony 

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.