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

©2022 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny24/44/84

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

Wektory przerwań

Poniższa tabela opisuje wektory przerwań (ang. Interrupt Vectors) dostępne w mikrokontrolerze ATtiny24/44/84:

Numer wektora Adres programu Źródło Definicja przerwania
1 0x0000 RESET Końcówka zewnętrzna, Reset przy włączeniu zasilania, Reset przy spadku napięcia zasilającego, Reset od licznika zegarowego
2 0x0001 INT0 Żądanie przerwania zewnętrznego 0
3 0x0002 PCINT0 Żądanie przerwania 0 przy zmianie stanu końcówki
4 0x0003 PCINT1 Żądanie przerwania 1 przy zmianie stanu końcówki
5 0x0004 WDT Zakończony okres zliczania w timerze licznika zegarowego
6 0x0005 TIM1_CAPT Input Capture dla timera/licznika 1
7 0x0006 TIM1_COMPA Zgodność porównania A w timerze/liczniku 1
8 0x0007 TIM1_COMPB Zgodność porównania B w timerze/liczniku 1
9 0x0008 TIM1_OVF Przepełnienie timera/licznika 1
10 0x0009 TIM0_COMPA Zgodność porównania A w timerze/liczniku 0
11 0x000A TIM0_COMPB Zgodność porównania B w timerze/liczniku 0
12 0x000B TIM0_OVF Przepełnienie timera/licznika 0
13 0x000C ANA_COMP Komparator analogowy
14 0x000D ADC Zakończone przetwarzanie w przetworniku A/C
15 0x000E EE_RDY Gotowość EEPROM
16 0x000F USI_STR START USI
17 0x0010 USI_OVF Przepełnienie USI

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 ATtiny24/44/88 wygląda następująco:

Adres  Etykiety Kod                  Komentarze
0x0000          rjmp RESET           ; Sterownik Reset
0x0001          rjmp INT0            ; Sterownik IRQ0
0x0002          rjmp PCINT0          ; Sterownik PCINT0
0x0003          rjmp PCINT1          ; Sterownik PCINT1
0x0004          rjmp WDT             ; Sterownik przerwań od licznika zegarowego
0x0005          rjmp TIM1_CAPT       ; Sterownik Capture timera 1
0x0006          rjmp TIM1_COMPA      ; Sterownik porównania A timera 1
0x0007          rjmp TIM1_COMPB      ; Sterownik porównania B timera 1
0x0008          rjmp TIM1_OVF        ; Sterownik przepełnienia timera 1
0x0009          rjmp TIM0_COMPA      ; Sterownik porównania A timera 0
0x000A          rjmp TIM0_COMPB      ; Sterownik porównania B timera 0
0x000B          rjmp TIM0_OVF        ; Sterownik przepełnienia timera 0
0x000C          rjmp ANA_COMP        ; Sterownik komparatora analogowego
0x000D          rjmp ADC             ; Sterownik przetwarzania w przetworniku A/C
0x000E          rjmp EE_RDY          ; Sterownik gotowości EEPROM
0x000F          rjmp USI_STR         ; Sterownik startu USI
0x0010          rjmp USI_OVF         ; Sterownik przepełnienia USI
;
0x0011 RESET:   ldi r16, high(RAMEND); Start programu głównego
0x0012          out SPH,r16          ; Ustaw wskaźnik stosu na szczycie RAM
0x0013          ldi r16, low(RAMEND)
0x0014          out SPL,r16
0x0015          sei                  ; Włącz przerwania
0x0016          <instr>
...             ...
Na początek:  podrozdziału   strony 

Przerwania zewnętrzne

Przerwania zewnętrzne (ang. external interrupts) są wyzwalane przez końcówkę INT0 lub dowolną z końcówek PCINT11...0 mikrokontrolera ATtiny24/44/84:

Zwróć uwagę, że gdy przerwania te zostaną uaktywnione, będą wyzwalane nawet w przypadku, kiedy związane z nimi końcówki zostały skonfigurowane jako wyjścia. Cecha ta udostępnia sposób generowania przerwania programowego. Przerwania 0 od zmiany stanu końcówki (ang. pin change 0 interrupts, PCINT0) będą wyzwalane, gdy jedna z uaktywnionych końcówek PCINT7...0 zmieni swój stan logiczny (np. z 1 na 0 lub z 0 na 1). Przerwania 1 od zmiany stanu końcówki  (ang. pin change 1 interrupts, PCINT1) będą tak samo generowane, gdy zmieni się stan jednej z uaktywnionych końcówek PCINT11:8. Rejestry PCMSK0 i PCMSK1 określają, które z końcówek PCINT11...0 mogą generować takie przerwanie. Przerwania zmiany stanu końcówki na wyprowadzeniach PCINT11...0 są wykrywane asynchronicznie, co oznacza, że można ich używać do wybudzania mikrokontrolera z trybów uśpienia innych niż tryb bezczynny.

