DIY & Raspberry Pi Pico: Den Pico mit programmierbarem IO und NES-Gamepad steuern

Mit programmierbarer Ein- und Ausgabe lässt sich ein altes Gamepad leicht am Mikrocontroller betreiben. Wir zeigen, wie das funktioniert.

Eine Anleitung von Johannes Hiltscher veröffentlicht am
Ein Oszilloskop ist beim Entwickeln für die programmierbare Ein- und Ausgabe des Raspberry Pi Pico fast Pflicht.
Ein Oszilloskop ist beim Entwickeln für die programmierbare Ein- und Ausgabe des Raspberry Pi Pico fast Pflicht. (Bild: Johannes Hiltscher/Golem.de)

Eine Eingabemöglichkeit ist für viele Mikrocontroller-Projekte eine sinnvolle Ergänzung. Allerdings sind einzelne Knöpfchen unpraktisch, eine Tastatur oft zu viel und das USB-Protokoll sowieso recht komplex – ein Thema für einen eigenen Artikel. Einfacher geht es mit einem alten Gamepad aus der Ära der 8- oder 16-Bit-Konsolen. Das ist ziemlich simpel aufgebaut, entsprechend einfach ist das Protokoll für den Datenaustausch.

Inhalt:
  1. DIY & Raspberry Pi Pico: Den Pico mit programmierbarem IO und NES-Gamepad steuern
  2. So funktioniert das Gamepad
  3. Das PIO-Programm
  4. Noch mehr Befehle sparen
  5. Konfiguration der State Machine
  6. Programm aktivieren, testen und letzte Worte

Normalerweise würde man das Protokoll mit Software nachbauen, diese Methode heißt Bit-Banging. Dabei erzeugt der Controller die benötigten Steuersignale an seinen Ausgabe-Pins und liest die Antwort von anderen Pins als Eingabe – ebenfalls gesteuert durch Software. Das funktioniert und es lassen sich so sogar USB-Schnittstellen bauen. Aber die Methode hat einen Nachteil: Die Programmteile zum Erzeugen und Einlesen der Signale blockieren den Prozessor, während sie laufen.

Genau für solche Anwendungen hat der von der Raspberry Pi Foundation entwickelte Mikrocontroller RP2040 eine elegante Lösung: programmierbare Ein- und Ausgabe (Programmable I/O oder kurz PIO). Hier geben wir einen kurzen Einblick in die Programmierung der PIO-Einheiten, alle Details finden sich im Datenblatt des RP2040 (PDF).

Für PIO sind acht als Zustandsautomaten (state machines, SMs) bezeichnete, spezialisierte Prozessoren in zwei Modulen integriert. Sie werden mit neun speziellen Assembler-Befehlen programmiert, können über zwei FIFOs Daten mit dem Prozessor austauschen, von Eingangs-Pins lesen und auf Ausgabe-Pins schreiben. Damit lassen sich (fast) beliebige Schnittstellen realisieren. Zu komplex darf das Protokoll allerdings nicht sein, da der Programmspeicher auf 32 Anweisungen pro Modul begrenzt ist. Den Speicher teilen sich alle vier SMs des Moduls. Aber selbst digitale Bildsignale oder analoge Formate wie PAL (g+) sind möglich.

Das können PIO-Programme

Stellenmarkt
  1. SAP Basis Berater / Administrator (m/w/x)
    über duerenhoff GmbH, Raum Würzburg
  2. Webdeveloper/in (w/m/d)
    Stadt NÜRNBERG, Nürnberg
Detailsuche

Die Befehle, die zur Programmierung der SMs genutzt werden können, sind speziell darauf zugeschnitten, die Pins des Mikrocontrollers anzusteuern oder Daten von ihnen zu lesen. Dafür existieren zunächst die Befehle In und Out, die 1 bis 32 Bits bewegen. Beide nutzen ein eigenes Schieberegister, mit dem in mehreren Schritten ein Wert zusammengesetzt (In) oder ausgegeben (Out) werden kann. Ein fester Wert von bis zu 5 Bit kann mit dem Befehl Set gesetzt werden. Er kann entweder in einem der beiden Arbeitsregister X und Y oder auf zuvor festgelegten Pins landen.

