Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
obrazek

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

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

©2026 mgr Jerzy Wałaszek

obrazek

Mikrokontrolery

ATmega8

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 KONSERWACJA
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 i reset od licznika zegarowego.
2 0x001 INT0 Żądanie przerwania zewnętrznego 0
3 0x002 INT1 Żądanie przerwania zewnętrznego 1
4 0x003 TIMER2_COMP Zgodność porównania w timerze/liczniku 2
5 0x004 TIMER2_OVF Przepełnienie timera/licznika 2
6 0x005 TIMER1_CAPT Zdarzenie Capture timera/licznika 1
7 0x006 TIMER1_COMPA Zgodność porównania A w timerze/liczniku 1
8 0x007 TIMER1_COMPB Zgodność porównania B w timerze/liczniku 1
9 0x008 TIMER1_OVF Przepełnienie timera/licznika 1
10 0x009 TIMER0_OVF Przepełnienie timera/licznika 0
11 0x00A SPI_STC Zakończenie transmisji szeregowej
12 0x00B USART_RXC Zakończenie odczytu USART
13 0x00C USART_UDRE Pusty rejestr danych USART
14 0x00D USART, TXC Zakończenie transmisji USART
15 0x00E ADC Zakończenie przetwarzania w przetworniku A/C
16 0x00F EE_RDY Gotowość EEPROM
17 0x010 ANA_COMP Komparator analogowy
18 0x011 TWI 2-przewodowy interfejs szeregowy
19 0x012 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 "Obsługa boot-loadera, 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ń
0 0 0x000 0x001
0 1 0x000 Adres reset boot + 0x001
1 0 Adres reset boot 0x001
1 1 Adres reset boot Adres reset boot + 0x001
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 ATmega8 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 TIM2_COMP  ; Obsługa porównania w timerze 2
0x004           rjmp TIM2_OVF   ; Obsługa przepełnienia timera 2
0x005           rjmp TIM1_CAPT  ; Obsługa zdarzenia Capture w timerze 1
0x006           rjmp TIM1_COMPA ; Obsługa porównania A w timerze 1
0x007           rjmp TIM1_COMPB ; Obsługa porównania B w timerze 1
0x008           rjmp TIM1_OVF   ; Obsługa przepełnienia timera 1
0x009           rjmp TIM0_OVF   ; Obsługa przepełnienia timera 0
0x00a           rjmp SPI_STC    ; Obsługa zakończenia transmisji SPI
0x00b           rjmp USART_RXC  ; Obsługa zakończenia odczytu USART
0x00c           rjmp USART_UDRE ; Obsługa pustego rejestru danych UDR
0x00d           rjmp USART_TXC  ; Obsługa zakończenia przesyłu USART
0x00e           rjmp ADC        ; Obsługa zakończenia przetwarzania w przetworniku A/C
0x00f           rjmp EE_RDY     ; Obsługa gotowości EEPROM
0x010           rjmp ANA_COMP   ; Obsługa komparatora analogowego
0x011           rjmp TWI        ; Obsługa 2-przewodowego interfejsu szeregowego
0x012           rjmp SPM_RDY    ; Obsługa gotowości zapisu do pamięci programu
;
0x013 RESET:    ldi r16,high(RAMEND); Początek programu głównego
0x014           out SPH,r16     ; Ustaw wskaźnik stosu na szczyt RAM
0x015           ldi r16,low(RAMEND)
0x016           out SPL,r16
0x017           sei             ; Włącz przerwania
0x018 <instr>   xxx
... ... ...

Gdy bit bezpiecznikowy BOOTRST nie 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
0x000           rjmp RESET  ; Obsługa Reset
;
0x001 RESET:    ldi r16,high(RAMEND); Start programu głównego
0x002           out SPH,r16 ; Ustaw wskaźnik stosu na szczyt RAM
0x003           ldi r16,low(RAMEND)
0x004           out SPL,r16
0x005           sei         ; Włącz przerwania
0x006 <instr>   xxx
;
.org 0xc01
0xc01           rjmp EXT_INT0 ; Obsługa IRQ0
0xc02           rjmp EXT_INT1 ; Obsługa IRQ1
... ... ... ;
0xc12           rjmp 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 0x001
0x001           rjmp EXT_INT0 ; Obsługa IRQ0
0x002           rjmp EXT_INT1 ; Obsługa IRQ1
... ... ... ;
0x012           rjmp SPM_RDY  ; Obsługa gotowości zapisu do pamięci programu
;
.org 0xc00
0xc00           rjmp RESET    ; Obsługa Reset
;
0xc01 RESET:    ldi r16,high(RAMEND); Start programu głównego
0xc02           out SPH,r16   ; Ustaw wskaźnik stosu na szczyt RAM
0xc03           ldi r16,low(RAMEND)
0xc04           out SPL,r16
0xc05           sei           ; Włącz przerwania
0xc06 <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 0xc00
0xc00           rjmp RESET    ; Obsługa Reset
0xc01           rjmp EXT_INT0 ; Obsługa IRQ0
0xc02           rjmp EXT_INT1 ; Obsługa IRQ1
... ... ... ;
0xc12           rjmp SPM_RDY  ; Obsługa gotowości zapisu do pamięci programu
0xc13 RESET:    ldi r16,high(RAMEND); Start programu głównego
0xc14           out SPH,r16   ; Ustaw wskaźnik stosu na szczyt RAM
0xc15           ldi r16,low(RAMEND)
0xc16           out SPL,r16
0xc17           sei           ; Włącz przerwania
0xc18 <instr>   xxx

do podrozdziału  do strony 

Przesuwanie wektorów przerwań pomiędzy sekcjami aplikacji i programu ładującego

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 IVSEL IVCE GICR
Zapis/Odczyt Z/O Z/O 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 "Obsługa boot-loadera, 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 ładującego 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 przerwaniai są wyłączone podczas wykonywania kodu w sekcji programu ładującego. Szczegóły na temat tych bitów blokujących znajdziesz w rozdziale "Obsługa boot-loadera, 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);
}

do podrozdziału  do strony 

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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.