12.   Interrupts

Dieser Abschnitt beschreibt die Behandlung der Interrupts.

Hinweise:

  1. Wenn die BOOTRST-Fuse programmiert ist, dann springt der Baustein an die Reset-Adresse im Urlader-Bereich
  2. Wenn das IVSEL-Bit im GICR-Register gesetzt ist, werden alle Interrupt-Vektoren an den Beginn des Boot-Sektors verschoben. Die Einsprungadresse der Interrupts ergibt sich dann aus der angegebenen Adresse plus der Startadresse des Urlader-Bereiches.
Die nachfolgenden Tabellen zeigen die Lage der Interrupt- und des Reset-Vektors bei den verschiedenen Kombinationen der BOOTRST- und IVSEL-Einstellungen. Wenn ein Programm nie Interrupts freigibt, so werden die Interrupt-Vektoren nicht benötigt, und das Hauptprogramm kann ab der Reset-Adresse liegen. Das gilt auch für den Fall, in dem der Reset-Vektor im Applikationsbereich und die Interrupt-Vektoren im Urlader-Bereich liegen bzw. umgekehrt.

12.1   Interruptvektoren im ATmega48

Tabelle 12-1: Reset- und Interruptvektoren im ATmega48
Vektor-Nr.Flash-AdresseQuelleDefinition
10x000RESETExternal Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
20x001INT0Externer Interrupt 0
30x002INT1Externer Interrupt 1
40x003PCINT0Pegelwechsel-Interrupt 0
50x004PCINT1Pegelwechsel-Interrupt 1
60x005PCINT2Pegelwechsel-Interrupt 2
70x006WDTWatchdog Time-out Interrupt
80x007TIMER2 COMPAZähler/Zeitgeber2 Compare Match A
90x008TIMER2 COMPBZähler/Zeitgeber2 Compare Match B
100x009TIMER2 OVFZähler/Zeitgeber2 Overflow
110x00ATIMER1 CAPTZähler/Zeitgeber1 Capture Event
120x00BTIMER1 COMPAZähler/Zeitgeber1 Compare Match A
130x00CTIMER1 COMPBZähler/Zeitgeber1 Compare Match B
140x00DTIMER1 OVFZähler/Zeitgeber1 Overflow
150x00ETIMER0 COMPAZähler/Zeitgeber0 Compare Match A
160x00FTIMER0 COMPBZähler/Zeitgeber0 Compare Match B
170x010TIMER0 OVFZähler/Zeitgeber0 Overflow
180x011SPI, STCSPI Serielle Aussendung beendet
190x012USART, RXUSART: Datenbyte empfangen
200x013USART, UDREUSART: Datenregister leer
210x014USART, TXUSART: Datenbyte gesendet
220x015ADCAnalog-Digital-Wandlung beendet
230x016EE READYEEPROM bereit
240x017ANALOG COMPFlanke am Analogvergleicher
250x018TWI2-wire Serial Interface
260x019SPM READYStore Program Memory Ready

Typischerweise sieht es in einem Programm wie folgt aus:

Adresse	Marken	Kode			Kommentar
0x000		rjmp	RESET		; Reset-Behandler
0x001		rjmp	EXT_INT0	; IRQ0-Behandler
0x002		rjmp	EXT_INT1	; IRQ1-Behandler
0x003		rjmp	TIM2_COMP	; Timer2-Vergleich-Behandler
0x004		rjmp	TIM2_OVF	; Timer2-Überlauf-Behandler
0x005		rjmp	TIM1_CAPT	; Timer1-Schnappschuss-Behandler
0x006		rjmp	TIM1_COMPA	; Timer1-VergleichA-Behandler
0x007		rjmp	TIM1_COMPB	; Timer1-VergleichB-Behandler
0x008		rjmp	TIM1_OVF	; Timer1-Überlauf-Behandler
0x009		rjmp	TIM0_OVF	; Timer0-Überlauf-Behandler
0x00a		rjmp	SPI_STC		; Behandler bei SPI Übertragung komplett
0x00b		rjmp	USART_RXC	; USART-Empfang-Behandler
0x00c		rjmp	USART_UDRE	; UDR-leer-Behandler
0x00d		rjmp	USART_TXC	; USART-Gesendet-Behandler
0x00e		rjmp	ADC		; ADU-fertig-Behandler
0x00f		rjmp	EE_RDY		; EEPROM-fertig-Behandler
0x010		rjmp	ANA_COMP	; Analogvergleicher-Behandler
0x011		rjmp	TWSI		; TWI-Behandler
0x012		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
;
0x013	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0x014		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0x015		ldi	r16,low(RAMEND)
0x016		out	SPL,r16
0x017		sei			; Interrupts freigeben
0x018		<instr>	xxx
...		...	...

