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
Numer wektora | Adres programu(2) | Źródło | Definicja przerwania |
1 | 0x0000(1) | RESET | Końcówka zewnętrzna RESET, reset przy włączaniu zasilania, reset przy spadku napięcia, reset od licznika zegarowego i reset od AVR JTAG. |
2 | 0x0002 | INT0 | Przerwanie zewnętrzne 0 |
3 | 0x0004 | INT1 | Przerwanie zewnętrzne 1 |
4 | 0x0006 | INT2 | Przerwanie zewnętrzne 2 |
5 | 0x0008 | INT3 | Przerwanie zewnętrzne 3 |
6 | 0x000A | INT4 | Przerwanie zewnętrzne 4 |
7 | 0x000C | INT5 | Przerwanie zewnętrzne 5 |
8 | 0x000E | INT6 | Przerwanie zewnętrzne 6 |
9 | 0x0010 | INT7 | Przerwanie zewnętrzne 7 |
10 | 0x0012 | TIMER2 COMP | Zgodność porównania w timerze/liczniku 2 |
11 | 0x0014 | TIMER2 OVF | Przepełnienie timera/licznika 2 |
12 | 0x0016 | TIMER1 CAPT | Zdarzenie Input Capture w timerze/liczniku 1 |
13 | 0x0018 | TIMER1 COMPA | Zgodność porównania A w timerze/liczniku 1 |
14 | 0x001A | TIMER1 COMPB | Zgodność porównania B w timerze/liczniku 1 |
15 | 0x001C | TIMER1 OVF | Przepełnienie timera/licznika 1 |
16 | 0x001E | TIMER0 COMP | Zgodność porównania w timerze/liczniku 0 |
17 | 0x0020 | TIMER0 OVF | Przepełnienie timera/licznika 0 |
18 | 0x0022 | SPI, STC | Zakończenie transmisji szeregowej w SPI |
19 | 0x0024 | USART0, RX | USART 0, zakończenie odczytu |
20 | 0x0026 | USART0, UDRE | USART 0, rejestr danych pusty |
21 | 0x0028 | USART0, TX | USART 0, zakończenie zapisu |
22 | 0x002A | ADC | Zakończenie przetwarzania w przetworniku analogowo/cyfrowym |
23 | 0x002C | EE READY | Gotowość pamięci EEPROM |
24 | 0x002E | ANALOG COMP | Komparator analogowy |
25 | 0x0030(3) | TIMER1 COMPC | Zgodność porównania C w timerze/liczniku 1 |
26 | 0x0032(3) | TIMER3 CAPT | Zdarzenie Input Capture w timerze/liczniku 3 |
27 | 0x0034(3) | TIMER3 COMPA | Zgodność porównania A w timerze/liczniku 3 |
28 | 0x0036(3) | TIMER3 COMPB | Zgodność porównania B w timerze/liczniku 3 |
29 | 0x0038(3) | TIMER3 COMPC | Zgodność porównania C w timerze/liczniku 3 |
30 | 0x003A(3) | TIMER3 OVF | Przepełnienie timera/licznika 3 |
31 | 0x003C(3) | USART1, RX | USART 1, zakończenie odczytu |
32 | 0x003E(3) | USART1, UDRE | USART 1, rejestr danych pusty |
33 | 0x0040(3) | USART1, TX | USART 1, zakończenie zapisu |
34 | 0x0042(3) | TWI | 2-przewodowy interfejs szeregowy |
35 | 0x0044(3) | SPM READY | Instrukcja SPM gotowa |
Uwagi: | 1. | Gdy został zaprogramowany bit bezpiecznikowy BOOTRST, mikrokontroler skoczy przy resecie do adresu programu ładującego, zobacz do rozdziału "Wsparcie dla programu startowego – odczyt przy zapisie i samoprogramowanie". |
2. | Gdy zostanie ustawiony bit IVSEL w rejestrze MCUCR, to wektory przerwań bęsą przesunięte na początek sekcji programu lądującego w pamięci FLASH. Adres każdego wektora przerwań będzie równy zatem adresowi w tej tabeli dodanemu do adresu początku sekcji boot w pamięci FLASH. | |
3. | Przerwania pod adresami 0x0030 ... 0x0044 nie istnieją w trybie kompatybilności z ATmega103. |
Tabelka poniżej pokazuje położenie wektora resetu oraz wektorów przerwań przy różnych kombinacjach ustawień BOOTRST i IVSEL. Jeśli program nigdy nie włącza żadnego źródła przerwań, to wektory przerwań nie są używane i można w ich miejscu umieścić normalny kod programu. Tak jest również w przypadku, jeśli wektor Reset został umieszczony w sekcji aplikacji, natomiast wektory przerwań są w sekcji boot lub na odwrót.
BOOTRST | IVSEL | Adres reset | Adres startowy wektorów przerwań |
1 | 0 | 0x0000 | 0x0002 |
1 | 1 | 0x0000 | Adres reset boot + 0x0002 |
0 | 0 | Adres reset boot | 0x0002 |
0 | 1 | Adres reset boot | Adres reset boot + 0x0002 |
Uwagi: | 1. | Dla bitu bezpiecznikowego BOOTRST “1” oznacza stan niezaprogramowany, a "0" oznacza stan zaprogramowany |
Najbardziej typowe i ogólne ustawienie programu dla adresów resetu i wektorów przerwań w ATmega64 jest następujące:
Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 jmp RESET ; Procedura obsługi resetu 0x0002 jmp EXT_INT0 ; Procedura obsługi IRQ0 0x0004 jmp EXT_INT1 ; Procedura obsługi IRQ1 0x0006 jmp EXT_INT2 ; Procedura obsługi IRQ2 0x0008 jmp EXT_INT3 ; Procedura obsługi IRQ3 0x000A jmp EXT_INT4 ; Procedura obsługi IRQ4 0x000C jmp EXT_INT5 ; Procedura obsługi IRQ5 0x000E jmp EXT_INT6 ; Procedura obsługi IRQ6 0x0010 jmp EXT_INT7 ; Procedura obsługi IRQ7 0x0012 jmp TIM2_COMP ; Procedura obsługi porównania w timerze 2 0x0014 jmp TIM2_OVF ; Procedura obsługi przepełnienia timera 2 0x0016 jmp TIM1_CAPT ; Procedura obsługi Input Capture w timerze 1 0x0018 jmp TIM1_COMPA ; Procedura obsługi porównania A w timerze 1 0x001A jmp TIM1_COMPB ; Procedura obsługi porównania B w timerze 1 0x001C jmp TIM1_OVF ; Procedura obsługi przepełnienia w timerze 1 0x001E jmp TIM0_COMP ; Procedura obsługi porównania w timerze 0 0x0020 jmp TIM0_OVF ; Procedura obsługi przepełnienia w timerze 0 0x0022 jmp SPI_STC ; Procedura obsługi zakończenia przesyłu SPI 0x0024 jmp USART0_RXC ; Procedura obsługi USART 0 przy zakończeniu odczytu 0x0026 jmp USART0_DRE ; Procedura obsługi USART 0 przy pustym rejestrze UDR 0x0028 jmp USART0_TXC ; Procedura obsługi USART 0 przy zakończeniu przesyłu 0x002A jmp ADC ; Procedura obsługi zakończenia przetwarzania w przetworniku A/C 0x002C jmp EE_RDY ; Procedura obsługi gotowości EEPROM 0x002E jmp ANA_COMP ; Procedura obsługi komparatora analogowego 0x0030 jmp TIM1_COMPC ; Procedura obsługi porównania C w timerze 1 0x0032 jmp TIM3_CAPT ; Procedura obsługi Input Capture w timerze 3 0x0034 jmp TIM3_COMPA ; Procedura obsługi porównania A w timerze 3 0x0036 jmp TIM3_COMPB ; Procedura obsługi porównania B w timerze 3 0x0038 jmp TIM3_COMPC ; Procedura obsługi porównania C w timerze 3 0x003A jmp TIM3_OVF ; Procedura obsługi przepełnienia w timerze 3 0x003C jmp USART1_RXC ; Procedura obsługi USART 1 przy zakończeniu odczytu 0x003E jmp USART1_DRE ; Procedura obsługi USART 1 przy pustym rejestrze UDR 0x0040 jmp USART1_TXC ; Procedura obsługi USART 1 przy zakończeniu przesyłu 0x0042 jmp TWI ; Procedura obsługi interfejsu TWI 0x0044 jmp SPM_RDY ; Procedura obsługi gotowości instrukcji SPM ; 0x0046 RESET: ldi r16, high(RAMEND); Start głównego programu 0x0047 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x0048 ldi r16, low(RAMEND) 0x0049 out SPL,r16 0x004A sei ; Włącz przerwania 0x004B <instr> xxx :. :. :. :. |
Gdy bit bezpiecznikowy BOOTRST nie jest zaprogramowany, rozmiar sekcji boot został ustawiony na 8 KB, a bit IVSEL w rejestrze MCUCR jest ustawiony przed włączeniem jakiegokolwiek przerwania, to najbardziej typowe i ogólne ustawienie programu dla adresów wektora resetu i wektorów przerwań jest następujące:
Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 RESET: ldi r16,high(RAMEND); Start programu głównego 0x0001 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x0002 ldi r16,low(RAMEND) 0x0003 out SPL,r16 0x0004 sei ; Włącz przerwania 0x0005 <instr> xxx ; .org 0x7002 0x7002 jmp EXT_INT0 ; Obsługa IRQ0 0x7004 jmp EXT_INT1 ; Obsługa IRQ1 :. :. :. :. 0x7044 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany i rozmiar sekcji boot został ustawiony na 8 KB, to najbardziej typowe i ogólne ustawienie programu dla adresów wektora resetu i wektorów przerwań jest następujące:
Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze .org 0x0002 0x0002 jmp EXT_INT0 ; Obsługa IRQ0 0x0004 jmp EXT_INT1 ; Obsługa IRQ1 :. :. :. :. 0x0044 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu ; .org 0x7000 0x7000 RESET: ldi r16,high(RAMEND); Start programu głównego 0x7001 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x7002 ldi r16,low(RAMEND) 0x7003 out SPL,r16 0x7004 sei ; Włącz przerwania 0x7005 <instr> xxx |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany, rozmiar sekcji boot został ustawiony na 8 KB, a bit IVSEL w rejestrze MCUCR został ustawiony przed włączeniem jakiegokolwiek przerwania, to najbardziej typowe i ogólne ustawienie programu dla adresów wektora resetu i wektorów przerwań jest następujące:
Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze ; .org 0x7000 0x7000 jmp RESET ; Obsługa Reset 0x7002 jmp EXT_INT0 ; Obsługa IRQ0 0x7004 jmp EXT_INT1 ; Obsługa IRQ1 :. :. :. :. 0x7044 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu 0x7046 RESET: ldi r16,high(RAMEND); Start programu głównego 0x7047 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x7048 ldi r16,low(RAMEND) 0x7049 out SPL,r16 0x704A sei ; Włącz przerwania 0x704B <instr> xxx |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x35 (0x55) | SRE | SRW10 | SE | SM1 | SM0 | SM2 | IVSEL | IVCE | 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 |
Gdy bit IVSEL zostanie wyzerowany, wektory przerwań są umieszczane na początku pamięci FLASH. Gdy bit ten jest ustawiony na jeden, wektory przerwań zostają przesunięte na początek sekcji programu ładującego w FLASH. Rzeczywisty adres początku sekcji boot w FLASH jest określany przez bity bezpiecznikowe BOOTSZ. Szczegóły znajdziesz w rozdziale "Wsparcie dla programu startowego – odczyt przy zapisie i samoprogramowanie". Aby uniknąć niezamierzonych zmian tablic wektorów przerwań, należy wykonać specjalną procedurę zapisu, aby zmienić bit IVSEL bit:
Gdy ta sekwencja jest wykonywana, przerwania zostają automatycznie wyłączone. Są one wyłączane w takcie ustawienia bitu IVCE i pozostają wyłączone aż do następnej instrukcji za tą, która wpisuje do IVSEL. Jeśli wpis do IVSEL nie nastąpi, to przerwania pozostają wyłączone przez cztery cykle. Bit I w rejestrze stanu SREG nie jest zmieniany przez to automatyczne wyłączenie.
Uwaga: Jeśli wektory przerwań są umieszczone w sekcji programu bootloadera i bit blokujący BLB02 jest zaprogramowany, to przerwania są wyłączone podczas wykonywania kodu w sekcji aplikacji. Jeśli wektory przerwań są umieszczone w sekcji aplikacji i bit blokujący BLB12 jest zaprogramowany, to przerwania są wyłączone podczas wykonywania kodu w sekcji programu bootloadera. Szczegóły na temat tych bitów blokujących znajdziesz w rozdziale "Wsparcie dla programu startowego – odczyt przy zapisie i samoprogramowanie". |
Bit IVCE musi być zapisany logiczną jedynką, aby włączyć zmianę bitu IVSEL. IVCE jest zerowany sprzętowo po czterech taktach następujących po zapisie lub gdy zostanie zapisany bit IVSEL. Ustawienie bitu IVCE wyłączy przerwania, co wyjaśniono w opisie IVSEL powyżej. Zobacz na przykładowy kod:
Przykład w kodzie maszynowym |
Move_interrupts: ; Włącz zmianę wektorów przerwań ldi r16, (1<<IVCE) out MCUCR, r16 ; Przesuń przerwania do sekcji boot we FLASH ldi r16, (1<<IVSEL) out MCUCR, r16 ret |
Przykład w języku C |
void Move_interrupts(void) { /* Włącz zmianę wektorów przerwań */ MCUCR = (1<<IVCE); /* Przesuń przerwania do sekcji boot we FLASH */ MCUCR = (1<<IVSEL); } |
![]() |
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.