|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

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:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
| Numer wektora | Adres programu(2) | Źródło | Definicja przerwania |
| 1 | 0x000(1) | RESET | Końcówka zewnętrzna, reset przy włączaniu, reset przy spadku VCC, reset od licznika zegarowego, reset AVR JTAG |
| 2 | 0x002 | INT0 | Żądanie przerwania zewnętrznego 0 |
| 3 | 0x004 | INT1 | Żądanie przerwania zewnętrznego 1 |
| 4 | 0x006 | TIMER2_COMP | Zgodność porównania w timerze/liczniku 2 |
| 5 | 0x008 | TIMER2_OVF | Przepełnienie timera/licznika 2 |
| 6 | 0x00A | TIMER1_CAPT | Zdarzenie Capture timera/licznika 1 |
| 7 | 0x00C | TIMER1_COMPA | Zgodność porównania A w timerze/liczniku 1 |
| 8 | 0x00E | TIMER1_COMPB | Zgodność porównania B w timerze/liczniku 1 |
| 9 | 0x010 | TIMER1_OVF | Przepełnienie timera/licznika 1 |
| 10 | 0x012 | TIMER0_OVF | Przepełnienie timera/licznika 0 |
| 11 | 0x014 | SPI_STC | Zakończenie transmisji szeregowej |
| 12 | 0x016 | USART_RXC | Zakończenie odczytu USART |
| 13 | 0x018 | USART_UDRE | Pusty rejestr danych USART |
| 14 | 0x01A | USART_TXC | Zakończenie transmisji USART |
| 15 | 0x01C | ADC | Zakończenie przetwarzania w przetworniku A/C |
| 16 | 0x01E | EE_RDY | Gotowość EEPROM |
| 17 | 0x020 | ANA_COMP | Komparator analogowy |
| 18 | 0x022 | TWI | 2-przewodowy interfejs szeregowy |
| 19 | 0x024 | INT2 | Żądanie przerwania zewnętrznego 2 |
| 20 | 0x026 | TIMER0_COMP | Zgodność porównania w timerze/liczniku 0 |
| 21 | 0x028 | SPM_RDY | Gotowość zapisu w pamięci programu |
| 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 GICR, 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. |
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 | 0x000 | 0x002 |
| 1 | 1 | 0x000 | Adres reset boot + 0x002 |
| 0 | 0 | Adres reset boot | 0x002 |
| 0 | 1 | Adres reset boot | Adres reset boot + 0x002 |
| 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 ATmega16 jest następujące:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x000 jmp RESET ; Obsługa resetu 0x002 jmp EXT_INT0 ; Obsługa IRQ0 0x004 jmp EXT_INT1 ; Obsługa IRQ1 0x006 jmp TIM2_COMP ; Obsługa porównania w timerze 2 0x008 jmp TIM2_OVF ; Obsługa przepełnienia timera 2 0x00A jmp TIM1_CAPT ; Obsługa zdarzenia Capture w timerze 1 0x00C jmp TIM1_COMPA ; Obsługa porównania A w timerze 1 0x00E jmp TIM1_COMPB ; Obsługa porównania B w timerze 1 0x010 jmp TIM1_OVF ; Obsługa przepełnienia timera 1 0x012 jmp TIM0_OVF ; Obsługa przepełnienia timera 0 0x014 jmp SPI_STC ; Obsługa zakończenia transmisji SPI 0x016 jmp USART_RXC ; Obsługa zakończenia odczytu USART 0x018 jmp USART_UDRE ; Obsługa pustego rejestru danych UDR 0x01A jmp USART_TXC ; Obsługa zakończenia przesyłu USART 0x01C jmp ADC ; Obsługa zakończenia przetwarzania w przetworniku A/C 0x01E jmp EE_RDY ; Obsługa gotowości EEPROM 0x020 jmp ANA_COMP ; Obsługa komparatora analogowego 0x022 jmp TWI ; Obsługa 2-przewodowego interfejsu szeregowego 0x024 jmp EXT_INT2 ; Obsługa IRQ2 0x026 jmp TIM0_COMP ; Obsługa porównania w timerze 0 0x028 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu ; 0x02A RESET: ldi r16,high(RAMEND); Początek programu głównego 0x02B out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x02C ldi r16,low(RAMEND) 0x02D out SPL,r16 0x02E sei ; Włącz przerwania 0x02F <instr> xxx ... ... ... |
Gdy bit bezpiecznikowy BOOTRST nie jest zaprogramowany, rozmiar sekcji boot został ustawiony na 2 KB, a bit IVSEL w rejestrze GICR 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 0x000 RESET: ldi r16,high(RAMEND); Start programu głównego 0x001 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x002 ldi r16,low(RAMEND) 0x003 out SPL,r16 0x004 sei ; Włącz przerwania 0x005 <instr> xxx ; .org 0x1c02 0x1c02 jmp EXT_INT0 ; Obsługa IRQ0 0x1c04 jmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ; 0x1c28 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 2 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 0x002 0x002 jmp EXT_INT0 ; Obsługa IRQ0 0x004 jmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ; 0x028 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu ; .org 0x1c00 0x1c00 RESET: ldi r16,high(RAMEND); Start programu głównego 0x1c01 out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0x1c02 ldi r16,low(RAMEND) 0x1c03 out SPL,r16 0x1c04 sei ; Włącz przerwania 0x1c05 <instr> xxx |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany, rozmiar sekcji boot został ustawiony na 2 KB, a bit IVSEL w rejestrze GICR 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 0x1c00 0x1c00 jmp RESET ; Obsługa Reset 0x1c01 jmp EXT_INT0 ; Obsługa IRQ0 0x1c04 jmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ; 0x1c28 jmp SPM_RDY ; Obsługa gotowości zapisu do pamięci programu 0xc2A RESET: ldi r16,high(RAMEND); Start programu głównego 0xc2B out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM 0xc2C ldi r16,low(RAMEND) 0xc2D out SPL,r16 0xc2E sei ; Włącz przerwania 0xc2F <instr> xxx |
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x3B (0x5B) | INT1 | INT0 | INT2 | – | – | – | IVSEL | IVCE | GICR |
| Zapis/Odczyt | Z/O | Z/O | Z/O | O | O | 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 GICR, r16
; Przesuń przerwania do sekcji boot we FLASH
ldi r16, (1<<IVSEL)
out GICR, r16
ret
|
| Przykład w języku C |
void Move_interrupts(void) { /* Włącz zmianę wektorów przerwań */ GICR = (1<<IVCE); /* Przesuń przerwania do sekcji boot we FLASH */ GICR = (1<<IVSEL); } |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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.