12.2   Interruptvektoren im ATmega88

Tabelle 12-2: Reset- und Interruptvektoren im ATmega88
Vektor-Nr.Flash-Adresse(2)QuelleDefinition
10x000(1)RESETExternal Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
20x001INT0Externer Interrupt 0
30x002INT1Externer Interrupt 1
40x003PCINT0Pegelwechsel-Interrupt 0
50x004PCINT1Pegelwechsel-Interrupt 1
60x005PCINT2Pegelwechsel-Interrupt 2
70x006WDTWatchdog Time-out Interrupt
80x007TIMER2 COMPAZähler/Zeitgeber2 Compare Match A
90x008TIMER2 COMPBZähler/Zeitgeber2 Compare Match B
100x009TIMER2 OVFZähler/Zeitgeber2 Overflow
110x00ATIMER1 CAPTZähler/Zeitgeber1 Capture Event
120x00BTIMER1 COMPAZähler/Zeitgeber1 Compare Match A
130x00CTIMER1 COMPBTimer/Coutner1 Compare Match B
140x00DTIMER1 OVFZähler/Zeitgeber1 Overflow
150x00ETIMER0 COMPAZähler/Zeitgeber0 Compare Match A
160x00FTIMER0 COMPBZähler/Zeitgeber0 Compare Match B
170x010TIMER0 OVFZähler/Zeitgeber0 Overflow
180x011SPI, STCSPI Serial Transfer Complete
190x012USART, RXUSART Rx Complete
200x013USART, UDREUSART, Data Register Empty
210x014USART, TXUSART, Tx Complete
220x015ADCADC Conversion Complete
230x016EE READYEEPROM Ready
240x017ANALOG COMPAnalog Comparator
250x018TWI2-wire Serial Interface
260x019SPM READYStore Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-3: Reset- und Interruptvektoren im ATmega88
BOOTRSTIVSELReset-AdresseStartadresse der Interruptvektoren
100x0000x001
110x000Urlader-Reset-Adresse + 0x001
00Urlader-Reset-Adresse0x001
01Urlader-Reset-AdresseUrlader-Reset-Adresse + 0x001
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.

Wenn die BOOTRST-Fuse unprogrammiert ist, die Größe des Boot-Sektors 2 KByte beträgt und das IVSEL-Bit im GICR-Register gesetzt wird, bevor irgendein Interrupt freigegeben wird, dann sieht ein typisches Programm etwa so aus:

Adresse	Marken	Kode			Kommentar
0x000		rjmp	RESET		; Reset-Behandler
;
0x001	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0x002		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0x003		ldi	r16,low(RAMEND)
0x004		out	SPL,r16
0x005		sei			; Interrupts freigeben
0x006		<instr>  xxx
;
.org 0xc01
0xc01		rjmp	EXT_INT0	; IRQ0-Behandler
0xc02		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		; 
0xc12		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig

Wenn die BOOTRST-Fuse programmiert ist und der Boot-Sektor eine Größe von 2 KByte hat, dann sieht eine Programm typischerweise so aus:

Adresse	Marken	Kode			Kommentar
.org 0x001
0x001		rjmp	EXT_INT0	; IRQ0-Behandler
0x002		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		; 
0x012		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
;
.org 0xc00
0xc00		rjmp	RESET		; Reset-Behandler
;
0xc01	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0xc02		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0xc03		ldi	r16,low(RAMEND)
0xc04		out	SPL,r16
0xc05		sei			; Interrupts freigeben
0xc06		<instr>  xxx