Ist ein Wert vollständig eingelesen, muss er in die Empfangs-FIFO geschrieben werden, damit die Prozessorkerne des RP2040 etwas damit tun können. Das erledigt der Befehl Push. Pull entnimmt auszugebende Daten aus der Sende-FIFO. Beide arbeiten immer mit 32-Bit-Werten, egal wie viele Bits tatsächlich genutzt werden. Nach Ein- und Ausgabe sind Schleifen der nächste wichtige Punkt, denn bei den meisten Protokollen passiert oft das Gleiche. Hierfür gibt es den Befehl Jmp, mit dem die Programmausführung an einen anderen Punkt springt. Er kann unbedingt oder an eine von sieben Bedingungen geknüpft sein. Häufig genutzt werden Zählschleifen, um eine Sequenz von Anweisungen mehrfach auszuführen. Dafür wird eines der Arbeitsregister genutzt, ein Beispiel sehen wir uns später an.

PIO-Programme können über den Befehl Irq zudem Programmunterbrechungen (Interrupts) auslösen, die entweder an die Prozessoren oder andere PIO-Einheiten geleitet werden. Letzteres kann zur Synchronisation komplexer Programme genutzt werden, die mit mehreren SMs realisiert sind. Dafür käme der Befehl Wait zum Einsatz. Zuletzt existiert noch der Befehl Mov, der Werte zwischen Registern verschiebt und dabei die Werte der einzelnen Bits umkehren (invertieren) oder die Reihenfolge umdrehen kann.

Warum PIO?

Die Frage, warum man sich entschlossen hat, PIO-Module in den RP2040 zu integrieren, beantwortet die Raspberry Pi Foundation im oben verlinkten Datenblatt: Jede SM benötigt in etwa so viel Chipfläche wie eine reguläre serielle Schnittstelle (SPI oder I2C), kann aber viel mehr. Anstatt eine Menge Funktionseinheiten zu integrieren, die oft als IP-Core (für Intellectual Property) eingekauft werden, gibt es anpassbare Einheiten mit flexibler Funktion. Das spart Kosten, ohne auf die Funktionalität angepasster Hardware verzichten zu müssen: PIO hat ein ebenso vorhersagbares zeitliches Verhalten und verringert den Aufwand für den Prozessor.

Am Anfang steht auch bei PIO-Programmen, wie bei jedem Programm, die Überlegung: Was soll es tun und wie erreiche ich das? Also sehen wir uns zuerst das Gamepad an, das unser PIO-Programm abfragen soll.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
So funktioniert das Gamepad 
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7.  


Aktuell auf der Startseite von Golem.de
Core-i-13000
Intel präsentiert Raptor Lake mit bis zu 5,8 GHz

Auf der Innovation hat Intel die 13. Core Generation vorgestellt. Kernzahl, Takt und Effizienz sollen deutlich steigen.

Core-i-13000: Intel präsentiert Raptor Lake mit bis zu 5,8 GHz
Artikel
  1. Ukrainekrieg: Meta stoppt ausgefeilte russische Desinformationskampagne
    Ukrainekrieg
    Meta stoppt ausgefeilte russische Desinformationskampagne

    Gefakte Webseiten deutscher Medien machen Stimmung gegen die Russland-Sanktionen. Die falschen Artikel wurden über soziale Medien verbreitet.

  2. Star Wars: Lego bringt großes Set der Razor Crest aus The Mandalorian
    Star Wars
    Lego bringt großes Set der Razor Crest aus The Mandalorian

    Aus fast 6.200 Teilen besteht das große Lego-Set der Razor Crest. Sie ist teuer, nicht aber für ein Star-Wars-Set.

  3. Creative Commons, Pixabay, Unsplash: Rechtliche Fallstricke bei Gratis-Stockfotos
    Creative Commons, Pixabay, Unsplash
    Rechtliche Fallstricke bei Gratis-Stockfotos

    Pixabay, Unsplash, CC ermöglichen eine gebührenfreie Nutzung kreativer Werke. Vorsicht ist dennoch geboten: vor Abmahnmaschen, falschen Quellenangaben, unklarer Rechtslage.
    Eine Analyse von Florian Zandt

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • AMD Ryzen 7000 jetzt bestellbar • CyberWeek: PC-Tower, Cooling & Co. • Günstig wie nie: Asus RX 6700 XT 539€, Acer 31,5" 4K 144 Hz 899€, MSI RTX 3090 1.159€ • AMD Ryzen 7 5800X 287,99€ • Xbox Wireless Controller 49,99€ • MindStar (Gigabyte RTX 3060 Ti 522€) [Werbung]
    •  /