Zum Inhalt springen

IO-Register

Aus Wikibooks
WTFPL-2
Hinweis: Wenn du diese Seite bearbeitest, stimmst du zu, dass deine Bearbeitungen zusätzlich unter den Bedingungen der WTF Public License veröffentlicht werden.
WTFPL-2


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.

┌─
DDRx 1 output
PORTx 1 high
─┐
DDRx 0 input
PORTx 1 pull-up
DDRx 1 output
PORTx 0 low
└─
DDRx 0 input
PORTx 0 kein pull-up
─┘

Rückschau und Ausblick

[Bearbeiten]

TODO

Fußnoten

[Bearbeiten]
  1. (siehe [M328p]: 17. EXINT - External Interrupts, S. 87)
  2. (siehe [M328p]: 18. I/O Ports, S.97)
  3. (siehe [M328p]: Figure 5-1. 28-pin PDIP, S.14)
  4. (siehe [M328p]: 18.3. Alternate Port Functions, S.101)

WTFPL-2
Du hast das Recht unter den Bedingungen der WTF Public License mit diesem Dokument anzustellen was zum Teufel auch immer Du willst.