Wenn die BOOTRST-Fuse programmiert ist, die Größe des Boot-Sektors 2 KByte beträgt und das IVSEL-Bit im GICR-Register gesetzt wird, bevor irgendein Interrupt freigegeben wird, dann sieht ein typisches Programm etwa so aus:

Adresse	Marken	Kode			Kommentar
.org 0xc00
0xc00		rjmp	RESET		; Reset-Behandler
0xc01		rjmp	EXT_INT0	; IRQ0-Behandler
0xc02		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		; 
0xc12		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
0xc13	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0xc14		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0xc15		ldi	r16,low(RAMEND)
0xc16		out	SPL,r16
0xc17		sei			; Interrupts freigeben
0xc18		<instr>  xxx

12.3   Interruptvektoren im ATmega168

Tabelle 12-4: Reset- und Interruptvektoren im ATmega168
Vektor-Nr.Flash-Adresse(2)QuelleDefinition
10x000(1)RESETExternal Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
20x002INT0Externer Interrupt 0
30x004INT1Externer Interrupt 1
40x006PCINT0Pegelwechsel-Interrupt 0
50x008PCINT1Pegelwechsel-Interrupt 1
60x00APCINT2Pegelwechsel-Interrupt 2
70x00CWDTWatchdog Time-out Interrupt
80x00ETIMER2 COMPAZähler/Zeitgeber2 Compare Match A
90x010TIMER2 COMPBZähler/Zeitgeber2 Compare Match B
100x012TIMER2 OVFZähler/Zeitgeber2 Overflow
110x014TIMER1 CAPTZähler/Zeitgeber1 Capture Event
120x016TIMER1 COMPAZähler/Zeitgeber1 Compare Match A
130x018TIMER1 COMPBTimer/Coutner1 Compare Match B
140x01ATIMER1 OVFZähler/Zeitgeber1 Overflow
150x01CTIMER0 COMPAZähler/Zeitgeber0 Compare Match A
160x01ETIMER0 COMPBZähler/Zeitgeber0 Compare Match B
170x020TIMER0 OVFZähler/Zeitgeber0 Overflow
180x022SPI, STCSPI Serial Transfer Complete
190x024USART, RXUSART Rx Complete
200x026USART, UDREUSART, Data Register Empty
210x028USART, TXUSART, Tx Complete
220x02AADCADC Conversion Complete
230x02CEE READYEEPROM Ready
240x02EANALOG COMPAnalog Comparator
250x030TWI2-wire Serial Interface
260x032SPM READYStore Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-5: Reset- und Interruptvektoren im ATmega168
BOOTRSTIVSELReset-AdresseStartadresse der Interruptvektoren
100x0000x002
110x000Urlader-Reset-Adresse + 0x002
00Urlader-Reset-Adresse0x002
01Urlader-Reset-AdresseUrlader-Reset-Adresse + 0x002
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.

12.4   Interruptvektoren im ATmega328

Tabelle 12-6: Reset- und Interruptvektoren im ATmega328
Vektor-Nr.Flash-Adresse(2)QuelleDefinition
10x000(1)RESETExternal Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
20x002INT0Externer Interrupt 0
30x004INT1Externer Interrupt 1
40x006PCINT0Pegelwechsel-Interrupt 0
50x008PCINT1Pegelwechsel-Interrupt 1
60x00APCINT2Pegelwechsel-Interrupt 2
70x00CWDTWatchdog Time-out Interrupt
80x00ETIMER2 COMPAZähler/Zeitgeber2 Compare Match A
90x010TIMER2 COMPBZähler/Zeitgeber2 Compare Match B
100x012TIMER2 OVFZähler/Zeitgeber2 Overflow
110x014TIMER1 CAPTZähler/Zeitgeber1 Capture Event
120x016TIMER1 COMPAZähler/Zeitgeber1 Compare Match A
130x018TIMER1 COMPBTimer/Coutner1 Compare Match B
140x01ATIMER1 OVFZähler/Zeitgeber1 Overflow
150x01CTIMER0 COMPAZähler/Zeitgeber0 Compare Match A
160x01ETIMER0 COMPBZähler/Zeitgeber0 Compare Match B
170x020TIMER0 OVFZähler/Zeitgeber0 Overflow
180x022SPI, STCSPI Serial Transfer Complete
190x024USART, RXUSART Rx Complete
200x026USART, UDREUSART, Data Register Empty
210x028USART, TXUSART, Tx Complete
220x02AADCADC Conversion Complete
230x02CEE READYEEPROM Ready
240x02EANALOG COMPAnalog Comparator
250x030TWI2-wire Serial Interface
260x032SPM READYStore Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-7: Reset- und Interruptvektoren im ATmega328
BOOTRSTIVSELReset-AdresseStartadresse der Interruptvektoren
100x0000x002
110x000Urlader-Reset-Adresse + 0x002
00Urlader-Reset-Adresse0x002
01Urlader-Reset-AdresseUrlader-Reset-Adresse + 0x002
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.
A.d.Ü.: Das Laden von SPH und SPL (Stapelzeiger) nach RESET ist unnötig, da RESET bereits SPH und SPL korrekt initialisiert.

