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

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega640/1280/1281/2560/2561

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

Wektory przerwań w ATmega640/1280/1281/2560/2561

Numer wektora Adres programu(2) Źródło Definicja przerwania
1 0x0000(1) RESET Końcówka zewnętrzna, reset przy włączaniu, reset przy spadku napięcia zasilania, reset od licznika zegarowego, reset od JTAG AVR
2 0x0002 INT0 Żądanie przerwania zewnętrznego 0
3 0x0004 INT1 Żądanie przerwania zewnętrznego 1
4 0x0006 INT2 Żądanie przerwania zewnętrznego 2
5 0x0008 INT3 Żądanie przerwania zewnętrznego 3
6 0x000A INT4 Żądanie przerwania zewnętrznego 4
7 0x000C INT5 Żądanie przerwania zewnętrznego 5
8 0x000E INT6 Żądanie przerwania zewnętrznego 6
9 0x0010 INT7 Żądanie przerwania zewnętrznego 7
10 0x0012 PCINT0 Żądanie przerwania 0 od zmiany stanu końcówki
11 0x0014 PCINT1 Żądanie przerwania 1 od zmiany stanu końcówki
12 0x0016(3) PCINT2 Żądanie przerwania 2 od zmiany stanu końcówki
13 0x0018 WDT Przerwanie od przekroczenia zakresu zliczania w liczniku zegarowym
14 0x001A TIMER2 COMPA Zgodność porównania A w timerze/liczniku 2
15 0x001C TIMER2 COMPB Zgodność porównania B w timerze/liczniku 2
16 0x001E TIMER2 OVF Przekroczenie zakresu zliczania w timerze/liczniku 2
17 0x0020 TIMER1 CAPT Zdarzenie Input Capture w timerze/liczniku 1
18 0x0022 TIMER1 COMPA Zgodność porównania A w timerze/liczniku 1
19 0x0024 TIMER1 COMPB Zgodność porównania B w timerze/liczniku 1
20 0x0026 TIMER1 COMPC Zgodność porównania C w timerze/liczniku 1
21 0x0028 TIMER1 OVF Przekroczenie zakresu zliczania w timerze/liczniku 1
22 0x002A TIMER0 COMPA Zgodność porównania A w timerze/liczniku 0
23 0x002C TIMER0 COMPB Zgodność porównania B w timerze/liczniku 0
24 0x002E TIMER0 OVF Przekroczenie zakresu zliczania w timerze/liczniku 0
25 0x0030 SPI, STC Zakończenie przesłania szeregowego SPI
26 0x0032 USART0 RX Zakończenie odczytu przez moduł USART 0
27 0x0034 USART0 UDRE Pusty rejestr danych w module USART 0
28 0x0036 USART0 TX Zakończenie transmisji przez moduł USART 0
29 0x0038 ANALOG COMP Przerwanie z komparatora analogowego
30 0x003A ADC Zakończenie przetwarzania w przetworniku A/C
31 0x003C EE_READ Gotowość pamięci EEPROM
32 0x003E TIMER3 CAPT Zdarzenie Input Capture w timerze/liczniku 3
33 0x0040 TIMER3 COMPA Zgodność porównania A w timerze/liczniku 3
34 0x0042 TIMER3 COMPB Zgodność porównania B w timerze/liczniku 3
35 0x0044 TIMER3 COMPC Zgodność porównania C w timerze/liczniku 3
36 0x0046 TIMER3 OVF Przekroczenie zakresu zliczania w timerze/liczniku 3
37 0x0048 USART1 RX Zakończenie odczytu przez moduł USART 1
38 0x004A USART1 UDRE Pusty rejestr danych w module USART 1
39 0x004C USART1 TX Zakończenie transmisji przez moduł USART 1
40 0x004E TWI 2-przewodowy interfejs szeregowy
41 0x0050 SPM READY Gotowość zapisu do pamięci programu
42 0x0052(3) TIMER4 CAPT Zdarzenie Input Capture w timerze/liczniku 4
43 0x0054 TIMER4 COMPA Zgodność porównania A w timerze/liczniku 4
44 0x0056 TIMER4 COMPB Zgodność porównania B w timerze/liczniku 4
45 0x0058 TIMER4 COMPC Zgodność porównania C w timerze/liczniku 4
46 0x005A TIMER4 OVF Przekroczenie zakresu zliczania w timerze/liczniku 4
47 0x005C(3) TIMER5 CAPT Zdarzenie Input Capture w timerze/liczniku 5
48 0x005E TIMER5 COMPA Zgodność porównania A w timerze/liczniku 5
49 0x0060 TIMER5 COMPB Zgodność porównania B w timerze/liczniku 5
50 0x0062 TIMER5 COMPC Zgodność porównania C w timerze/liczniku 5
51 0x0064 TIMER5 OVF Przekroczenie zakresu zliczania w timerze/liczniku 5
52 0x0066(3) USART _RX Zakończenie odczytu przez moduł USART 2
53 0x0068(3) USART2 UDRE Pusty rejestr danych w module USART 2
54 0x006A(3) USART2 TX Zakończenie transmisji przez moduł USART 2
55 0x006C(3) USART3 RX Zakończenie odczytu przez moduł USART 3
56 0x006E(3) USART3 UDRE Pusty rejestr danych w module USART 3
57 0x0070(3) USART3 TX Zakończenie transmisji przez moduł USART 3
Uwagi: 1. Gdy został zaprogramowany bit bezpiecznikowy BOOTRST, mikrokontroler skoczy przy resecie do adresu programu ładującego, zobacz do rozdziału "Programowanie pamięci".
  2. Gdy zostanie ustawiony bit IVSEL w rejestrze MCUCR, to wektory przerwań będą 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. Dostępne tylko dla ATmega640/1280/2560.
