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 |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
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 | TIMER1_COMPA | Zgodność porównania A w timerze/liczniku 1 |
5 | 0x0004 | TIMER1_OVF | Przepełnienie timera/licznika 1 |
6 | 0x0005 | TIMER0_OVF | Przepełnienie timera/licznika 0 |
7 | 0x0006 | EE_RDY | Gotowość EEPROM |
8 | 0x0007 | ANA_COMP | Komparator analogowy |
9 | 0x0008 | ADC | Zakończone przetwarzanie w przetworniku A/C |
10 | 0x0009 | TIMER1_COMPB | Zgodność porównania B w timerze/liczniku 1 |
11 | 0x000A | TIMER0_COMPA | Zgodność porównania A w timerze/liczniku 0 |
12 | 0x000B | TIMER0_COMPB | Zgodność porównania B w timerze/liczniku 0 |
13 | 0x000C | WDT | Zakończony okres zliczania w timerze licznika zegarowego |
14 | 0x000D | USI_START | START USI |
15 | 0x001E | 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 ATtiny25/45/85 wygląda następująco:
.org 0x0000 ; Ustaw adres następnej instrukcji rjmp RESET ; Adres 0x0000 rjmp INT0_ISR ; Adres 0x0001 rjmp PCINT0_ISR ; Adres 0x0002 rjmp TIM1_COMPA_ISR ; Adres 0x0003 rjmp TIM1_OVF_ISR ; Adres 0x0004 rjmp TIM0_OVF_ISR ; Adres 0x0005 rjmp EE_RDY_ISR ; Adres 0x0006 rjmp ANA_COMP_ISR ; Adres 0x0007 rjmp ADC_ISR ; Adres 0x0008 rjmp TIM1_COMPB_ISR ; Adres 0x0009 rjmp TIM0_COMPA_ISR ; Adres 0x000A rjmp TIM0_COMPB_ISR ; Adres 0x000B rjmp WDT_ISR ; Adres 0x000C rjmp USI_START_ISR ; Adres 0x000D rjmp USI_OVF_ISR ; Adres 0x000E RESET: ; Start programu głównego <instr> ; Adres 0x000F ... |
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 PCI od zmiany stanu końcówki (ang. pin change interrupts) będą wyzwalane, gdy jedna z uaktywnionych końcówek PCINT[5: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 PCINT[5:0] mogą generować takie przerwanie. Przerwania zmiany stanu końcówki na wyprowadzeniach PCINT[5: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 (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 "Zegar systemowy i opcje zegarowe".
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 | |
0x35 | 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 |
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 | – | INT0 | PCIE | – | – | – | – | – | GIMSK |
Zapis/Odczyt | O | Z/O | Z/O | O | O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są w ATtiny24/44/84 zarezerwowane i przy odczycie zawsze mają wartość zero.
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 PCIE 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 PCINT[5:0] spowoduje wygenerowanie przerwania. Przerwanie to jest obsługiwane przez procedurę wskazywaną przez wektor przerwania PCI1. Końcówki PCINT[5:0] są uaktywniane indywidualnie w rejestrze PCMSK.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3A | – | INTF0 | PCIF | – | – | – | – | – | GIFR |
Zapis/Odczyt | O | Z/O | Z/O | O | O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są w ATtiny24/44/84 zarezerwowane i przy odczycie zawsze mają wartość zero.
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 PCINT[5:0] wygeneruje żądanie przerwania, zostaje ustawiony znacznik PCIF. Jeśli są ustawione bit I w rejestrze SREG oraz bit PCIE 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 | |
0x15 | - | - | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 | PCMSK |
Zapis/Odczyt | O | 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 przy odczycie dają wartość 0.
Każdy z bitów PCINT[5:0] uaktywnia generowanie przerwań od zmiany stanu logicznego na odpowiadającej mu końcówce we/wy. Jeśli są ustawione bit PCINT[5:0] oraz bit PCIE 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.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.