Programm aktivieren, testen und letzte Worte

Jetzt sind wir fast so weit, das PIO-Programm zu testen. Es müssen lediglich das zu verwendende PIO-Modul und die SM ausgewählt, das Programm geladen und gestartet sowie die ISR konfiguriert werden. Dafür habe ich eine kleine Funktion geschrieben (in nes_gamepad.c). Betrachten wir Laden und Starten des Programms sowie die Konfiguration der ISR:

Stellenmarkt
  1. Embedded Linux-Programmierer (m/w/d) Entwicklung
    wenglor MEL GmbH, Eching
  2. IT-Administrator (m/w/d) mit Schwerpunkt VMware
    Bayerische Versorgungskammer, München (Home-Office möglich)
Detailsuche

  1. pioProgOffset = pio_add_program(pio, &NES_controller_interface_program);
  2.  
  3. nesControllerProgramInit(pio, (uint) pioSm, pioProgOffset, dataPin, clkPin, psPin);
  4.  
  5. irq_set_exclusive_handler(pio_get_index(pio) ? PIO1_IRQ_0 : PIO0_IRQ_0, gamepadIrqHandler);
  6. irq_set_enabled(pio_get_index(pio) ? PIO1_IRQ_0 : PIO0_IRQ_0, true);
  7. irq_set_priority(pio_get_index(pio) ? PIO1_IRQ_0 : PIO0_IRQ_0, PICO_LOWEST_IRQ_PRIORITY);
  8. pio_set_irq0_source_enabled(pio, pis_interrupt0 + pioSm, true);
  9.  
  10. pio_sm_set_enabled(pio, pioSm, true);

Interrupt konfigurieren

Der interessante Teil ist dabei die Konfiguration des Interrupts. Hierfür teilen wir dem Interrupt-Controller des RP2040 zuerst über die Funktion irq_set_exclusive_handler() mit, welche Funktion er aufrufen soll, wenn der Interrupt ausgelöst wird. Jedes der beiden PIO-Module hat zwei Interrupt-Signale (0 und 1), so können verschiedene Quellen, beispielsweise verschiedene SMs, leichter unterschieden werden. Hier wird das erste Interrupt-Signal (0) verwendet, mit pio_get_index() lassen sich die beiden PIO-Module unterscheiden und das entsprechende Signal auswählen. Danach wird der Interrupt mit irq_set_enabled() im Interrupt-Controller aktiviert.

Interrupts können zudem verschiedene Prioritäten haben, mit der Funktion irq_set_priority() wird der Gamepad-Schnittstelle hier die niedrigste zugewiesen. So lassen sich zeitkritische Unterbrechungen bevorzugen, beispielsweise für die Ausgabe von Audio- oder Videodaten. Abschließend muss im PIO-Modul noch konfiguriert werden, dass Interrupt 0 der für das Gamepad verwendeten SM auf Interrupt 0 des Moduls geleitet werden soll, andernfalls käme er nicht beim Interrupt-Controller an. Dazu bringt das SDK die Funktion pio_set_irq0_source_enabled() mit. In der letzten Zeile wird die SM, die das Gamepad-Programm abarbeitet, aktiviert. Damit wird das Programm ausgeführt und beginnt, das Gamepad abzufragen.

Das Testprogramm

Golem Karrierewelt
  1. C++ Programmierung Basics: virtueller Fünf-Tage-Workshop
    24.-28.10.2022, virtuell
  2. Blender Grundkurs: virtueller Drei-Tage-Workshop
    12.-14.12.2022, Virtuell
Weitere IT-Trainings

Zum Testen habe ich noch ein kleines Programm geschrieben (gptest.c). Es startet das PIO-Programm und legt dabei das zu verwendende PIO-Modul (0) und die zu nutzenden Pins fest. Ich habe folgende Pins verwendet: Pin 6 als Dateneingang, Pin 7 für das P/S-Signal und Pin 8 für den Takt. Hier der Aufruf der Start-Funktion:

  1. gamepadStart(pio0, 6, 8, 7, &gpState)