Na początek:  podrozdziału   strony 

Rozmieszczenie wektorów przerwań i wektora resetu

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 ATmega640/1280/1281/2560/2561 jest następujące:

Przykład w kodzie maszynowym
Adres  Etykiety Kod             Komentarze
0x0000          jmp RESET       ; Sterownik Reset
0x0002          jmp INT0        ; Sterownik IRQ0
0x0004          jmp INT1        ; Sterownik IRQ1
0x0006          jmp INT2        ; Sterownik IRQ2
0x0008          jmp INT3        ; Sterownik IRQ3
0x000A          jmp INT4        ; Sterownik IRQ4
0x000C          jmp INT5        ; Sterownik IRQ5
0x000E          jmp INT6        ; Sterownik IRQ6
0x0010          jmp INT7        ; Sterownik IRQ7
0x0012          jmp PCINT0      ; Sterownik PCINT0
0x0014          jmp PCINT1      ; Sterownik PCINT1
0x0016          jmp PCINT2      ; Sterownik PCINT2
0X0018          jmp WDT         ; Sterownik zakończenia zliczania w liczniku zegarowym
0x001A          jmp TIM2_COMPA  ; Sterownik CompareA timera 2
0x001C          jmp TIM2_COMPB  ; Sterownik CompareB timera 2
0x001E          jmp TIM2_OVF    ; Sterownik przepełnienia licznika 2
0x0020          jmp TIM1_CAPT   ; Sterownik Input Capture w timerze 1
0x0022          jmp TIM1_COMPA  ; Sterownik Output Compare A timera 1
0x0024          jmp TIM1_COMPB  ; Sterownik Output Compare B timera 1
0x0026          jmp TIM1_COMPC  ; Sterownik Output Compare C timera 1
0x0028          jmp TIM1_OVF    ; Sterownik przepełnienia licznika 1
0x002A          jmp TIM0_COMPA  ; Sterownik Output Compare A timera 0
0x002C          jmp TIM0_COMPB  ; Sterownik Output Compare B timera 0
0x002E          jmp TIM0_OVF    ; Sterownik przepełnienia licznika 0
0x0030          jmp SPI_STC     ; Sterownik zakończenia przesyłu w SPI
0x0032          jmp USART0_RXC  ; Sterownik zakończenia odczytu w USART 0
0x0034          jmp USART0_UDRE ; Sterownik pustego rejestru danych w USART 0
0x0036          jmp USART0_TXC  ; Sterownik zakończenia nadawania w USART 0
0x0038          jmp ANA_COMP    ; Sterownik komparatora analogowego
0x003A          jmp ADC         ; Sterownik sterownik końca konwersji w przetworniku A/C 
0x003C          jmp EE_RDY      ; Sterownik gotowości EEPROM
0x003E          jmp TIM3_CAPT   ; Sterownik Input Capture w timerze 3
0x0040          jmp TIM3_COMPA  ; Sterownik Output Compare A timera 3
0x0042          jmp TIM3_COMPB  ; Sterownik Output Compare B timera 3
0x0044          jmp TIM3_COMPC  ; Sterownik Output Compare C timera 3
0x0046          jmp TIM3_OVF    ; Sterownik przepełnienia licznika 3
0x0048          jmp USART1_RXC  ; Sterownik zakończenia odczytu w USART 1
0x004A          jmp USART1_UDRE ; Sterownik pustego rejestru danych w USART 1
0x004C          jmp USART1_TXC  ; Sterownik zakończenia nadawania w USART 1
0x004E          jmp TWI         ; Sterownik 2-przewodowego interfejsu szeregowego
0x0050          jmp SPM_RDY     ; Sterownik sterownik gotowości instrukcji SPM
0x0052          jmp TIM4_CAPT   ; Sterownik Input Capture w timerze 4
0x0054          jmp TIM4_COMPA  ; Sterownik Output Compare A timera 4
0x0056          jmp TIM4_COMPB  ; Sterownik Output Compare B timera 4
0x0058          jmp TIM4_COMPC  ; Sterownik Output Compare C timera 4
0x005A          jmp TIM4_OVF    ; Sterownik przepełnienia licznika 4
0x005C          jmp TIM5_CAPT   ; Sterownik Input Capture w timerze 5
0x005E          jmp TIM5_COMPA  ; Sterownik Output Compare A timera 5
0x0060          jmp TIM5_COMPB  ; Sterownik Output Compare B timera 5
0x0062          jmp TIM5_COMPC  ; Sterownik Output Compare C timera 5
0x0064          jmp TIM5_OVF    ; Sterownik przepełnienia licznika 5
0x0066          jmp USART2_RXC  ; Sterownik zakończenia odczytu w USART 2
0x0068          jmp USART2_UDRE ; Sterownik pustego rejestru danych w USART 2
0x006A          jmp USART2_TXC  ; Sterownik zakończenia nadawania w USART 2
0x006C          jmp USART3_RXC  ; Sterownik zakończenia odczytu w USART 3
0x006E          jmp USART3_UDRE ; Sterownik pustego rejestru danych w USART 3
0x0070          jmp USART3_TXC  ; Sterownik zakończenia nadawania w USART 3
;
0x0072 RESET:   ldi r16,high(RAMEND)
; Początek programu głównego
0x0073          out SPH,r16     ; Ustaw wskaźnik stosu na szczyt RAM
0x0074          ldi r16,low(RAMEND)
0x0075          out SPL,r16
0x0076          sei             ; Włącz przerwania
0x0077          <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
0x00000 RESET:   ldi r16,high(RAMEND); Start programu głównego
0x00001          out SPH,r16         ; Ustaw wskaźnik stosu na szczyt RAM
0x00002          ldi r16,low(RAMEND)
0x00003          out SPL,r16
0x00004          sei                 ; Włącz przerwania
0x00005 <instr>  xxx
;
.org 0x1F002
0x1F002          jmp EXT_INT0        ; Sterownik IRQ0
0x1F004          jmp EXT_INT1        ; Sterownik IRQ1
:.      :.       :.                  :.
0x1F070          jmp USART3_TXC      ; Sterownik zakończenia nadawania w USART 3

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
0x00002          jmp EXT_INT0   ; Sterownik IRQ0
0x00004          jmp EXT_INT1   ; Sterownik IRQ1
:.      :.       :.             :.
0x00070          jmp USART3_TXC ; Sterownik zakończenia nadawania w USART 3
;
.org 0x1F000
0x1F000 RESET:   ldi r16,high(RAMEND); Start programu głównego
0x1F001          out SPH,r16    ; Ustaw wskaźnik stosu na szczyt RAM
0x1F002          ldi r16,low(RAMEND)
0x1F003          out SPL,r16
0x1F004          sei            ; Włącz przerwania
0x1F005 <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 0x1F000
0x1F000          jmp RESET      ; Obsługa Reset
0x1F002          jmp EXT_INT0   ; Obsługa IRQ0
0x1F004          jmp EXT_INT1   ; Obsługa IRQ1
:.      :.       :.             :.
0x1F070          jmp USART3_TXC ; Sterownik zakończenia nadawania w USART 3
;
0x1F072 RESET:   ldi r16,high(RAMEND); Start programu głównego
0x1F073          out SPH,r16    ; Ustaw wskaźnik stosu na szczyt RAM
0x1F074          ldi r16,low(RAMEND)
0x1F075          out SPL,r16
0x1F076          sei            ; Włącz przerwania
0x1F077 <instr>  xxx
Na początek:  podrozdziału   strony 

