Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
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. |
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 |
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); } |
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 |
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:
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 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.
![]() |
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.