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
- Grundlagen
- Pins als knappe Ressource - PinMux
- Anschluss von Peripherie (LED, Taster, 7-Segment, Matrix)
- Enable/Disable/Status-Konzept & PIO-Register
- Struktur eines Portpins
- Code-Beispiele
- AT91 vs. SAM3X
- 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 bei | Ausgang = Low | Ausgang = High |
| Strom | LED gegen +UB; µC zieht Strom (sink) | µC liefert Strom (source) |
| Vorteil | Prozessor muss keinen LED-Strom liefern → häufiger | intuitiver |
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
1aktiviert die Funktion (andere Bits unberührt). - …DR (Disable Register): Schreiben einer
1deaktiviert die Funktion. - …SR (Status Register): Lesen liefert den aktuellen Zustand (1 = aktiv).
Wichtige PIO-Register (je Port)
| Register | Funktion |
|---|---|
PIO_PER / PIO_PDR | PIO Enable/Disable - steuert der PIO-Controller den Pin, oder eine Peripherie? |
PIO_PSR | PIO Status (wird der Pin vom PIO gesteuert?) |
PIO_OER / PIO_ODR | Output Enable/Disable - Pin ist Ausgang oder Eingang |
PIO_OSR | Output Status |
PIO_SODR / PIO_CODR | Set/Clear Output Data - Ausgang auf High / Low setzen (bitweise, atomar) |
PIO_ODSR | Output Data Status (gesetzte Ausgangswerte lesen) |
PIO_PDSR | Pin Data Status - tatsächlichen Pegel am Pin einlesen |
PIO_PUER / PIO_PUDR | Pull-Up Enable/Disable |
PIO_ABSR (nur SAM3X) | Peripheral A/B Select - wählt Sonderfunktion A oder B |
SODRvs.CODR:SODRsetzt Pins auf High (Set),CODRlö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):
- Clock für Peripherie an (
PMC_PCER) - PIO-Steuerung für die Pins abgeben:
PIO_PDR - Peripherie A oder B wählen:
PIO_ABSR
7. AT91 vs. SAM3X
| Feature | AT91 | SAM3X |
|---|---|---|
| Ports | 2 (A, B) | 4 (A, B, C, D) |
| Peripherie-Wahl | fest verdrahtet (bei PIO-Disable) | wählbar A/B über PIO_ABSR |
| Input-Filter | einfacher Glitch-Filter | Glitch- oder Debounce-Filter |
| Pull | Pull-Ups | Pull-Ups + Pull-Downs konfigurierbar |
| Interrupt | ja | ja |
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/CODR→ welche 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;PDSRliest den Pin.- Init-Reihenfolge: Clock (PMC) →
PER→OER/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.