2.1 Atmega-Peripherie/Interrupts

Ähnliche Dokumente
Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

2

Mikrocomputertechnik

B4 Interrupts (Unterbrechungen)

U5-2 Register beim AVR-µC

Interruptsystem AVR. Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) Rücksprungadresse automatisch am Stack.

AVR-Mikrocontroller in BASCOM programmieren, Teil 2

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

Atmel AVR für Dummies

Assembler-Unterprogramme

Einführung in AVR-Assembler

Einführung in AVR Assembler

Tag 2 Eingabe und Interrupts

Sprungbefehle und Kontroll-Strukturen

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

E Mikrocontroller-Programmierung

Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen.

Interrupts. Funktionsprinzip. Funktionsprinzip. Beispiel in C

1.7 Atmega-Programmierung in ASM/Verschachtelte Schleifen

Aufbau eines Assembler-Programms

U Abend 3: Musterlösungen, Taster entprellen, Unterprozeduren, Interrupts, Timer

4.1 Peripherie ansprechen in C/LCD

Forth-Vokabular. Vokabular für Attiny2313-Forth Stand: A: Assembler-Wort F: Forth-Wort C: Compiler-Wort

U5 Fortgeschrittene AVR-Programmierung

Lösungen zum Kurs "Mikrocontroller Hard- und Software

Konzepte von Betriebssystem- Komponenten Ausnahme- / Unterbrechungsbehandlung

C4 Die SPI Schnittstelle

B1 Stapelspeicher (stack)

Schritt Aktion Erläuterung 1 UBRR auf 25 setzen Baudrate auf 9600 TXEN-Bit von UCSRB auf 1 setzen

Einführung in die Welt der Microcontroller

IR NEC Empfänger mit 4x7 LED Anzeige (ATtiny2313)

Einführung in die Programmierung von Mikrocontrollern mit C/C++

U2 Fortgeschrittene AVR-Programmierung. U2-1 Externe Interrupts des AVR-μC. 1 Flanken-/Pegel-Steuerung. 1 Flanken-/Pegel-Steuerung (2) 2 Maskieren

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Implementierung von Interruptbehandlungen. Interrupts

Name : Klasse : Punkte : Note :

Interruptverarbeitung

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

8. Beschreibung des Prozessors MSP 430

Multitasking / virtuelle Maschinen mittels Atmel AVR- Mikrocontrollern (Simple & Stupid)

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

myavr Programmierung in C

U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung. Synchronisation mit Unterbrechungsbehandlungen

Rechnerarchitektur Atmega Vortrag Atmega 32. Von Urs Müller und Marion Knoth. Urs Müller Seite 1 von 7

Das Attiny-Projekt Der Bootloader 1

Zeiger vom Typ (void *) sind am besten für Zeigerarithmetik geeignet, da sie kompatibel zu jedem Zeigertyp sind.

Das Attiny-Projekt Assemblieren 1

Interrupts & I/O-Ports

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil VI: Programmieren an weiteren Beispielen

Timer. Funktionsprinzip

Zusammenfassung der Assemblerbefehle des 8051

1.9 Atmega-Programmierung in ASM/LED-Ziffernanzeige

Einführung Microcontroller

Name : Klasse : Punkte : Note :

Interrupt. Externe Interrupts 0 und 1

Teil 6: PIC Studiengang Technische Informatik (TI) Prof. Dr.-Ing. Alfred Rożek. nur für Lehrzwecke Vervielfältigung nicht gestattet

Übungen zu Systemnahe Programmierung in C (SPiC)

Grundlagen der Informatik 2 Modul Systemnahe Programmierung in C (SPiC) Klausur am 25. Juli 2008

05. Assembler-Programmierung. Datenstrukturen des ATMega32. Literatur

4.0 Der Atmel AT89LPx052 Mikrocontroller

Übungsaufgaben. Stand

Mikrocontrollertechnik C2 Timer. Einführung

a) Welche Aussage zu Zeigern ist richtig? Die Übergabesemantik für Zeiger als Funktionsparameter ist callby-value.

d) Was passiert, wenn das folgende Programmstück übersetzt und ausgeführt

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

Core und Speicher des ATmega16

