|
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
Wektory przerwań w mikrokontrolerach ATmega 48A/48PA, ATmega88A/88PA, ATmega168A/168PA i ATmega328/328P są ogólnie takie same z następującymi wyjątkami:
| Nr | Adres | Źródło | Definicja przerwania |
| 1 | 0x000 | RESET | Końcówka zewnętrzna, włączenie zasilania, spadek napięcia zasilania, zakończenie zliczania w liczniku zegarowym |
| 2 | 0x001 | INT0 | Żądanie przerwania zewnętrznego nr 0 |
| 3 | 0x002 | INT1 | Żądanie przerwania zewnętrznego nr 1 |
| 4 | 0x003 | PCINT0 | Żądanie przerwania nr 0 od zmiany stanu końcówki zewnętrznej |
| 5 | 0x004 | PCINT1 | Żądanie przerwania nr 1 od zmiany stanu końcówki zewnętrznej |
| 6 | 0x005 | PCINT2 | Żądanie przerwania nr 2 od zmiany stanu końcówki zewnętrznej |
| 7 | 0x006 | WDT | Przerwanie od zakończenia okresu zliczania w liczniku zegarowym |
| 8 | 0x007 | TIMER2 COMPA | Zgodność porównania A w timerze/liczniku 2 |
| 9 | 0x008 | TIMER2 COMPB | Zgodność porównania B w timerze/liczniku 2 |
| 10 | 0x009 | TIMER2 OVF | Nadmiar w timerze/liczniku 2 |
| 11 | 0x00A | TIMER1 CAPT | Zdarzenie Input Capture w timerze/liczniku 1 |
| 12 | 0x00B | TIMER1 COMPA | Zgodność porównania A w timerze/liczniku 1 |
| 13 | 0x00C | TIMER1 COMPB | Zgodność porównania B w timerze/liczniku 1 |
| 14 | 0x00D | TIMER1 OVF | Nadmiar w timerze/liczniku 1 |
| 15 | 0x00E | TIMER0 COMPA | Zgodność porównania A w timerze/liczniku 0 |
| 16 | 0x00F | TIMER0 COMPB | Zgodność porównania B w timerze/liczniku 0 |
| 17 | 0x010 | TIMER0 OVF | Nadmiar w timerze/liczniku 0 |
| 18 | 0x011 | SPI, STC | Zakończenie przesłania szeregowego SPI |
| 19 | 0x012 | USART, RX | Zakończenie odczytu USART |
| 20 | 0x013 | USART, UDRE | Pusty rejestr danych USART |
| 21 | 0x014 | USART, TX | Zakończenie nadawania USART |
| 22 | 0x015 | ADC | Zakończenie konwersji w przetworniku analogowo/cyfrowym |
| 23 | 0x016 | EE READY | Gotowość EEPROM |
| 24 | 0x017 | ANALOG COMP | Komparator analogowy |
| 25 | 0x018 | TWI | 2-przewodowy interfejs szeregowy |
| 26 | 0x019 | SPM READY | Gotowość zapisu w pamięci programu |
Najbardziej typowe i ogólne ustawienie programu dla adresów wektorów resetu i przerwań w mikrokontrolerze ATmega48A/48PA jest następujące:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x000 rjmp RESET ; Obsługa resetu 0x001 rjmp EXT_INT0 ; Obsługa IRQ0 0x002 rjmp EXT_INT1 ; Obsługa IRQ1 0x003 rjmp PCINT0 ; Obsługa PCINT0 0x004 rjmp PCINT1 ; Obsługa PCINT1 0x005 rjmp PCINT2 ; Obsługa PCINT2 0x006 rjmp WDT ; Obsługa timera licznika zegarowego 0x007 rjmp TIM2_COMPA ; Obsługa zgodności A porównania w timerze 2 0x008 rjmp TIM2_COMPB ; Obsługa zgodności B porównania w timerze 2 0x009 rjmp TIM2_OVF ; Obsługa nadmiaru w timerze 2 0x00A rjmp TIM1_CAPT ; Obsługa Input Capture w timerze 1 0x00B rjmp TIM1_COMPA ; Obsługa zgodności A porównania w timerze 1 0x00C rjmp TIM1_COMPB ; Obsługa zgodności B porównania w timerze 1 0x00D rjmp TIM1_OVF ; Obsługa nadmiaru w timerze 1 0x00E rjmp TIM0_COMPA ; Obsługa zgodności A porównania w timerze 0 0x00F rjmp TIM0_COMPB ; Obsługa zgodności B porównania w timerze 0 0x010 rjmp TIM0_OVF ; Obsługa nadmiaru w timerze 0 0x011 rjmp SPI_STC ; Obsługa zakończenia transferu SPI 0x012 rjmp USART_RXC ; Obsługa zakończenia odczytu w USART 0x013 rjmp USART_UDRE ; Obsługa pustego rejestru danych USART 0x014 rjmp USART_TXC ; Obsługa końca nadawania USART 0x015 rjmp ADC ; Obsługa zakończenia konwersji w przetworniku A/C 0x016 rjmp EE_RDY ; Obsługa gotowości EEPROM 0x017 rjmp ANA_COMP ; Obsługa komparatora analogowego 0x018 rjmp TWI ; Obsługa 2-przewodowego interfejsu szeregowego 0x019 rjmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu ; 0x01A RESET: ldi r16, high(RAMEND); Początek programu głównego 0x01B out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x01C ldi r16, low(RAMEND) 0x01D out SPL,r16 0x01E sei ; Włączenie przerwań 0x01F <instr> xxx ... ... ... ... |
| Nr | Adres(2) | Źródło | Definicja przerwania |
| 1 | 0x000 | RESET(1) | Końcówka zewnętrzna, włączenie zasilania, spadek napięcia zasilania, zakończenie zliczania w liczniku zegarowym |
| 2 | 0x001 | INT0 | Żądanie przerwania zewnętrznego nr 0 |
| 3 | 0x002 | INT1 | Żądanie przerwania zewnętrznego nr 1 |
| 4 | 0x003 | PCINT0 | Żądanie przerwania nr 0 od zmiany stanu końcówki zewnętrznej |
| 5 | 0x004 | PCINT1 | Żądanie przerwania nr 1 od zmiany stanu końcówki zewnętrznej |
| 6 | 0x005 | PCINT2 | Żądanie przerwania nr 2 od zmiany stanu końcówki zewnętrznej |
| 7 | 0x006 | WDT | Przerwanie od zakończenia okresu zliczania w liczniku zegarowym |
| 8 | 0x007 | TIMER2 COMPA | Zgodność porównania A w timerze/liczniku 2 |
| 9 | 0x008 | TIMER2 COMPB | Zgodność porównania B w timerze/liczniku 2 |
| 10 | 0x009 | TIMER2 OVF | Nadmiar w timerze/liczniku 2 |
| 11 | 0x00A | TIMER1 CAPT | Zdarzenie Input Capture w timerze/liczniku 1 |
| 12 | 0x00B | TIMER1 COMPA | Zgodność porównania A w timerze/liczniku 1 |
| 13 | 0x00C | TIMER1 COMPB | Zgodność porównania B w timerze/liczniku 1 |
| 14 | 0x00D | TIMER1 OVF | Nadmiar w timerze/liczniku 1 |
| 15 | 0x00E | TIMER0 COMPA | Zgodność porównania A w timerze/liczniku 0 |
| 16 | 0x00F | TIMER0 COMPB | Zgodność porównania B w timerze/liczniku 0 |
| 17 | 0x010 | TIMER0 OVF | Nadmiar w timerze/liczniku 0 |
| 18 | 0x011 | SPI, STC | Zakończenie przesłania szeregowego SPI |
| 19 | 0x012 | USART, RX | Zakończenie odczytu USART |
| 20 | 0x013 | USART, UDRE | Pusty rejestr danych USART |
| 21 | 0x014 | USART, TX | Zakończenie nadawania USART |
| 22 | 0x015 | ADC | Zakończenie konwersji w przetworniku analogowo/cyfrowym |
| 23 | 0x016 | EE READY | Gotowość EEPROM |
| 24 | 0x017 | ANALOG COMP | Komparator analogowy |
| 25 | 0x018 | TWI | 2-przewodowy interfejs szeregowy |
| 26 | 0x019 | SPM READY | Gotowość zapisu w pamięci programu |
| Uwagi: | 1. | Gdy został zaprogramowany bit bezpiecznikowy BOOTRST, mikrokontroler skoczy przy resecie pod adres Boot Loadera. |
| 2. | Gdy zostanie ustawiony bit IVSEL w rejestrze MCUCR, wektory przerwań przesuną się na początek sekcji Boot pamięci FLASH. W tym przypadku adres każdego wektora przerwań będzie sumą adresu w tej tablicy i adresu początku sekcji BOOT FLASH. |
Poniższa tabelka pokazuje umiejscowienie wektorów przerwań przy różnych kombinacjach ustawień BOOTRST i IVSEL. Jeśli program nigdy nie uaktywnia źródeł przerwań, to wektory przerwań nie są używane i w ich miejscu można umieścić zwykły kod. Tak samo jest również w przypadku, jeśli wektor resetu znajduje się w sekcji aplikacji, a wektory przerwań przemieszczono do sekcji Boot lub na odwrót.
| BOOTRST | IVSEL | Adres resetu | Adres początku wektorów przerwań |
| 1 | 0 | 0x000 | 0x001 |
| 1 | 1 | 0x000 | Adres Boot Reset + 0x001 |
| 0 | 0 | Adres Boot Reset | 0x001 |
| 0 | 1 | Adres Boot Reset | Adres Boot Reset + 0x001 |
Adres Boot Reset zależy od ustawień bitów bezpiecznikowych BOOTSZ, więcej informacji znajdziesz w podrozdziale "Samoprogramowanie pamięci FLASH".
Najbardziej typowe i ogólne ustawienie programu dla adresów wektorów resetu i przerwań w mikrokontrolerze ATmega88A/88PA jest następujące:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x000 rjmp RESET ; Obsługa resetu 0x001 rjmp EXT_INT0 ; Obsługa IRQ0 0x002 rjmp EXT_INT1 ; Obsługa IRQ1 0x003 rjmp PCINT0 ; Obsługa PCINT0 0x004 rjmp PCINT1 ; Obsługa PCINT1 0x005 rjmp PCINT2 ; Obsługa PCINT2 0x006 rjmp WDT ; Obsługa timera licznika zegarowego 0x007 rjmp TIM2_COMPA ; Obsługa zgodności A porównania w timerze 2 0x008 rjmp TIM2_COMPB ; Obsługa zgodności B porównania w timerze 2 0x009 rjmp TIM2_OVF ; Obsługa nadmiaru w timerze 2 0x00A rjmp TIM1_CAPT ; Obsługa Input Capture w timerze 1 0x00B rjmp TIM1_COMPA ; Obsługa zgodności A porównania w timerze 1 0x00C rjmp TIM1_COMPB ; Obsługa zgodności B porównania w timerze 1 0x00D rjmp TIM1_OVF ; Obsługa nadmiaru w timerze 1 0x00E rjmp TIM0_COMPA ; Obsługa zgodności A porównania w timerze 0 0x00F rjmp TIM0_COMPB ; Obsługa zgodności B porównania w timerze 0 0x010 rjmp TIM0_OVF ; Obsługa nadmiaru w timerze 0 0x011 rjmp SPI_STC ; Obsługa zakończenia transferu SPI 0x012 rjmp USART_RXC ; Obsługa zakończenia odczytu w USART 0x013 rjmp USART_UDRE ; Obsługa pustego rejestru danych USART 0x014 rjmp USART_TXC ; Obsługa końca nadawania USART 0x015 rjmp ADC ; Obsługa zakończenia konwersji w przetworniku A/C 0x016 rjmp EE_RDY ; Obsługa gotowości EEPROM 0x017 rjmp ANA_COMP ; Obsługa komparatora analogowego 0x018 rjmp TWI ; Obsługa 2-przewodowego interfejsu szeregowego 0x019 rjmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu ; 0x01A RESET: ldi r16, high(RAMEND); Początek programu głównego 0x01B out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x01C ldi r16, low(RAMEND) 0x01D out SPL,r16 0x01E sei ; Włączenie przerwań 0x01F <instr> xxx ... ... ... ... |
Gdy bit bezpiecznikowy BOOTRST jest niezaprogramowany ("1"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega88A/88PA jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x000 RESET: ldi r16, high(RAMEND); Początek programu głównego 0x001 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x002 ldi r16, low(RAMEND) 0x003 out SPL,r16 0x004 sei ; Włączenie przerwań 0x005 <instr> xxx ... ... ... ... .org 0xC01 0xC01 rjmp EXT_INT0 ; Obsługa IRQ0 0xC02 rjmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ... 0xC19 rjmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0") i rozmiar sekcji Boot jest ustawiony na 2 KB, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega88A/88PA jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze
.org 0x001
0x001 rjmp EXT_INT0 ; Obsługa IRQ0
0x002 rjmp EXT_INT1 ; Obsługa IRQ1
... ... ... ...
0x019 rjmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
.org 0xC00
0xC00 RESET: ldi r16, high(RAMEND); Początek programu głównego
0xC01 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0xC02 ldi r16, low(RAMEND)
0xC03 out SPL,r16
0xC04 sei ; Włączenie przerwań
0xC05 <instr> xxx
|
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega88A/88PA jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze
.org 0xC00
0xC00 rjmp RESET ; Obsługa resetu
0xC01 rjmp EXT_INT0 ; Obsługa IRQ0
0xC02 rjmp EXT_INT1 ; Obsługa IRQ1
... ... ... ...
0xC19 rjmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
0xC1A RESET: ldi r16, high(RAMEND); Początek programu głównego
0xC1B out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0xC1C ldi r16, low(RAMEND)
0xC1D out SPL,r16
0xC1E sei ; Włączenie przerwań
0xC1F <instr> xxx
|
| Nr | Adres(2) | Źródło | Definicja przerwania |
| 1 | 0x000 | RESET(1) | Końcówka zewnętrzna, włączenie zasilania, spadek napięcia zasilania, zakończenie zliczania w liczniku zegarowym |
| 2 | 0x002 | INT0 | Żądanie przerwania zewnętrznego nr 0 |
| 3 | 0x004 | INT1 | Żądanie przerwania zewnętrznego nr 1 |
| 4 | 0x006 | PCINT0 | Żądanie przerwania nr 0 od zmiany stanu końcówki zewnętrznej |
| 5 | 0x008 | PCINT1 | Żądanie przerwania nr 1 od zmiany stanu końcówki zewnętrznej |
| 6 | 0x00A | PCINT2 | Żądanie przerwania nr 2 od zmiany stanu końcówki zewnętrznej |
| 7 | 0x00C | WDT | Przerwanie od zakończenia okresu zliczania w liczniku zegarowym |
| 8 | 0x00E | TIMER2 COMPA | Zgodność porównania A w timerze/liczniku 2 |
| 9 | 0x010 | TIMER2 COMPB | Zgodność porównania B w timerze/liczniku 2 |
| 10 | 0x012 | TIMER2 OVF | Nadmiar w timerze/liczniku 2 |
| 11 | 0x014 | TIMER1 CAPT | Zdarzenie Input Capture w timerze/liczniku 1 |
| 12 | 0x016 | TIMER1 COMPA | Zgodność porównania A w timerze/liczniku 1 |
| 13 | 0x018 | TIMER1 COMPB | Zgodność porównania B w timerze/liczniku 1 |
| 14 | 0x01A | TIMER1 OVF | Nadmiar w timerze/liczniku 1 |
| 15 | 0x01C | TIMER0 COMPA | Zgodność porównania A w timerze/liczniku 0 |
| 16 | 0x01E | TIMER0 COMPB | Zgodność porównania B w timerze/liczniku 0 |
| 17 | 0x020 | TIMER0 OVF | Nadmiar w timerze/liczniku 0 |
| 18 | 0x022 | SPI, STC | Zakończenie przesłania szeregowego SPI |
| 19 | 0x024 | USART, RX | Zakończenie odczytu USART |
| 20 | 0x026 | USART, UDRE | Pusty rejestr danych USART |
| 21 | 0x028 | USART, TX | Zakończenie nadawania USART |
| 22 | 0x02A | ADC | Zakończenie konwersji w przetworniku analogowo/cyfrowym |
| 23 | 0x02C | EE READY | Gotowość EEPROM |
| 24 | 0x02E | ANALOG COMP | Komparator analogowy |
| 25 | 0x030 | TWI | 2-przewodowy interfejs szeregowy |
| 26 | 0x032 | SPM READY | Gotowość zapisu w pamięci programu |
| Uwagi: | 1. | Gdy został zaprogramowany bit bezpiecznikowy BOOTRST, mikrokontroler skoczy przy resecie pod adres Boot Loadera. |
| 2. | Gdy zostanie ustawiony bit IVSEL w rejestrze MCUCR, wektory przerwań przesuną się na początek sekcji Boot pamięci FLASH. W tym przypadku adres każdego wektora przerwań będzie sumą adresu w tej tablicy i adresu początku sekcji BOOT FLASH. |
Poniższa tabelka pokazuje umiejscowienie wektorów przerwań przy różnych kombinacjach ustawień BOOTRST i IVSEL. Jeśli program nigdy nie uaktywnia źródeł przerwań, to wektory przerwań nie są używane i w ich miejscu można umieścić zwykły kod. Tak samo jest również w przypadku, jeśli wektor resetu znajduje się w sekcji aplikacji, a wektory przerwań przemieszczono do sekcji Boot lub na odwrót.
| BOOTRST | IVSEL | Adres resetu | Adres początku wektorów przerwań |
| 1 | 0 | 0x0000 | 0x0002 |
| 1 | 1 | 0x0000 | Adres Boot Reset + 0x0002 |
| 0 | 0 | Adres Boot Reset | 0x0002 |
| 0 | 1 | Adres Boot Reset | Adres Boot Reset + 0x0002 |
Adres Boot Reset zależy od ustawień bitów bezpiecznikowych BOOTSZ, więcej informacji znajdziesz w podrozdziale "Samoprogramowanie pamięci FLASH".
Najbardziej typowe i ogólne ustawienie programu dla adresów wektorów resetu i przerwań w mikrokontrolerze ATmega168A/168PA jest następujące:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 jmp RESET ; Obsługa resetu 0x0002 jmp EXT_INT0 ; Obsługa IRQ0 0x0004 jmp EXT_INT1 ; Obsługa IRQ1 0x0006 jmp PCINT0 ; Obsługa PCINT0 0x0008 jmp PCINT1 ; Obsługa PCINT1 0x000A jmp PCINT2 ; Obsługa PCINT2 0x000C jmp WDT ; Obsługa timera licznika zegarowego 0x000E jmp TIM2_COMPA ; Obsługa zgodności A porównania w timerze 2 0x0010 jmp TIM2_COMPB ; Obsługa zgodności B porównania w timerze 2 0x0012 jmp TIM2_OVF ; Obsługa nadmiaru w timerze 2 0x0014 jmp TIM1_CAPT ; Obsługa Input Capture w timerze 1 0x0016 jmp TIM1_COMPA ; Obsługa zgodności A porównania w timerze 1 0x0018 jmp TIM1_COMPB ; Obsługa zgodności B porównania w timerze 1 0x001A jmp TIM1_OVF ; Obsługa nadmiaru w timerze 1 0x001C jmp TIM0_COMPA ; Obsługa zgodności A porównania w timerze 0 0x001E jmp TIM0_COMPB ; Obsługa zgodności B porównania w timerze 0 0x0020 jmp TIM0_OVF ; Obsługa nadmiaru w timerze 0 0x0022 jmp SPI_STC ; Obsługa zakończenia transferu SPI 0x0024 jmp USART_RXC ; Obsługa zakończenia odczytu w USART 0x0026 jmp USART_UDRE ; Obsługa pustego rejestru danych USART 0x0028 jmp USART_TXC ; Obsługa końca nadawania USART 0x002A jmp ADC ; Obsługa zakończenia konwersji w przetworniku A/C 0x002C jmp EE_RDY ; Obsługa gotowości EEPROM 0x002E jmp ANA_COMP ; Obsługa komparatora analogowego 0x0030 jmp TWI ; Obsługa 2-przewodowego interfejsu szeregowego 0x0032 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu ; 0x0034 RESET: ldi r16, high(RAMEND); Początek programu głównego 0x0035 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x0036 ldi r16, low(RAMEND) 0x0037 out SPL,r16 0x0038 sei ; Włączenie przerwań 0x0039 <instr> xxx ... ... ... ... |
Gdy bit bezpiecznikowy BOOTRST jest niezaprogramowany ("1"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega168A/168PA jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 RESET: ldi r16, high(RAMEND); Początek programu głównego 0x0001 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x0002 ldi r16, low(RAMEND) 0x0003 out SPL,r16 0x0004 sei ; Włączenie przerwań 0x0005 <instr> xxx ... ... ... ... .org 0x1C02 0x1C02 jmp EXT_INT0 ; Obsługa IRQ0 0x1C04 jmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ... 0x1C32 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0") i rozmiar sekcji Boot jest ustawiony na 2 KB, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega168A/168PA jest następująca:
| 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
... ... ... ...
0x0032 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
.org 0x1C00
0x1C00 RESET: ldi r16, high(RAMEND); Początek programu głównego
0x1C01 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0x1C02 ldi r16, low(RAMEND)
0x1C03 out SPL,r16
0x1C04 sei ; Włączenie przerwań
0x1C05 <instr> xxx
|
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega168A/168PA jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze
.org 0x1C00
0x1C00 jmp RESET ; Obsługa resetu
0x1C02 jmp EXT_INT0 ; Obsługa IRQ0
0x1C04 jmp EXT_INT1 ; Obsługa IRQ1
... ... ... ...
0x1C32 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
0x1C34 RESET: ldi r16, high(RAMEND); Początek programu głównego
0x1C35 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0x1C36 ldi r16, low(RAMEND)
0x1C37 out SPL,r16
0x1C38 sei ; Włączenie przerwań
0x1C39 <instr> xxx
|
| Nr | Adres(2) | Źródło | Definicja przerwania |
| 1 | 0x000 | RESET(1) | Końcówka zewnętrzna, włączenie zasilania, spadek napięcia zasilania, zakończenie zliczania w liczniku zegarowym |
| 2 | 0x002 | INT0 | Żądanie przerwania zewnętrznego nr 0 |
| 3 | 0x004 | INT1 | Żądanie przerwania zewnętrznego nr 1 |
| 4 | 0x006 | PCINT0 | Żądanie przerwania nr 0 od zmiany stanu końcówki zewnętrznej |
| 5 | 0x008 | PCINT1 | Żądanie przerwania nr 1 od zmiany stanu końcówki zewnętrznej |
| 6 | 0x00A | PCINT2 | Żądanie przerwania nr 2 od zmiany stanu końcówki zewnętrznej |
| 7 | 0x00C | WDT | Przerwanie od zakończenia okresu zliczania w liczniku zegarowym |
| 8 | 0x00E | TIMER2 COMPA | Zgodność porównania A w timerze/liczniku 2 |
| 9 | 0x010 | TIMER2 COMPB | Zgodność porównania B w timerze/liczniku 2 |
| 10 | 0x012 | TIMER2 OVF | Nadmiar w timerze/liczniku 2 |
| 11 | 0x014 | TIMER1 CAPT | Zdarzenie Input Capture w timerze/liczniku 1 |
| 12 | 0x016 | TIMER1 COMPA | Zgodność porównania A w timerze/liczniku 1 |
| 13 | 0x018 | TIMER1 COMPB | Zgodność porównania B w timerze/liczniku 1 |
| 14 | 0x01A | TIMER1 OVF | Nadmiar w timerze/liczniku 1 |
| 15 | 0x01C | TIMER0 COMPA | Zgodność porównania A w timerze/liczniku 0 |
| 16 | 0x01E | TIMER0 COMPB | Zgodność porównania B w timerze/liczniku 0 |
| 17 | 0x020 | TIMER0 OVF | Nadmiar w timerze/liczniku 0 |
| 18 | 0x022 | SPI, STC | Zakończenie przesłania szeregowego SPI |
| 19 | 0x024 | USART, RX | Zakończenie odczytu USART |
| 20 | 0x026 | USART, UDRE | Pusty rejestr danych USART |
| 21 | 0x028 | USART, TX | Zakończenie nadawania USART |
| 22 | 0x02A | ADC | Zakończenie konwersji w przetworniku analogowo/cyfrowym |
| 23 | 0x02C | EE READY | Gotowość EEPROM |
| 24 | 0x02E | ANALOG COMP | Komparator analogowy |
| 25 | 0x030 | TWI | 2-przewodowy interfejs szeregowy |
| 26 | 0x032 | SPM READY | Gotowość zapisu w pamięci programu |
| Uwagi: | 1. | Gdy został zaprogramowany bit bezpiecznikowy BOOTRST, mikrokontroler skoczy przy resecie pod adres Boot Loadera. |
| 2. | Gdy zostanie ustawiony bit IVSEL w rejestrze MCUCR, wektory przerwań przesuną się na początek sekcji Boot pamięci FLASH. W tym przypadku adres każdego wektora przerwań będzie sumą adresu w tej tablicy i adresu początku sekcji BOOT FLASH. |
Poniższa tabelka pokazuje umiejscowienie wektorów przerwań przy różnych kombinacjach ustawień BOOTRST i IVSEL. Jeśli program nigdy nie uaktywnia źródeł przerwań, to wektory przerwań nie są używane i w ich miejscu można umieścić zwykły kod. Tak samo jest również w przypadku, jeśli wektor resetu znajduje się w sekcji aplikacji, a wektory przerwań przemieszczono do sekcji Boot lub na odwrót.
| BOOTRST | IVSEL | Adres resetu | Adres początku wektorów przerwań |
| 1 | 0 | 0x0000 | 0x0002 |
| 1 | 1 | 0x0000 | Adres Boot Reset + 0x0002 |
| 0 | 0 | Adres Boot Reset | 0x0002 |
| 0 | 1 | Adres Boot Reset | Adres Boot Reset + 0x0002 |
Adres Boot Reset zależy od ustawień bitów bezpiecznikowych BOOTSZ, więcej informacji znajdziesz w podrozdziale "Samoprogramowanie pamięci FLASH".
Najbardziej typowe i ogólne ustawienie programu dla adresów wektorów resetu i przerwań w mikrokontrolerze ATmega328A/328PA jest następujące:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 jmp RESET ; Obsługa resetu 0x0002 jmp EXT_INT0 ; Obsługa IRQ0 0x0004 jmp EXT_INT1 ; Obsługa IRQ1 0x0006 jmp PCINT0 ; Obsługa PCINT0 0x0008 jmp PCINT1 ; Obsługa PCINT1 0x000A jmp PCINT2 ; Obsługa PCINT2 0x000C jmp WDT ; Obsługa timera licznika zegarowego 0x000E jmp TIM2_COMPA ; Obsługa zgodności A porównania w timerze 2 0x0010 jmp TIM2_COMPB ; Obsługa zgodności B porównania w timerze 2 0x0012 jmp TIM2_OVF ; Obsługa nadmiaru w timerze 2 0x0014 jmp TIM1_CAPT ; Obsługa Input Capture w timerze 1 0x0016 jmp TIM1_COMPA ; Obsługa zgodności A porównania w timerze 1 0x0018 jmp TIM1_COMPB ; Obsługa zgodności B porównania w timerze 1 0x001A jmp TIM1_OVF ; Obsługa nadmiaru w timerze 1 0x001C jmp TIM0_COMPA ; Obsługa zgodności A porównania w timerze 0 0x001E jmp TIM0_COMPB ; Obsługa zgodności B porównania w timerze 0 0x0020 jmp TIM0_OVF ; Obsługa nadmiaru w timerze 0 0x0022 jmp SPI_STC ; Obsługa zakończenia transferu SPI 0x0024 jmp USART_RXC ; Obsługa zakończenia odczytu w USART 0x0026 jmp USART_UDRE ; Obsługa pustego rejestru danych USART 0x0028 jmp USART_TXC ; Obsługa końca nadawania USART 0x002A jmp ADC ; Obsługa zakończenia konwersji w przetworniku A/C 0x002C jmp EE_RDY ; Obsługa gotowości EEPROM 0x002E jmp ANA_COMP ; Obsługa komparatora analogowego 0x0030 jmp TWI ; Obsługa 2-przewodowego interfejsu szeregowego 0x0032 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu ; 0x0034 RESET: ldi r16, high(RAMEND); Początek programu głównego 0x0035 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x0036 ldi r16, low(RAMEND) 0x0037 out SPL,r16 0x0038 sei ; Włączenie przerwań 0x0039 <instr> xxx ... ... ... ... |
Gdy bit bezpiecznikowy BOOTRST jest niezaprogramowany ("1"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega328/328P jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze 0x0000 RESET: ldi r16, high(RAMEND); Początek programu głównego 0x0001 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM 0x0002 ldi r16, low(RAMEND) 0x0003 out SPL,r16 0x0004 sei ; Włączenie przerwań 0x0005 <instr> xxx ... ... ... ... .org 0x3C02 0x3C02 jmp EXT_INT0 ; Obsługa IRQ0 0x3C04 jmp EXT_INT1 ; Obsługa IRQ1 ... ... ... ... 0x3C32 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu |
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0") i rozmiar sekcji Boot jest ustawiony na 2 KB, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega328/328P jest następująca:
| 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
... ... ... ...
0x0032 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
.org 0x3C00
0x3C00 RESET: ldi r16, high(RAMEND); Początek programu głównego
0x3C01 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0x3C02 ldi r16, low(RAMEND)
0x3C03 out SPL,r16
0x3C04 sei ; Włączenie przerwań
0x3C05 <instr> xxx
|
Gdy bit bezpiecznikowy BOOTRST jest zaprogramowany ("0"), rozmiar sekcji Boot jest ustawiony na 2 KB i bit IVSEL w rejestrze MCUCR jest ustawiany przed uaktywnieniem dowolnego przerwania, to najbardziej typowa konfiguracja programu dla adresów wektora resetu i wektorów przerwań w ATmega328/328P jest następująca:
| Przykład w kodzie maszynowym |
Adres Etykiety Kod Komentarze
.org 0x3C00
0x3C00 jmp RESET ; Obsługa resetu
0x3C02 jmp EXT_INT0 ; Obsługa IRQ0
0x3C04 jmp EXT_INT1 ; Obsługa IRQ1
... ... ... ...
0x3C32 jmp SPM_RDY ; Obsługa gotowości zapisu pamięci programu
;
0x3C34 RESET: ldi r16, high(RAMEND); Początek programu głównego
0x3C35 out SPH,r16 ; Ustawienie wskaźnika stosu na szczyt RAM
0x3C36 ldi r16, low(RAMEND)
0x3C37 out SPL,r16
0x3C38 sei ; Włączenie przerwań
0x3C39 <instr> xxx
|
Rejestr sterujący mikrokontrolera określa położenie tablicy wektorów przerwań.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x35 (0x55) | – | BODS(1) | BODSE(1) | PUD | – | – | IVSEL | IVCE | MCUCR |
| Zapis/Odczyt | O | Z/O | Z/O | Z/O | O | O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Uwaga: | 1. | Bity BODS i BODSE są dostępne jedynie w mikrokontrolerach picoPower: ATmega48PA/88PA/168PA/328P. |
Gdy bit IVSEL jest wyzerowany, to wektory przerwań są umieszczana na początku pamięci FLASH. Gdy jest on ustawiony na 1, wektory przerwań zostają przesunięte na początek sekcji boot-loadera w pamięci FLASH.
Aktualny adres startu sekcji boot-loadera jest określany przez bity bezpiecznikowe BOOTSZ. Szczegóły znajdziesz w rozdziale "Wsparcie boot-loadera, samoprogramowanie z opcją Read-While-Write". Aby uniknąć niezamierzonych zmian tablic przerwań, należy postępować wg specjalnej procedury zapisu w celu zmiany bitu IVSEL:
Podczas tej sekwencji przerwania są automatycznie zablokowane. Zostają one
zablokowane w takcie, w którym jest ustawiany bit IVCE i pozostają
zablokowane aż do końca instrukcji następującej po zapisie IVSEL. Jeśli bit
IVSEL nie zostanie zapisany, przerwania będą zablokowane przez cztery takty.
Stan bitu I w rejestrze SREG nie ulega zmianie w
trakcie tego automatycznego blokowania przerwań.
Uwaga: Jeśli wektory przerwań zostały umieszczone w sekcji boot-loadera oraz zaprogramowano bit blokujący BLB02, to przerwania są zablokowane przy wykonywaniu z sekcji aplikacji. Jeśli wektory przerwań zostały umieszczone w sekcji aplikacji i zaprogramowano bit blokujący BLB12, to przerwania są zablokowane przy wykonywaniu z sekcji boot-loadera. Zobacz do rozdziału "Wsparcie boot-loadera, samoprogramowanie z opcją Read-While-Write", gdzie znajdziesz więcej szczegółów na temat bitów blokujących.
Bit IVCE musi zostać zapisany logiczną jedynką, aby była możliwa zmiana biyu IVSEL. Bit IVCE jest zerowany sprzętowo po czterech taktach od zapisu doń lub po zapisie bitu IVSEL. Ustawienie bitu IVCE blokuje przerwania, jak wyjaśniono wyzej przy opisie bitu IVSEL. Zobacz na poniższy przykład.
| Przykład w kodzie maszynowym |
Move_interrupts: ; Uaktywnij zmianę wektorów przerwań ldi r16, (1<<IVCE) out MCUCR, r16 ; Przenieś przerwania do sekcji boot-loadera ldi r16, (1<<IVSEL) out MCUCR, r16 ret |
| Przykład w języku C |
void Move_interrupts(void) { /* Uaktywnij zmianę wektorów przerwań */ MCUCR = (1<<IVCE); /* Przenieś przerwania do sekcji boot-loadera */ 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 ©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.