12.5   Register-Beschreibung

12.5.1   Interruptvektoren zwischen Anwender- und Urlader-Region umsetzen

Bit76543210
(0x55)--BODS(1)-BODSE(1)PUDIVSELIVCEMCUCR
ZugriffRR/WR/WR/WRRR/WR/W
Startwert00000000
Hinweis:
  1. BODS und BODSE sind nur in den PicoPower-Controllern ATmega48PA/88PA/168PA/32P verfügbar.
Wenn das IVSEL-Bit gelöscht ist, liegen alle Interrupt-Vektoren am Anfang des Programmspeichers. Wenn das Bit auf 1 gesetzt wird, liegen alle Interrupt-Vektoren am Anfang des Urlader-Bereichs. Die tatsächliche Adresse des Anfangs des Urlader-Bereichs wird durch die BOOTSZ-Fuses bestimmt. Siehe Urlader-Unterstützung. Um unkontrollierte Verschiebungen der Interrupt-Vektoren zu verhindern, ist eine spezielle Sequenz für das Ändern des IVSEL-Bist erforderlich:
  1. Schreiben einer 1 in das IVCE-Bit
  2. Innerhalb von vier Taktzyklen den neuen Wert für das ICSEL-Bit einschreiben bei gleichzeitigem Löschen des IVCE-Bits.
Die Interrupts werden automatisch gesperrt, während diese Sequenz ausgeführt wird. Die Sperre beginnt mit dem Setzen des IVCE-Bits und sie bleibt so lange erhalten, bis der neue Wert in des ICSEL-Bit geschrieben wurde oder die vier Taktzyklen vorüber sind. Dass I-Bit im Status-Register bleibt von diesen Vorgängen unberührt.

Hinweis:
Wenn die Interrupt-Vektoren im Bootbereich liegen und das Boot-Sperr-Bit BLB02 programmiert ist, sind die Interrupts gesperrt, während der Programmteil im Applikationsbereich ausgeführt wird. Umgekehrt gilt, dass, wenn die Interrupt-Vektoren im Applikationsbereich liegen und das Boot-Sperr-Bit BLBV12 programmiert ist, die Interrupts gesperrt sind, wenn ein Programmteil im Bootbereich abgearbeitet wird.
Das Bit IVCE muss mit einer 1 beschrieben werden, um das Ändern des IVSEL-Bits freizugeben. Das IVCE-Bit wird durch die Hardware automatisch gelöscht, wenn nach dem Setzen des Bits vier Taktzyklen vergangen sind oder das ICSEL-Bit beschrieben wird. Durch das Setzen des IVCE-Bits werden alle Interrupts wie in den Erklärungen zum IVSEL-Bit beschrieben, gesperrt.
Beispiel in Assembler
Move_interrupts:
    ; Wechsel der Interruptvektoren erlauben
	ldi  r16, (1<<IVCE)
	out  GICR, r16
    ; Interruptvektoren zum Boot-Bereich umsetzen
	ldi  r16, (1<<IVSEL)
	out  GICR, r16
	ret
Beispiel in C
void Move_interrupts(void) {
  /* Wechsel der Interruptvektoren erlauben */
  GICR = (1<<IVCE);
  /* Interruptvektoren zum Boot-Bereich umsetzen */
  GICR = (1<<IVSEL);
}