Parallel-IO. Ports am ATmega128

Stack, Stackpointer, Unterprogramm HP: 0 * 1 * 2 * 3 CAL UP1 4 * 5 * 6 CAL UP2 7 *... UP1: 30 * 33 RET UP2: 40 * 41 CAL UP1 42 * 43 RET

Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt:

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014

Für den Anschluss dieses und anderer Module dieser Serie an das myavr Board steht ein Adapter zur Verfügung.

Embedded Systems

8.3 Taster am µcontroller

f) Was versteht man beim Zugriff auf I/O-Register unter dem Begriff "Memory-mapped"?

Makros sind Textersetzungen, welche vom Präprozessor aufgelöst werden. Dies Passiert bevor der Compiler die Datein verarbeitet.

Proseminar: Konzepte von Betriebsystem-Komponenten (KVBK)

Mikrocontroller (Beispiel: ATMEL ATmega8)

Ansteuerung eines LCD-Screens

Konzepte von Betriebssystem-Komponenten. Ausnahme- / Unterbrechungsbehandlung

Mikrocomputertechnik. 6. Exceptionhandling ( Ausnahmebearbeitung)

Teil III: Wat macht ene Mikrokontroller?

Arduino Kurs Timer und Interrupts. Stephan Laage-Witt FES Lörrach

Selbststudium Informationssysteme - H1102 Christian Bontekoe & Felix Rohrer

Operationsmodi des Timers Modus 0 : Ausschalten des Zählers

Friedrich-Alexander-Universität Erlangen-Nürnberg

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

AVR-8-bit-Mikrocontroller Gruppe Technologie der AVR-8-bit-Mikrocontroller Teil SPI

Mikrocontroller. Vortrag von Louis Liedtke. 8. Dezember Fakultät Elektrotechnik und Informatik. Bild 1: Atmel ATmega8

WS 2017/18 Viel Erfolg!!

Praktikum Mikrorechner 11 (Timer 1)

Übungen zu Systemnahe Programmierung in C (SPiC)

NTB Druckdatum: InI II. Ausführung auf kleine Rechenleistung

Systemnahe Programmierung in C (SPiC)

Unterprogramme mittels Stack (Forts.)

5 Funktionsbibliothek für den Controller XMC1100

Grundlegende Programmiertechniken

ATmega169 Chip: Pin-Layout

... Polling. Interrupt: c dl GSPiC (Teil C, SS 11) 15 Nebenläufigkeit 15.1 Interrupts: Einführung 15 1

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

Transkript:

2.1 Atmega-Peripherie/Interrupts 2.1.1 Situation Während LED2 fortlaufend blinkt, soll LED2 jederzeit sofort durch Tastendruck von T1 eingeschaltet werden können. Dazu muss man im Programm regelmäÿig nachsehen, ob die Taste gedrückt wird. Danach kann das Programm weiterlaufen. Man nennt diese Vorgehensweise Polling. Leider ist das Polling sehr zeit- und programmieraufwändig. Darüberhinaus kann es passieren, dass man den richtigen Zeitpunkt der Abfrage verpasst, so dass eine Eingabe verlorengeht. Fragt man erfahrene Entwickler wegen dieses Problems, erhält man in der Regel den Rat, Interrupts zu verwenden. 2.1.2 Was sind Interrupts? Interrupts sind asynchrone Unterbrechungen des Programmablaufs eines Controllers (oder sonstigen Rechners). Sie können von auÿen erfolgen (externe Interrupts), durch Signale von internen Peripheriebausteinen oder durch Software verursacht werden (sogenannte Software-Interrupts). Sie werden wie Unterprogramme abgearbeitet; da sie jederzeit kommen können, erfordert ihre Abarbeitung einen etwas gröÿeren Aufwand als Unterprogramme. Tabelle 1 zeigt, welche Interrupt-Quellen es gibt. Nr. Name Auslöser 1 RESET Reset-Eingang, Einschalten 2 INT0 Externer Interrupt 0 3 INT1 Externer Interrupt 1 4 TIMER2_COMP Timer 2 5 TIMER2_OVF Timer 2 6 TIMER1_CAPT Timer 1 7 TIMER1_COMPA Timer 1 8 TIMER1_COMPB Timer 1 9 TIMER1_OVF Timer 1 10 TIMER0_OVF Timer 0 11 SPI_STC SPI-Schnittstelle 12 USART_RX RS232-Schnittstelle 13 USART_UDRE RS232-Schnittstelle 14 USART_TX RS232-Schnittstelle 15 ADC A/D-Umsetzer 16 EE_RDY EEPROM 17 ANA_COMP Komparator 18 TWI I 2 C-Bus 19 SPM_RDY Flash-EPROM (geschrieben) Tabelle 1: Interrupt-Quellen beim ATmega8 2.1.3 Interrupt-Logik: Register und Befehle Der Pseudo-Befehl sei erlaubt Interrupts, indem er das I-Bit im Statusregister SREG setzt. Im Gegensatz dazu verbietet der Pseudo-Befehl cli alle Interrupts, indem er das Bit I im SREG löscht. Einzige Ausnahme ist der RESET-Interrupt, der nicht verhindert (maskiert) werden kann (man nennt ihn einen non-maskable Interrupt ). Auÿerdem gibt es für jeden Interrupt ein eigenes Bit (Maskenbit), das die gezielte Freigabe dieses Interrupts bewirkt. Dazu gibt es spezielle Interrupt-Kontroll-Register. Ohne diese Freigabe kann der entsprechende Interrupt nicht auftreten. Für das Auftreten des Interrupts braucht man also drei Bedingungen: 1

