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
Poniższa tabela opisuje wektory przerwań (ang. Interrupt Vectors) dostępne w mikrokontrolerze ATtiny4/5/9/10:
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 | TIM0_CAPT | Input Capture dla timera/licznika 0 |
5 | 0x0004 | TIM0_OVF | Przepełnienie timera/licznika 0 |
6 | 0x0005 | TIM0_COMPA | Zgodność porównania A w timerze/liczniku 0 |
7 | 0x0006 | TIM0_COMPB | Zgodność porównania B w timerze/liczniku 0 |
8 | 0x0007 | ANA_COMP | Komparator analogowy |
9 | 0x0008 | WDT | Zakończony okres zliczania w timerze licznika zegarowego |
10 | 0x0009 | VLM | Przerwanie od monitora napięcia zasilającego |
11 | 0x000A | ADC | Zakończone przetwarzanie w przetworniku A/C |
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 ATtiny4/5/9/10 wygląda następująco:
Adres Etykiety Kod Komentarze 0x0000 rjmp RESET ; Obsługa resetu 0x0001 rjmp EXT_INT0 ; Obsługa IRQ0 0x0002 rjmp PCINT0 ; Obsługa PCINT0 0x0003 rjmp TIM0_CAPT ; Obsługa Input Capture dla Timera 0 0x0004 rjmp TIM0_OVF ; Obsługa przepełnienia Timera 0 0x0005 rjmp TIM0_COMPA ; Obsługa zgodności porównania A w Timerze 0 0x0006 rjmp TIM0_COMPB ; Obsługa zgodności porównania A w Timerze 0 0x0007 rjmp ANA_COMP ; Obsługa komparatora analogowego 0x0008 rjmp WDT ; Obsługa przerwania z licznika zegarowego 0x0009 rjmp VLM ; Obsługa monitora napięcia zasilającego 0x000A rjmp ADC ; Obsługa konwersji w przetworniku A/C ; 0x000B RESET: ldi r16, high(RAMEND); Start programu głównego 0x000C out SPH,r16 ; Ustaw wskaźnik stosu 0x000D ldi r16, low(RAMEND) ; na szczyt pamięci RAM 0x000E out SPL,r16 0x000F sei ; Włącz przerwania 0x0010 <instr> ... ... ... ... |
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 od zmiany stanu końcówki (ang. pin change interrupts, PCINT0) będą wyzwalane, gdy jedna z uaktywnionych końcówek PCINT3...0 zmieni swój stan logiczny (np. z 1 na 0 lub z 0 na 1). Rejestr PCMSK określa, które z końcówek PCINT3...0 mogą generować takie przerwanie. Przerwania zmiany stanu końcówki na wyprowadzeniach PCINT3...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 A sterowania przerwaniami zewnętrznymi, EICRA (ang. External Interrupt Control Register A). Gdy przerwanie INT0 jest uaktywnione i skonfigurowane jako wyzwalane poziomem, będzie ono wyzwalane tak długo, jak końcówka 4 jest utrzymywana w stanie niskim. Zwróć uwagę, iż rozpoznanie przerwań od opadającej lub narastającej krawędzi sygnału na końcówce INT0 wymaga obecności zegara we/wy, co opisano w rozdziale "System zegarowy".
Przerwanie od niskiego poziomu (ang. low level interrupt) na końcówce INT0 (4) 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 określony 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.
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 | |
0x15 | - | - | - | - | - | - | ISC01 | ISC00 | EICRA |
Zapis/Odczyt | O | O | O | O | O | O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Zewnętrzne przerwanie 0 jest aktywowane przez zewnętrzną końcówkę INT0 (4), jeśli zostały ustawione znacznik I w rejestrze stanu SREG oraz odpowiednia maska przerwań. Poziom i zbocza sygnału na zewnętrznej końcówce INT0, które aktywują przerwanie są zdefiniowane w poniższej tabeli:
ISC01 | ISC02 | Opis |
0 | 0 | Niski poziom na końcówce INT0 generuje żądanie przerwania. |
0 | 1 | Zmiana stanu logicznego na końcówce INT0 generuje żądanie przerwania. |
1 | 0 | Opadające zbocze sygnału na końcówce INT0 generuje żądanie przerwania. |
1 | 1 | Narastające zbocze sygnału na końcówce INT0 generuje żądanie przerwania. |
Wartość sygnału na końcówce INT0 jest próbkowana przed wykrywaniem zbocz. Jeśli zostało wybrane przerwanie od zbocza lub zmiany stanu, to impulsy trwające dłużej od jednego cyklu zegarowego wygenerują przerwanie. Krótsze impulsy nie dają gwarancji wygenerowania przerwania. Jeśli zostało wybrane przerwanie od niskiego poziomu, to poziom ten musi być utrzymywany aż do zakończenia bieżąco wykonywanej instrukcji, aby zostało wygenerowane przerwanie.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x13 | - | - | - | - | - | - | - | INT0 | EIMSK |
Zapis/Odczyt | O | O | O | O | O | O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Gdy bity INT0 oraz I w rejestrze stanu (SREG) zostaną ustawione na 1, uaktywnia się przerwanie zewnętrzne od końcówki mikrokontrolera. Bity sterowania wykrywaniem przerwania (ISC01 i ISC00) w rejestrze A sterowania przerwaniami zewnętrznymi (EICRA) definiują, czy przerwanie jest aktywowane przy wykryciu narastającego/opadającego zbocza lub poziomu niskiego sygnału na końcówce INT0. Aktywność na tym wyprowadzeniu spowoduje żądanie przerwania nawet wtedy, gdy końcówka INT0 została skonfigurowana jako wyjście. Żądanie przerwania INT0 powoduje wykonanie programu od wektora przerwań INT0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x14 | - | - | - | - | - | - | - | INTF0 | EIFR |
Zapis/Odczyt | O | O | O | O | O | O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Gdy zbocze sygnału lub zmiana jego poziomu logicznego na końcówce INT0 wyzwala przerwanie, bit INTF0 zostaje ustawiony na 1. Jeśli bit I w rejestrze stanu SREG oraz bit INT0 w rejestrze maski przerwań zewnętrznych EIMSK są ustawione na 1, mikrokontroler wykona skok do odpowiedniego wektora przerwań.
Znacznik ten jest zerowany, gdy zostaje jest wykonywana procedura obsługi przerwania. Zastępczo znacznik można wyzerować przez zapis do niego logicznej jedynki (nie zera).
Znacznik ma stale wartość 0, gdy INT0 jest skonfigurowane jako przerwanie od poziomu niskiego.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x12 | - | - | - | - | - | - | - | PCIE0 | PCICR |
Zapis/Odczyt | O | O | O | O | O | O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Gdy bity PCIE0 oraz I w rejestrze stanu (SREG) są ustawione na 1, zostaje uaktywnione przerwanie 0 od zmiany stanu końcówki mikrokontrolera. Jakakolwiek zmiana na uaktywnionej końcówce PCINT3..0 spowoduje przerwanie i skok do wektora przerwań PCI0. Końcówki PCINT3..0 są uaktywniane indywidualnie w rejestrze PCMSK.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x11 | - | - | - | - | - | - | - | PCIF0 | PCIFR |
Zapis/Odczyt | O | O | O | O | O | O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Gdy zmiana stanu na dowolnej z końcówek PCINT3..0 wywołuje żądanie przerwania, zostaje ustawiony na 1 znacznik PCIF0. Jeśli bity I w rejestrze stanu SREG oraz PCIE0 w rejestrze PCICR są ustawione na 1, to mikrokontroler wykona skok do odpowiedniego wektora przerwań. Znacznik ten jest zerowany, gdy zostaje jest wykonywana procedura obsługi przerwania. Zastępczo znacznik można wyzerować przez zapis do niego logicznej jedynki (nie zera).
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x10 | - | - | - | - | PCINT3 | PCINT2 | PCINT1 | PCINT0 | PCMSK |
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 |
Te bity są zarezerwowane i zawsze dają odczyt zero.
Każdy bit PCINT3..0 wybiera, czy na tej końcówce zostanie uaktywnione przerwanie od zmiany stanu. Jeśli bit PCINT3..0 jest ustawiony na 1 oraz bit PCIE0 w rejestrze PCICR jest również ustawiony na 1, to na odpowiedniej końcówce mikrokontrolera zostaje uaktywnione przerwanie od zmiany stanu logicznego tej końcówki. Jeśli bit PCINT3..0 jest wyzerowany, to przerwanie od zmiany stanu na odpowiedniej końcówce mikrokontrolera zostaje 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.