Worum geht's?

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

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 / RESETPC6 U
AtMega328p
PC5ADC5 / SCL / PCINT13
PCINT16 / RXDPD0PC4ADC4 / SDA / PCINT12
PCINT17 / TXDPD1PC3ADC3 / PCINT11
PCINT18 / INT0PD2PC2ADC2 / PCINT10
PCINT19 / OC2B / INT1PD3PC1ADC1 / PCINT9
PCINT20 / XCK / T0PD4PC0ADC0 / PCINT8
VCCGND
GNDAREF
PCINT16 / XTAL1 / TOSC1PB6AVCC
PCINT7 / XTAL2 / TOSC2PB7PB5SCK / PCINT5
PCINT21 / OC0B / T1PD5PB4MISO / PCINT4
PCINT22 / OC0A / AIN0PD6PB3MOSI / OC2A / PCINT3
PCINT23 / AIN1PD7PB2SS / OC1B / PCINT2
PCINT0 / CLK0 / ICP1PB0PB1OC1A / PCINT1

Konfiguration

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

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.

DDRxDatenrichtung
0Input
1Output

Schaltzustand

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

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.

PORTxfür Input Pinfür Output Pin
0Pull-Up aussetze Pin low
1Pull-Up einsetze Pin high

Das Bit PUD im Register MCUCR deaktiviert alle Pull-Up Widerstände, wenn es gesetzt ist.

Interrupts

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.

PortInterruptPinMask Register
BPCI0PB«x» / PCINT«x»PCMSK0
CPCI1PC«x» / PCINT«8+x»PCMSK1
DPCI2PD«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

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

TODO

Fußnoten

  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)

This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.