a) Die spezielle Interruptquelle muss aktiv sein b) Das I-Bit muss gesetzt sein c) Das Maskenbit für diesen Interrupt muss gesetzt sein 2.1.4 Externe Interrupts INT0 und INT1 Das GICR-Register (general interrupt control register, bei manchen Controllern heiÿt es GIMSK) enthält die Maskenbits für die beiden externen Interrupts INT0 und INT1 (siehe Abbildung 2). INT0=1 erlaubt das Auftreten von INT0-Interrupts, INT0=0 verbietet es. Name INT1 INT0 - - - - IVSEL IVCE R/W R/W R/W R R R R R/W R/W Default 0 0 - - - - 0 0 Tabelle 2: GICR-Register Zur weiteren Kontrolle der beiden externen Interrupts gibt es noch das MCUCR-Register (micro controller unit control register, Abbildung 3). ISC00 und ISC01 (Bit 0 und 1) gehören zu INT0, Name - - SE SM ISC11 ISC10 ISC01 ISC00 R/W R R R/W R R R R/W R/W Default 0 0 0 0 0 0 0 0 Tabelle 3: MCUCR-Register ISC10 und ISC11 (Bit 2 und 3) gehören zu INT1. Die Kombinationen von Bit 0 und Bit 1 geben an, welche Flanken oder Zustände INT0 auslösen (Tabelle 4). Das Gleiche gilt für Bit 2 und Bit 3 bezüglich INT1. ISCx1 ISCx0 Bedeutung 0 0 Interrupt bei Low-Pegel 0 1 Interrupt bei Flanken 1 0 Interrupt bei fallender Flanke 1 1 Interrupt bei steigender Flanke Tabelle 4: 2.1.5 Interrupt-Vektor Für jeden Interrupt, der aktiviert wurde, muss im Programm eine Adresse angegeben sein, an die im Fall des Auftretens gesprungen werden soll. Dazu dient der sogenannte Interrupt-Vektor. Es handelt sich in der Regel (so auch bei PC-Prozessoren) um eine Tabelle mit Sprungadressen. Beim ATmega ist das anders: Hier handelt es sich um eine Tabelle mit Sprungbefehlen zu diesen Adressen. Die Tabelle bendet sich am Beginn des Befehlsspeichers, dort, wo wir bisher die ersten Befehle unserer Programme hatten. An Adresse 0x000 liegt jetzt der Befehl für den RESET-Interrupt, der direkt nach dem Einschalten ausgeführt wird: 1. i n c l u d e "/ usr / share / avra /m8def. i n c " 2 i n t e r r u p t v e k t o r : 3 rjmp main ; 1 RESET Adresse 0x000 4 rjmp i n t e x t 0 ; 2 INT0 Adresse 0x001 2