Przerwanie INT0 może być wyzwalane przez opadające/narastające zbocze sygnału lub przez niski poziom logiczny. Ustawia się to w rejestrze sterującym mikrokontrolera – MCUCR. Gdy zostanie uaktywnione przerwanie INT0 i skonfigurowane na wyzwalanie poziomem, to przerwanie będzie wyzwalane tak długo, jak jego końcówka jest utrzymywana w stanie niskim. Zauważ, iż rozpoznawanie przerwań przy zboczach narastających lub opadających na końcówce INT0 wymaga obecności zegara we/wy.

Przerwanie od niskiego poziomu

Przerwanie od niskiego poziomu (ang. low level interrupt) na końcówce INT0 (5) jest wykrywane asynchronicznie. Oznacza to, iż to źródło przerwania może zostać użyte do wybudzania mikrokontrolera również z trybów uśpienia innych niż tryb bezczynności (zegar we/wy jest zatrzymywany we wszystkich trybach uśpienia za wyjątkiem trybu bezczynności).

Zwróć uwagę, iż jeśli przerwanie od niskiego poziomu zostanie użyte do wybudzenia z trybu wyłączenia zasilania, to pożądany poziom musi być utrzymywany wystarczająco długo, aby mikrokontroler ukończył wybudzanie się, a następnie wyzwolił to przerwanie. Jeśli niski poziom zniknie przed końcem czasu uruchamiania, mikrokontroler wybudzi się, lecz nie zostanie wygenerowane żadne przerwanie. Czas uruchamiania jest definiowany przez bity bezpiecznikowe SUT i CKSEL opisane w rozdziale "System zegarowy".

Jeśli niski poziom na końcówce przerwania zostanie usunięty przed wybudzeniem się mikrokontrolera, to wykonanie programu nie zostanie skierowane do procedury obsługi przerwania, lecz nastąpi kontynuacja wykonywania od kolejnej instrukcji za rozkazem SLEEP.

Synchronizacja w czasie przerwania od zmiany stanu końcówki

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) BODS PUD SE SM1 SM0 BODSE ISC01 ISC00 MCUCR
Zapis/Odczyt O/Z 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 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) INT0 PCIE1 PCIE0 GIMSK
Zapis/Odczyt O Z/O Z/O Z/O O O O O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7,3:0 – Zarezerwowane

Te bity są w ATtiny24/44/84 zarezerwowane i przy odczycie zawsze mają wartość zero.

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 – PCIE1: Pin Change Interrupt Enable 0 – 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 PCINT11...8 spowoduje wygenerowanie przerwania. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania PCI1. Końcówki PCINT11...8 są uaktywniane indywidualnie w rejestrze PCMSK1.

Bit 4 – PCIE0: Pin Change Interrupt Enable 2 – 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.


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

Bit 7 6 5 4 3 2 1 0  
0x3A (0x5A) INTF0 PCIF1 PCIF0 GIFR
Zapis/Odczyt O Z/O Z/O Z/O O O O O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7,3:0 – Zarezerwowane

Te bity są w ATtiny24/44/84 zarezerwowane i przy odczycie zawsze mają wartość zero.

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 – PCIF1: Pin Change Interrupt Flag 1 – Znacznik 1 przerwania od zmiany stanu końcówki

Gdy zmiana stanu logicznego na dowolnej końcówce PCINT11...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 4 – 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.

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  
0x20 (0x40) - - - - PCINT11 PCINT10 PCINT9 PCINT8 PCMSK1
Zapis/Odczyt O O O O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Bity 7...4 – Zarezerwowane

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

Bity 3...0 – PCINT11..8: Pin Change Enable Mask 11..8 – Maska uaktywniania przerwań od zmiany stanu końcówek

Każdy z bitów PCINT11...8 uaktywnia generowanie przerwań od zmiany stanu logicznego na odpowiadającej mu końcówce we/wy. Jeśli są ustawione bit PCINT11...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 PCINT11...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  
0x12 (0x32) 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
©2022 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.