Przesuwanie przerwań pomiędzy sekcjami aplikacji i bootloadera

Rejestr sterujący mikrokontrolera (ang. MCU Control Register,  MCUCR) kontroluje położenie tablicy wektorów przerwań, zobacz do poniższego przykładu. Więcej szczegółów znajdziesz w podrozdziale "Reset i obsługa przerwań".
Przykład w kodzie maszynowym
Move_interrupts:
    ; Pobierz MCUCR
    in r16, MCUCR
    mov r17, r16

    ; Włącz zmianę wektorów przerwań
    ori r16, (1<<IVCE)
    out MCUCR, r16

    ; Przenieś przerwania do sekcji Boot FLASH
    ori r16, (1<<IVSEL)
    out MCUCR, r17
    ret
Przykład w języku C
void Move_interrupts(void)
{
    uchar temp;
    /* Pobierz MCUCR */
    temp = MCUCR;
    /* Włącz zmianę wektorów przerwań */
    MCUCR = temp|(1<<IVCE);
    /* Przenieś przerwania do sekcji Boot FLASH */
    MCUCR = temp|(1<<IVSEL);
}
Na początek:  podrozdziału   strony 

Opis rejestrów

MCUCR – MCU Control Register –  Rejestr sterujący mikrokontrolerem

Bit 7 6 5 4 3 2 1 0  
0x35 (0x55) JTD PUD IVSEL IVCE MCUCR
Zapis/Odczyt Z/O O O Z/O O O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

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

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 "Programowanie pamięci". Aby uniknąć niezamierzonych zmian tablic wektorów przerwań, należy wykonać specjalną procedurę zapisu, aby zmienić bit IVSEL bit:

  1. Ustaw bit włączenia zmian wektorów przerwań (IVCE) na jeden.
  2. W ciągu czterech cykli wpisz pożądaną wartość do IVSEL, jednocześnie wpisując zero do IVCE.

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 "Programowanie pamięci".

Bit 0 – IVCE: Interrupt Vector Change Enable – Włączenie zmiany wektorów przerwań

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.

Na początek:  podrozdziału   strony 

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.