5 r e t i ; 3 INT1 Adresse 0x002 6 r e t i ; 4 TIMER2_COMP Adresse 0x003 7 r e t i ; 5 TIMER2_OVF Adresse 0x004 8 r e t i ; 6 TIMER1_CAPT Adresse 0x005 9 r e t i ; 7 TIMER1_COMPA Adresse 0x006 10 r e t i ; 8 TIMER1_COMPB Adresse 0x007 11 r e t i ; 9 TIMER1_OVF Adresse 0x008 12 r e t i ; 1 0 TIMER0_OVF Adresse 0x009 13 r e t i ; 1 1 SPI_STC Adresse 0x00A 14 r e t i ; 1 2 USART_RX Adresse 0x00B 15 r e t i ; 1 3 USART_UDRE Adresse 0x00C 16 r e t i ; 1 4 USART_TX Adresse 0x00D 17 r e t i ; 1 5 ADC Adresse 0x00E 18 r e t i ; 1 6 EE_RDY Adresse 0x00F 19 r e t i ; 1 7 ANA_COMP Adresse 0x010 20 r e t i ; 1 8 TWI Adresse 0x011 21 r e t i ; 1 9 SPM_RDY Adresse 0x012 22 main : 23 l d i r16, 0 x f f ; Adresse 0x013 24... 25 i n t e x t 0 : 26... Eigentlich müssen hier nicht alle 19 Adressen stehen, sondern nur die, die auch freigegeben wurden. Der Programmanfang wird durch die Marke main: in jedem Fall gefunden. 2.1.6 Interrupt-Handler Wenn der externe Interrupt INT0 auftritt, springt der Controller an die Adresse unter dem Label intext0 (ein beliebig gewählter Name). An dieser Stelle sollte das gewünschte Unterprogramm beginnen. Man nennt es aber nicht Unterprogramm, sondern Interrupt-Handler oder auch Interrupt-Service-Routine. 1 i n t e x t 0 : 2 push r16 ; r16 r e t t e n 3 push r17 ; r17 r e t t e n 4 i n r16, SREG ; SREG nach r1 6 5 push r16 ; und r e t t e n 6... ; b e l i e b i g e Befehle 7... ; 8 pop r16 ; vom Stack von r16 9 out SREG, r16 ; und nach SREG zurueck 10 pop r17 ; r17 zurueck 11 pop r16 ; r16 zurueck 12 r e t i ; Ruecksprung Es können darin kurze Befehlsfolgen eingebaut werden. Am Schluss des Interrupt-Handlers steht auf jeden Fall der Befehl reti. Im Unterschied zu Unterprogrammen ist es bei Interrupt-Handlern zwingend notwendig, das Statusregister SREG zusammen mit den Registern auf dem Stack abzulegen und zum Schluss wiederzuholen. Man weiÿ nämlich bei Interrupt-Handlern nie, wann sie aufgerufen werden; und wenn sie gerade zwischen dec r16 und brne im Hauptprogramm auftreten und dann auch noch die Status-Bits verändern, geht das Hauptprogramm in die Irre. 3

