Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega48A/PA/88A/PA/168A/PA/328/P

Przerwania

obrazek

Educational and Non-Profit Use of Copyrighted Material:

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: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Ten rozdział opisuje specyfikę obsługi przerwań w mikrokontrolerach ATmega48A/PA/88A/PA/168A/PA/328/P. Ogólne wyjaśnienie obsługi przerwań w mikrokontrolerze AVR znajdziesz w rozdziale "Reset i obsługa przerwań".

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:

Wektory przerwań ATmega48A/48PA

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
...             ... ...         ...
Na początek:  podrozdziału   strony 

Wektory przerwań ATmega88A/88PA

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
Na początek:  podrozdziału   strony 

Wektory przerwań ATmega168A/168PA

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
Na początek:  podrozdziału   strony 

Wektory przerwań ATmega328A/328PA

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
Na początek:  podrozdziału   strony 

Opis rejestrów

Przesuwanie wektorów przerwań pomiędzy obszarem aplikacji i boot loadera, ATmega88A/88PA, ATmega168A/168PA i ATmega328/328P

Rejestr sterujący mikrokontrolera określa położenie tablicy wektorów przerwań.

MCUCR – MCU Control Register – Rejestr sterujący mikrokontrolera

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.

Bit 1 – IVSEL: Interrupt Vector Select – Wybór wektorów przerwań

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:

  1. Zapisz jedynkę do bitu uaktywnienia zmian wektorów przerwań (ang. Interrupt Vector Change Enable, IVCE).
  2. W ciągu czterech taktów wpisz pożądaną wartość do IVDEL, jednocześnie wpisując zero do bitu IVCE.


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 0 – IVCE: Interrupt Vector Change Enable – Uaktywnienie zmian wektorów przerwań

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
©2021 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.