IO-Register
Worum geht's?
[Bearbeiten]Der AtMega318p verfügt über 23 General Purpose I/O Pins. Solange ein Pin nicht für einen anderen Zweck eingesetzt wird, kann er sowohl für die Eingabe als auch für die Ausgabe von elektrischen Signalen verwendet werden. Jeder Pin kann für die Erzeugung von Interrupts verwendet werden. [1]
Ports
[Bearbeiten]Die 23 Pins des AtMega328p sind zu drei Gruppen zusammen gefasst. Im Datenblatt werden diese Gruppen auch als Ports bezeichnet. Informationen zur Funktionsweise der GPIO Pins finden sich im Datenblatt daher in der Sektion I/O Ports. [2] Die drei Ports tragen die Bezeichnungen B, C und D.
Die Lage der Pins kann im Datenblatt nachgesehen werden. [3]
Auch über alternative Verwendungsmöglichkeiten der einzelnen Pins gibt das Datenblatt Auskunft. [4]
PCINT14 / RESET | PC6 | U AtMega328p |
PC5 | ADC5 / SCL / PCINT13 |
PCINT16 / RXD | PD0 | PC4 | ADC4 / SDA / PCINT12 | |
PCINT17 / TXD | PD1 | PC3 | ADC3 / PCINT11 | |
PCINT18 / INT0 | PD2 | PC2 | ADC2 / PCINT10 | |
PCINT19 / OC2B / INT1 | PD3 | PC1 | ADC1 / PCINT9 | |
PCINT20 / XCK / T0 | PD4 | PC0 | ADC0 / PCINT8 | |
VCC | GND | |||
GND | AREF | |||
PCINT16 / XTAL1 / TOSC1 | PB6 | AVCC | ||
PCINT7 / XTAL2 / TOSC2 | PB7 | PB5 | SCK / PCINT5 | |
PCINT21 / OC0B / T1 | PD5 | PB4 | MISO / PCINT4 | |
PCINT22 / OC0A / AIN0 | PD6 | PB3 | MOSI / OC2A / PCINT3 | |
PCINT23 / AIN1 | PD7 | PB2 | SS / OC1B / PCINT2 | |
PCINT0 / CLK0 / ICP1 | PB0 | PB1 | OC1A / PCINT1 |
Konfiguration
[Bearbeiten]Für jeden Port stehen E/A Register zur Verfügung, mit denen die folgenden Eigenschaften der Pins konfiguriert und ausgelesen werden können.
- Datenrichtung
- Schaltzustand (high / low)
- Pull-Up Widerstand
Datenrichtung
[Bearbeiten]Jeder Pin kann sowohl für die Ausgabe als auch für die Eingabe genutzt werden. Die Datenrichtung eines Pins kann durch Manipulation des entsprechenden Bits im zugehörigen DDRx (Data Direction Register) Register festgelegt werden.
DDRx | Datenrichtung |
---|---|
0 | Input |
1 | Output |
Schaltzustand
[Bearbeiten]Der aktuelle Schaltzustand eines Pins kann über das zugehörige Bit im PINx Register ausgelesen werden. Schreiben einer 1 in des zugehörige Bit im PINx Register invertiert den aktuellen Schaltzustand unabhängig, ob der Pin im Eingabe oder Ausgabe Modus ist.
Pull-Up Widerstand
[Bearbeiten]Wenn ein Pin als Eingang konfiguriert ist, dann kann ein interner Pull-Up Widerstand aktiviert werden. Pull-Up zieht den Pin auf high, wenn nichts angeschlossen ist. Ein Eingabepin, der nicht beschaltet ist, sollte immer mit Pull-Up Widerstand betrieben werden, weil sonst ein Querstrom fließen kann.
Für einen Eingabepin kann der Pull-Up Widerstand über das zugehörige Bit im PORTx Register aktiviert und deaktiviert werden. Für einen Ausgabepin kann über dieses Bit stattdessen der Schaltzustand vorgegeben werden.
PORTx | für Input Pin | für Output Pin |
---|---|---|
0 | Pull-Up aus | setze Pin low |
1 | Pull-Up ein | setze Pin high |
Das Bit PUD im Register MCUCR deaktiviert alle Pull-Up Widerstände, wenn es gesetzt ist.
Interrupts
[Bearbeiten]Wenn sie aktiviert sind, lösen Interrupts unabhängig davon aus, ob der jeweilige Pin als Eingabe- oder als Ausgabepin konfiguriert ist.
Es gibt nur 3 Interrupts "Pin Change Interrupt Request" (PCI«x») Jedem der Ports B, C und D ist ein Interrupt zugeordnet.
Die Register PCMSK0, PCMSK1 und PCMSK2 geben Auskunft darüber, welche Pins Interrupts generieren.
Port | Interrupt | Pin | Mask Register |
---|---|---|---|
B | PCI0 | PB«x» / PCINT«x» | PCMSK0 |
C | PCI1 | PC«x» / PCINT«8+x» | PCMSK1 |
D | PCI2 | PD«x» / PCINT«16+x» | PCMSK2 |
Damit der Interrupt PCI«x» Interrupts ausgelöst wird, muss das zugehörige PCIE«x» (Pin Change Interrupt Enable) Flag im PCICR (Pin Change Interrupt Control Register) gesetzt werden. Wie bei allen Interrupts muss zudem die Zustellung von Interrupts global aktiviert werden. Hierfür kann die Funktion sei() benutzt werden.
Die zugehörigen Interrupt Service Routinen können mit dem ISR() Makro der Header Datei avr/interrupt.h definiert werden. Die Indices der zugehörigen Einträge in der Interruptvektortabelle können mit den Präprozessormakros PCINT0_vect, PCINT1_vect bzw. PCINT3_vect angegeben werden.
Die zugehörigen Flags PCIFR0, PCIFR1, bzw. PCIFR2 im PCIFR (Pin Change Interrupt Flag Register) Register werden automatisch gelöscht, wenn die jeweilige Interrupt Service Routine ausgeführt wird.
Umschalten
[Bearbeiten]Ein direkter Wechsel zwischen zwei Zuständen, in denen beide zugehörigen Bits im DDRx und im PORTx Register invertiert sind, ist nicht möglich. Für einen Betrieb in einer Open Collector Schaltung kann es erforderlich sein den jeweiligen Pin mit einem externen Pull-Up Widerstand zu versehen und bei festem PORTx=0 zwischen den Zuständen DDRx=0 und DDRx=1 zu wechseln.
┌─ |
|
─┐ | ||||||||
|
| |||||||||
└─ |
|
─┘ |
Rückschau und Ausblick
[Bearbeiten]TODO
Fußnoten
[Bearbeiten]- ↑ (siehe [M328p]: 17. EXINT - External Interrupts, S. 87)
- ↑ (siehe [M328p]: 18. I/O Ports, S.97)
- ↑ (siehe [M328p]: Figure 5-1. 28-pin PDIP, S.14)
- ↑ (siehe [M328p]: 18.3. Alternate Port Functions, S.101)