2.1.7 Stack und I-Flag Damit irgendein Interrupt funktionieren kann, muss zuerst der Stackpointer initialisiert sein. Die einzige Ausnahme ist der RESET-Interrupt beim Einschalten, bei dem der Stack nicht benutzt wird. Beim Aufruf des Interrupt-Handlers wird nämlich die Adresse des aktuell folgenden Befehls auf dem Stack abgelegt. Auÿerdem wird dort das I-Flag gelöscht. Beim reti-befehl wird (wie bei ret) der neue Wert des Programmzähler wieder vom Stack geholt und das I-Flag wird eingeschaltet, damit neue Interrupts bearbeitet werden können. 2.1.8 Beispielprogramm 1. i n c l u d e "/ usr / share / avra /m32def. i n c " 2 jmp meinstart ; 1 : RESET Adr. 0 3 jmp meinint0 ; 2 : INT0 Adr. 2 4 ; x 5 ;############################################# 6 meinstart : 7 l d i r16, low (RAMEND) ; Stackpointer 8 out SPL, r1 6 9 l d i r16, high (RAMEND) 10 out SPH, r 16 11 12 l d i r16, 0 x f f 13 out DDRC, r16 ; PORTC: LEDs 14 out PORTC, r16 ; a l l e LEDs aus 15 s b i PORTD, PD2 ; PORTD: Eingang i s t B i t 2 ( INT0 ), Pull Up Wid. 16 ; x 17 l d i r16, 0 b01000000 ; Bit INT0 setzen, sonst n i c h t s 18 out GICR, r1 6 19 ; x 20 l d i r16, 0 b00000010 ; B i t ISC01 =1, ISC00=0 21 out MCUCR, r 16 22 ; x 23 s e i ; I n t e r r u p t s erlauben 24 s c h l e i f e : 25 rjmp s c h l e i f e ; tu nix 26 ;############################################## 27 meinint0 : ; ISR f u e r INT0 ( f a l l s Taster an PD2 gedrueckt wird ) : 28 c b i PORTC, PC0 ; LED0 an 29 r e t i 30 ; x 2.1.9 Verschiedenes ˆ Zusätzlich zum Maskenbit hat jede Interruptquelle auch ein Anzeigebit; bei INT0 und INT1 dient dazu das GIFR-Register. ˆ Das Anzeigebit wird beim Eintreten des Interrupt-Ereignisses gesetzt und bereits beim Sprung in den Interrupt-Handler gelöscht. Es dient dazu, anzuzeigen, ob ein noch unbearbeitetes Interrupt-Ereignis zu dieser Interruptquelle vorliegt. Sobald es null ist, kann ein neues Ereignis von derselben Quelle bemerkt werden. Bearbeitet werden kann es aber erst dann, wenn das I-Bit (wieder) gesetzt worden ist. 4

ˆ Je kleiner die Nummer des Interrupts, desto höher seine Priorität. Treten zwei Interrupts gleichzeitig auf, wird der mit der höheren Priorität zuerst bearbeitet. ˆ Der Interrupt-Vektor hat bei den Controllern mit mehr als 8 KiB (z. B. ATmega16, ATmega32, ATmega1284) zwei statt eines 16-Bit-Wortes Platz für jeden Interrupt. Damit kann beim ATmega16 und ATmega32 der Befehl jmp anstatt rjmp benutzt werden. Das ist auch nötig, weil man dort mehr als 8 kib Flash-EPROM (4096 Befehlsworte) besitzt. Mit dem rjmp-befehl kann man aber maximal 4096 Adressen weit springen, so dass er dort nicht ausreicht. Bei diesen Controllern ersetzt man also in der Tabelle jeden rjmp-befehl durch einen jmp-befehl. Jeder fehlende Sprungbefehl muss dann durch zwei Befehlsworte ersetzt werden. Nach jedem reti -Befehl muss also ein nop-befehl folgen (siehe Beispiel unten). 2.1.10 PCINT-Interrupts beim ATmega1284p Bei den neueren ATmega-Controllern (z. B. 324, 644 und 1284p) gibt es neben den genannten drei Interrupt-Quellen noch vier weitere. Sie heiÿen Pin Change Interrupts (PCI) und zeigen eine Taktanke an einem Eingang an. Ein Nachteil dabei ist, dass man nicht einschränken kann, welche Taktanke man meint. Ein Vorteil liegt darin, dass man jeden Ein-/Ausgabe-Anschluss für einen Interrupt verwenden kann. Das Ganze funktioniert so: Je acht Anschlüsse sind einem Interrupt zugeordnet (siehe Tabelle 5). Die Namen PCINT0 bis PCINT31 suggerieren, dass es sich um 32 verschiedene Interrupts Anschlüsse Einzel-Interrupts Interrupt-Quelle PORTA 7 bis PORTA 0 PCINT7 bis PCINT0 PCI0 PORTB 7 bis PORTB 0 PCINT15 bis PCINT8 PCI1 PORTC 7 bis PORTC 0 PCINT23 bis PCINT16 PCI2 PORTD 7 bis PORTD 0 PCINT31 bis PCINT24 PCI3 Tabelle 5: Zuordnung AnschlussInterrupt-Quelle handelt. Man hat aber nur vier Quellen, die man voneinander unterscheiden kann. Fragt man mehrere Anschlüsse von PORTA gleichzeitig ab, muss man im Interrupt-Handler selbst unterscheiden, welcher Anschluss den Interrupt ausgelöst hat. Die Konguration funktioniert wie folgt: a) Man gibt im PCICR-Register an, welchen (oder welche) der Quellen man benutzen möchte. Jedes der Bits PCIE0 bis PCIE3 dient als Freigabe (enable) für die zugehörige Quelle. b) Nun muss man noch in den Registern PCMSK0 bis PCMSK3 angeben, welcher Anschluss (oder welche Anschlüsse) zur Interrupt-Quelle durchgeschaltet wird. Für jeden Anschluss ist dabei ein eigenes Bit vorhanden. c) Wie immer muss zum Schluss das I-Flag gesetzt werden. Tabelle 6 zeigt die entsprechenden Register. Hier ist ein Beispiel, bei dem nach Eintreen eines PCI2-Interrupts am Anschluss PC7 (=PCINT23) die LED an PB0 eingeschaltet wird: 1. i n c l u d e "/ usr / share / avra /m1284pdef. i n c " 2 ; Pegel Aenderung an PC7 s o l l per I n t e r r u p t LED0 e i n s c h a l t e n 3 ; uc : ATmega1284p ; LEDs : PORTB; S c h a l t e r : PORTC 4 t a b e l l e : 5 jmp main ; 1 RESET 6 r e t i ; 2 INT0 an PD2 7 nop 8 r e t i ; 3 INT1 an PD3 5

