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

ATmega32

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ń

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 INT2 Żądanie przerwania zewnętrznego 2
5 0x008 TIMER2_COMP Zgodność porównania w timerze/liczniku 2
6 0x00A TIMER2_OVF Przepełnienie timera/licznika 2
7 0x00C TIMER1_CAPT Zdarzenie Capture timera/licznika 1
8 0x00E TIMER1_COMPA Zgodność porównania A w timerze/liczniku 1
9 0x010 TIMER1_COMPB Zgodność porównania B w timerze/liczniku 1
10 0x012 TIMER1_OVF Przepełnienie timera/licznika 1
11 0x014 TIMER0_COMP Zgodność porównania w timerze/liczniku 0
12 0x016 TIMER0_OVF Przepełnienie timera/licznika 0
13 0x018 SPI_STC Zakończenie transmisji szeregowej
14 0x01A USART_RXC Zakończenie odczytu USART
15 0x01C USART_UDRE Pusty rejestr danych USART
16 0x01E USART_TXC Zakończenie transmisji USART
17 0x020 ADC Zakończenie przetwarzania w przetworniku A/C
18 0x022 EE_RDY Gotowość EEPROM
19 0x024 ANA_COMP Komparator analogowy
20 0x026 TWI 2-przewodowy interfejs szeregowy
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 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 ATmega32 jest następujące:

Przykład w kodzie maszynowym
Adres Etykiety Kod            Komentarze
$000           jmp RESET      ; Obsługa resetu
$002           jmp EXT_INT0   ; Obsługa IRQ0
$004           jmp EXT_INT1   ; Obsługa IRQ1
$006           jmp EXT_INT2   ; Obsługa IRQ2
$008           jmp TIM2_COMP  ; Obsługa porównania w timerze 2
$00A           jmp TIM2_OVF   ; Obsługa przepełnienia timera 2
$00C           jmp TIM1_CAPT  ; Obsługa zdarzenia Capture w timerze 1
$00E           jmp TIM1_COMPA ; Obsługa porównania A w timerze 1
$010           jmp TIM1_COMPB ; Obsługa porównania B w timerze 1
$012           jmp TIM1_OVF   ; Obsługa przepełnienia timera 1
$014           jmp TIM0_COMP  ; Obsługa porównania w timerze 0
$016           jmp TIM0_OVF   ; Obsługa przepełnienia timera 0
$018           jmp SPI_STC    ; Obsługa zakończenia transmisji SPI
$01A           jmp USART_RXC  ; Obsługa zakończenia odczytu USART
$01C           jmp USART_UDRE ; Obsługa pustego rejestru danych UDR
$01E           jmp USART_TXC  ; Obsługa zakończenia przesyłu USART
$020           jmp ADC        ; Obsługa zakończenia przetwarzania w przetworniku A/C
$022           jmp EE_RDY     ; Obsługa gotowości EEPROM
$024           jmp ANA_COMP   ; Obsługa komparatora analogowego
$026           jmp TWI        ; Obsługa 2-przewodowego interfejsu szeregowego
$028           jmp SPM_RDY    ; Obsługa gotowości zapisu do pamięci programu
;
$02A RESET:    ldi r16,high(RAMEND); Początek programu głównego
$02B           out SPH,r16    ; Ustaw wskaźnik stosu na szczyt RAM
$02C           ldi r16,low(RAMEND)
$02D           out SPL,r16
$02E           sei            ; Włącz przerwania
$02F <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
$000 RESET:     ldi r16,high(RAMEND); Start programu głównego
$001            out SPH,r16  ; Ustaw wskaźnik stosu na szczyt RAM
$002            ldi r16,low(RAMEND)
$003            out SPL,r16
$004            sei          ; Włącz przerwania
$005 <instr>    xxx
;
.org $3802
$3802           jmp EXT_INT0 ; Obsługa IRQ0
$3804           jmp EXT_INT1 ; Obsługa IRQ1
... ... ... ;
$3828           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 $002
$002            jmp EXT_INT0 ; Obsługa IRQ0
$004            jmp EXT_INT1 ; Obsługa IRQ1
... ... ... ;
$028            jmp SPM_RDY  ; Obsługa gotowości zapisu do pamięci programu
;
.org $3800
$3800 RESET:    ldi r16,high(RAMEND); Start programu głównego
$3801           out SPH,r16  ; Ustaw wskaźnik stosu na szczyt RAM
$3802           ldi r16,low(RAMEND)
$3803           out SPL,r16
$3804           sei          ; Włącz przerwania
$3805 <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 $3800
$3800          jmp RESET     ; Obsługa Reset
$3801          jmp EXT_INT0  ; Obsługa IRQ0
$3804          jmp EXT_INT1  ; Obsługa IRQ1
... ... ... ;
$3828          jmp SPM_RDY   ; Obsługa gotowości zapisu do pamięci programu
$382A RESET:   ldi r16,high(RAMEND); Start programu głównego
$382B          out SPH,r16   ; Ustaw wskaźnik stosu na szczyt RAM
$382C          ldi r16,low(RAMEND)
$382D          out SPL,r16
$382E          sei           ; Włącz przerwania
$382F <instr>  xxx
Na początek:  podrozdziału   strony 

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

Ogólny rejestr sterujący przerwaniami (ang. General Interrupt Control Register) określa położenie tablicy wektorów przerwań.

GICR – General Interrupt Control Register – Ogólny rejestr sterujący przerwaniami

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  

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