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

ATmega64

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ń ATmega64

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

Przesuwanie wektorów przerwań pomiędzy sekcjami aplikacji i programu bootloadera

Położenie tablicy wektorów przerwań określa rejestr sterujący mikrokontrolera, MCUCR.
Na początek:  podrozdziału   strony 

Opis rejestrów

MCUCR – MCU Control Register – Rejestr sterujący mikrokontrolera

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  

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 "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:

  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 "Wsparcie dla programu startowego – odczyt przy zapisie i samoprogramowanie".

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. 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);
}
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.