9 nop 10 r e t i ; 4 INT2 an PB2 11 nop 12 r e t i ; 5 PCINT0 an PA0 PA7 13 nop 14 r e t i ; 6 PCINT1 an PB0 PB7 15 nop 16 jmp tast_ uprog ; 7 PCINT2 an PC0 PC7 17 main : 18 l d i r16, low (RAMEND) ; S tackpointer 19 out SPL, r 16 20 l d i r16, high (RAMEND) 21 out SPH, r 16 22 l d i r16, 0 x f f ; LEDs a l s Ausgaenge 23 out DDRB, r 16 24 ;====================================== 25 ; T e i l ( e ) von PORTC a l s PCINT verwenden 26 l d i r16, 1<<PCIE2 ; deshalb PCIE2 Bit s e t z e n 27 s t s PCICR, r16 ; in SRAM Reg. PCICR s p e i c h e r n 28 ; PORTC: Eingang i s t B i t 7 (PCINT23) 29 l d i r16, 1<<PCINT23 ; Bit 7 setzen, sonst n i c h t s 30 s t s PCMSK2, r16 ; In SRAM R e g i s t e r PCMSK2 s p e i c h e r n 31 s e i ; I n t e r r u p t s erlauben 32 ;======================================= 33 s c h l e i f e : 34 rjmp s c h l e i f e ; tu nix 35 tast_uprog : ; f a l l s PCINT23 a u s l o e s t : 36 c l i 37 s b i PORTB, PB0 ; LED0 an 38 r e t i Name Adresse PCICR - - - - PCIE3 PCIE2 PCIE1 PCIE0 SRAM 0x68 R/W R R R R/W R/W R/W R/W R/W PCMSK3 PCINT31 PCINT30 PCINT29 PCINT28 PCINT27 PCINT26 PCINT25 PCINT24 SRAM 0x73 PCMSK2 PCINT23 PCINT22 PCINT21 PCINT20 PCINT19 PCINT18 PCINT17 PCINT16 SRAM 0x72 PCMSK1 PCINT15 PCINT14 PCINT13 PCINT12 PCINT11 PCINT10 PCINT9 PCINT8 SRAM 0x71 PCMSK0 PCINT7 PCINT6 PCINT5 PCINT4 PCINT3 PCINT2 PCINT1 PCINT0 SRAM 0x70 PCIFR - - - - PCIF3 PCIF2 PCIF1 PCIF0 SFR 0x1B R/W R R R R R/W R/W R/W R/W Tabelle 6: Register für PCI0 bis PCI3 6