Kapitel 3 - Parallele I/O (PIO / GPIO)

Startseite · Kap. 2 Power Management · 3 Parallele I/O · → Kap. 4 Serielle Schnittstelle Verwandt: Kap. 2 Enable/Disable-Prinzip · Kap. 5 Timer/PWM · Kap. 6 Interrupts Quellen: [Q: IO] ES-03-IO Parallel IO · [Q: ZF §3/§3a]


Inhalt

  1. Grundlagen
  2. Pins als knappe Ressource - PinMux
  3. Anschluss von Peripherie (LED, Taster, 7-Segment, Matrix)
  4. Enable/Disable/Status-Konzept & PIO-Register
  5. Struktur eines Portpins
  6. Code-Beispiele
  7. AT91 vs. SAM3X
  8. Prüfungsrelevanz

1. Grundlagen

  • Parallele I/O = einfachste Art, mit der Außenwelt zu kommunizieren, zu steuern und zu messen. Alles digital: Ein/Aus, High/Low, 1/0.
  • Portpin = physischer elektrischer Anschluss am Chip. Kann Eingang (z. B. Taster abfragen) oder Ausgang (z. B. LED schalten) sein.
  • Port = Zusammenfassung mehrerer Pins (z. B. 32 Pins). Auch GPIO (General Purpose Input Output) genannt.
  • Pegelinterpretation: Ob High oder Low den aktiven Zustand („1") darstellt, ist definierbar (active high / active low).

2. Pins als knappe Ressource - PinMux

  • Pins sind eine der knappsten Ressourcen - die Anzahl der Anschlüsse ist begrenzt.
  • MC bietet oft mehr Funktionen als Pins → ein Pin kann für eine Schnittstelle (USART, I²C, Timer) umkonfiguriert werden: Pin Multiplex (PinMux). Eine Schnittstelle braucht meist mehrere Pins.
  • Konfiguration über Register: Richtung (Ein/Aus), evtl. Pull-Up/Pull-Down, evtl. Sonderfunktion (PinMux).

3. Anschluss von Peripherie

LED - Low-aktiv vs. High-aktiv

Low-aktiv (häufiger)High-aktiv
LED leuchtet beiAusgang = LowAusgang = High
StromLED gegen +UB; µC zieht Strom (sink)µC liefert Strom (source)
VorteilProzessor muss keinen LED-Strom liefern → häufigerintuitiver

Taster/Schalter - Entprellen (Debouncing)

  • Anschluss active high oder active low; meist Pull-Up/Pull-Down nötig (am besten intern im µC).
  • Entprellen mechanischer Taster fast immer nötig:
    • Hardware: FlipFlop, Kondensator+Widerstand, oder µC-Optionen (Glitch/Debounce-Filter).
    • Software: Zeitmessung mit Timer (Kap. 5).

7-Segment-Anzeige

  • Ziffer aus 7 Segmenten a–g (+ Dezimalpunkt dp).
  • Ohne Decoder: jedes Segment ein Pin → 4 Ziffern = 8+4 (Multiplex) statt 8×4 = 12 statt 32 Pins.
  • Mit BCD-Decoder (BCD = Binary Coded Decimal): Decoder wandelt 4-Bit-Zahl → Segmente → spart Pins (z. B. 9 statt 20).
  • Zeitmultiplex: Stellen nacheinander sehr schnell an-/ausschalten (Auge zu träge → wirkt gleichzeitig).

Tastaturmatrix

  • Tasten in Reihen × Spalten anordnen → spart Pins.
  • Abfrage im Zeitmultiplex: Spalten nacheinander aktivieren (Output), Reihen messen (Input). Pull-Up/Down nötig.

4. Enable/Disable/Status-Konzept & PIO-Register

Atmel nutzt Registertripel für atomare Operationen (kein Read-Modify-Write, keine Race Conditions):

  • …ER (Enable Register): Schreiben einer 1 aktiviert die Funktion (andere Bits unberührt).
  • …DR (Disable Register): Schreiben einer 1 deaktiviert die Funktion.
  • …SR (Status Register): Lesen liefert den aktuellen Zustand (1 = aktiv).

Wichtige PIO-Register (je Port)

RegisterFunktion
PIO_PER / PIO_PDRPIO Enable/Disable - steuert der PIO-Controller den Pin, oder eine Peripherie?
PIO_PSRPIO Status (wird der Pin vom PIO gesteuert?)
PIO_OER / PIO_ODROutput Enable/Disable - Pin ist Ausgang oder Eingang
PIO_OSROutput Status
PIO_SODR / PIO_CODRSet/Clear Output Data - Ausgang auf High / Low setzen (bitweise, atomar)
PIO_ODSROutput Data Status (gesetzte Ausgangswerte lesen)
PIO_PDSRPin Data Status - tatsächlichen Pegel am Pin einlesen
PIO_PUER / PIO_PUDRPull-Up Enable/Disable
PIO_ABSR (nur SAM3X)Peripheral A/B Select - wählt Sonderfunktion A oder B

SODR vs. CODR: SODR setzt Pins auf High (Set), CODR löscht sie auf Low (Clear). Beide wirken nur auf die gesetzten Bits, ohne andere Ausgänge zu ändern. Genau das braucht die 7-Segment-Klausuraufgabe.

5. Struktur eines Portpins

  • Ausgang: Daten aus SODR/CODR → Multiplexer → Pad. Bei aktivierter Peripherie kommen die Daten direkt vom Peripheriemodul (PWM, USART …).
  • Eingang: Signal vom Pad → optionaler Glitch-Filter / Debounce-Filter (nur SAM3X) → PDSR. Zusätzlich Flankenerkennung (Event Detection) → kann Interrupts auslösen (Kap. 6).

6. Code-Beispiele

// ---- Init: LED an Port A, Pin (1<<12), low-aktiv ----
PMC->PMC_PCER0 = 1 << ID_PIOA;   // 1) Clock für PIOA an  (Kap.2!)
PIOA->PIO_PER  = (1 << 12);      // 2) Pin vom PIO steuern lassen
PIOA->PIO_OER  = (1 << 12);      // 3) als Ausgang

PIOA->PIO_CODR = (1 << 12);      // LED an (low-aktiv → Low = leuchtet)
PIOA->PIO_SODR = (1 << 12);      // LED aus

// ---- Taster an Pin (1<<5) einlesen ----
PIOA->PIO_ODR  = (1 << 5);       // Eingang
PIOA->PIO_PUER = (1 << 5);       // Pull-Up an
if ((PIOA->PIO_PDSR & (1 << 5)) == 0) { /* Taster gedrückt (active low) */ }

Peripheriefunktion aktivieren (SAM3X, z. B. USART-Pins):

  1. Clock für Peripherie an (PMC_PCER)
  2. PIO-Steuerung für die Pins abgeben: PIO_PDR
  3. Peripherie A oder B wählen: PIO_ABSR

7. AT91 vs. SAM3X

FeatureAT91SAM3X
Ports2 (A, B)4 (A, B, C, D)
Peripherie-Wahlfest verdrahtet (bei PIO-Disable)wählbar A/B über PIO_ABSR
Input-Filtereinfacher Glitch-FilterGlitch- oder Debounce-Filter
PullPull-UpsPull-Ups + Pull-Downs konfigurierbar
Interruptjaja

RP2040: GPIO mit SIO für direkten Zugriff, zusätzliche Set/Clear/Toggle-Register, Programmable IO State Machines.


Prüfungsrelevanz

  • 7-Segment-Codeaufgabe (KL20 Aufg. 3): Gegeben Init + Anschlussbelegung (welches Segment an welchem Pin), dazu Codezeilen mit SODR/CODRwelche Zahl wird angezeigt? Methode: verfolge Bit für Bit, welche Segmente High (an, bei high-aktiv) sind, und lies die Ziffer.
  • SODR=High setzen, CODR=Low setzen sicher unterscheiden; PDSR liest den Pin.
  • Init-Reihenfolge: Clock (PMC) → PEROER/ODR → Pull-Up → Daten.
  • Low- vs. high-aktiv (LED, Taster) und warum low-aktiv häufiger ist.

Typische Fehler: SODR/CODR vertauschen · vergessen, den PIO-Clock einzuschalten · bei low-aktiver Anzeige die Pegel invertieren müssen · ODSR (Ausgangswert) mit PDSR (Pin-Pegel) verwechseln.

Kap. 2 Power Management · → Kap. 4 Serielle Schnittstelle