Außerdem wird die ISR angewiesen, den jeweils aktuellen gelesenen Wert in die Variable gpState zu kopieren. Sie liest das Programm dann fünfmal pro Sekunde aus, prüft, welche Tasten gedrückt sind, und gibt deren Bezeichnung als Text aus.

Fazit und letzte Worte

Für mich ist PIO ein echtes Killer-Feature des RP2040, einen so breiten Funktionsumfang kannte ich von anderen Mikrocontrollern zuvor nicht. PIO macht einen Mikrocontroller zu einer echten FPGA-Alternative, da komplexe und vor allem leistungsfähige Schnittstellen einfach und flexibel realisiert werden können.

Allerdings hat PIO eine unangenehme Gemeinsamkeit mit FPGAs: Die Programmentwicklung ist keinesfalls trivial. Es gibt keine einfache Möglichkeit, Programme zu testen oder zu debuggen. Zwar hat jemand einen Emulator entwickelt, der ist aber so komplex, dass ich bislang immer das Oszilloskop vorgezogen habe. Ohne dieses Hilfsmittel wäre ich ziemlich aufgeschmissen gewesen, denn anfangs machte das Programm ziemliche Probleme.

Der Fehler lag allerdings nicht im Code, sondern in einem USB-Kabel mit Wackelkontakt und einem ausgeleierten Kontakt des Bread Boards. Durch den schlechten Kontakt kamen beim Gamepad nur 1,6 statt 3,3 V an, was, wenig verwunderlich, zu seltsamem Verhalten des Wandler-Chips führte. Ohne eine Möglichkeit, das Signal zu betrachten, hätte ich einfach nur gesehen: Es funktioniert nicht. Ganz so komfortabel wie Softwareentwicklung ist Schnittstellenentwicklung also nicht – aber die vielen neuen Möglichkeiten sind das wert.

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


Aktuell auf der Startseite von Golem.de
Cloudgaming
Google Stadia scheiterte nur an sich selbst

Die Technik war nicht das Problem von Alphabets ambitioniertem Cloudgaming-Dienst. Das Problem liegt bei Google. Ein Nachruf.
Eine Analyse von Daniel Ziegener

Cloudgaming: Google Stadia scheiterte nur an sich selbst
Artikel
  1. Tiktok-Video: Witz über große Brüste kostet Apple-Manager den Job
    Tiktok-Video
    Witz über große Brüste kostet Apple-Manager den Job

    Er befummle von Berufs wegen großbrüstige Frauen, hatte ein Apple Vice President bei Tiktok gewitzelt. Das kostete ihn den Job.

  2. Copilot, Java, RISC-V, Javascript, Tor: KI macht produktiver und Rust gewinnt wichtige Unterstützer
    Copilot, Java, RISC-V, Javascript, Tor
    KI macht produktiver und Rust gewinnt wichtige Unterstützer

    Dev-Update Die Diskussion um die kommerzielle Verwertbarkeit von Open Source erreicht Akka und Apache Flink, OpenAI macht Spracherkennung, Facebook hilft Javascript-Enwicklern und Rust wird immer siegreicher.
    Von Sebastian Grüner

  3. Vantage Towers: 1&1 Mobilfunk gibt Vodafone die Schuld an spätem Start
    Vantage Towers
    1&1 Mobilfunk gibt Vodafone die Schuld an spätem Start

    Einige Wochen hat es gedauert, bis 1&1 Mobilfunk eine klare Schuldzuweisung gemacht hat. Doch Vantage Towers verteidigt seine Position im Gespräch mit Golem.de.

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 • LG OLED TV 2022 65" 120 Hz 1.799€ • ASRock Mainboard f. Ryzen 7000 319€ • MindStar (G.Skill DDR5-6000 32GB 299€, Mega Fastro SSD 2TB 135€) • Alternate (G.Skill DDR5-6000 32GB 219,90€) • Xbox Series S + FIFA 23 259€ • PCGH-Ratgeber-PC 3000€ Radeon Edition 2.500€ [Werbung]
    •  /