Konfiguration der State Machine

Das PIO-Programm allein tut noch nichts, es muss zuerst durch einen der Prozessorkerne in den Programmspeicher eines PIO-Moduls geladen werden. Dann kann es einer State Machine zugewiesen und diese konfiguriert werden. Dabei muss mindestens festgelegt werden, welche GPIO-Pins für die einzelnen Funktionen – Ein- und Ausgabe sowie Set und Side Set – verwendet werden sollen. Sie müssen zudem passend konfiguriert werden.

Stellenmarkt
  1. DevOps/IT Operations Engineer (w/m/d) Container Platform
    ING Deutschland, Nürnberg
  2. Business Intelligence Sachbearbeiterin / Sachbearbeiter - Datenanalystin / Datenanalyst (m/w/d)
    Kreis Nordfriesland, Husum
Detailsuche

Außerdem benötigen wir ein Programm, das die eingelesenen Daten verarbeitet. Dessen Aufbau hängt davon ab, wie das jeweilige PIO-Programm funktioniert. Für das Gamepad habe ich mir Folgendes überlegt: Anstatt das Auslesen des Gamepads aktiv im C-Programm anzustoßen, läuft das PIO-Programm die ganze Zeit, allerdings so langsam, dass nur 50 Abfragen pro Sekunde erfolgen. Nach jedem vollständigen Auslesen des HD14021 wird ein Interrupt ausgelöst, darauf reagiert eine Interrupt Service Routine (ISR, eine spezielle Funktion). Sie liest den aktuellen Wert aus der Empfangs-FIFO und schreibt ihn an eine konfigurierbare Speicheradresse.

Damit muss sich die eigentliche Anwendung nicht um das Gamepad kümmern, einmal gestartet kommen die neuen Werte automatisch. Werfen wir einen Blick auf den Code, zuerst die Konfiguration der SM, für die es in der PIO-Quellcode-Datei eine Funktion gibt:

  1. static inline void nesControllerProgramInit(PIO pio, uint sm, uint offset, uint dataPin, uint clkPin, uint psPin) {
  2. pio_gpio_init(pio, dataPin);
  3. pio_gpio_init(pio, clkPin);
  4. pio_gpio_init(pio, psPin);
  5.  
  6. pio_sm_set_pindirs_with_mask(pio, sm, (1 << clkPin) | (1 << psPin), (1 << dataPin) | (1 << clkPin) | (1 << psPin));
  7.  
  8. pio_sm_config c = NES_controller_interface_program_get_default_config(offset);
  9.  
  10. sm_config_set_in_pins(&c, dataPin);
  11. sm_config_set_set_pins(&c, psPin, 1);
  12. sm_config_set_sideset_pins(&c, clkPin);
  13.  
  14. sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
  15. sm_config_set_clkdiv_int_frac(&c, 35400, 0);
  16. sm_config_set_in_shift(&c, false, true, 8);
  17.  
  18. pio_sm_init(pio, sm, offset, &c);
  19. }

Die Pins konfigurieren

Golem Karrierewelt
  1. Adobe Premiere Pro Aufbaukurs: virtueller Zwei-Tage-Workshop
    17./18.10.2022, Virtuell
  2. Certified Network Defender (CND): virtueller Fünf-Tage-Workshop
    17.-21.10.2022, Virtuell
Weitere IT-Trainings

Die ersten drei Zeilen machen alle das Gleiche, nur für einen anderen der drei vom PIO-Programm genutzten Pins: Sie verbinden das verwendete PIO-Modul mit dem entsprechenden Pin. Das ist erforderlich, da die Pins des RP2040 von mehreren Funktionseinheiten genutzt werden können. Daher muss festgelegt werden, an welche sie angebunden werden sollen.

Danach wird festgelegt, ob die Pins als Ein- oder Ausgang verwendet werden. Die beiden letzten Argumente der dafür genutzten Funktion mögen etwas verwirrend wirken. Sie besagen lediglich, welche Pins konfiguriert werden sollen (letztes Argument) und welche Funktion sie haben (vorletztes Argument). Alle Pins, für die bei beiden Argumenten eine 1 auftaucht, werden zu Ausgängen. Taucht nur im letzten Argument eine 1 auf, wird der Pin als Eingang konfiguriert, hier also dataPin.

Danach wird eine Standardkonfiguration für die genutzte SM geladen. Die aufgerufene Funktion hat der PIO-Assembler erstellt, hier wird bereits die Side-Set-Funktion konfiguriert. Anschließend wird festgelegt, welche PIO-Befehle welche Pins verwenden. Zuerst wird dataPin als Eingangs-Pin definiert, jedes In liest also von dem hier angegebenen Pin. Analog schreibt Set auf psPin, Side Sets werden auf clkPin ausgegeben.

Die Funktion der SM konfigurieren

Die folgenden drei Funktionen konfigurieren Funktionen der SM. Zuerst wird festgelegt, dass lediglich eine Empfangs-FIFO verwendet werden soll. Werden Daten entweder nur aus- oder eingegeben, können die beiden FIFOs der SM zu einer doppelt so großen zusammengefasst werden. Danach wird der Taktteiler der SM konfiguriert. Er ermöglicht es, die Ausführungsgeschwindigkeit des PIO-Codes zu reduzieren. Die PIO-Module führen Programme normalerweise mit Systemtakt aus, also standardmäßig mit 133 MHz. Das ist für die meisten Schnittstellen viel zu schnell, der Taktteiler verlangsamt die Ausführung.

Um das Gamepad mit 50 Hz abzufragen, muss der SM-Takt auf 1 kHz reduziert werden, da jede Abfrage 20 Befehle umfasst. Allerdings kann der Systemtakt maximal durch 65.536 geteilt werden, damit liefe das PIO-Programm zu schnell. Aus diesem Grund habe ich allen Befehlen im PIO-Programm noch drei Verzögerungstakte spendiert, dann wird die gewünschte Abfragerate mit 4 kHz erreicht. Der Taktteiler unterstützt übrigens auch nicht-ganzzahlige Teiler, hierfür würde der letzte Parameter der verwendeten Funktion genutzt, der hier 0 ist.

Zuletzt wird noch das Verhalten des Eingangs-Schieberegisters ISR angepasst. Der zweite Parameter (false) besagt, dass das Register nach links schieben soll, mit jeder Eingabe rutschen die Bits im Register an die nächsthöhere Position. Damit befindet sich der von Eingangs-Pin 8 des HD14021 gelesene Wert am Ende in Bit 8 des ausgegebenen Werts. Die beiden letzten Parameter konfigurieren Auto Push, der erste aktiviert die Funktion, der zweite gibt an, nach wie vielen gelesenen Bits der Inhalt des ISR in die Empfangs-FIFO verschoben wird. Wenig verwunderlich sind das hier acht.

Abschließend wird die angepasste Konfiguration mit pio_sm_init() in die Register der ausgewählten SM kopiert. Sie ist damit fertig vorbereitet, muss aber noch gestartet werden. Dafür gibt es eine kleine weitere Funktion.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Noch mehr Befehle sparenProgramm aktivieren, testen und letzte Worte 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8.  


Aktuell auf der Startseite von Golem.de
Minority Report wird 20 Jahre alt
Die Zukunft wird immer gegenwärtiger

Minority Report zog aus, die Zukunft des Jahres 2054 vorherzusagen. 20 Jahre später scheint so manches noch prophetischer.
Von Peter Osteried

Minority Report wird 20 Jahre alt: Die Zukunft wird immer gegenwärtiger
Artikel
  1. Luftfahrt: Wisk Aero zeigt autonomes Flugtaxi
    Luftfahrt
    Wisk Aero zeigt autonomes Flugtaxi

    Das senkrecht startende und landende Lufttaxi soll in fünf Jahren im regulären Einsatz sein.

  2. Gegen Agile Unlust: Macht es wie Bruce Lee
    Gegen Agile Unlust
    Macht es wie Bruce Lee

    Unser Autor macht seit vielen Jahren agile Projekte und kennt "agile Unlust". Er weiß, warum sie entsteht, und auch, wie man gegen sie ankommen kann.
    Ein Erfahrungsbericht von Marvin Engel

  3. Firefly Aerospace: Rakete erreicht den Orbit
    Firefly Aerospace
    Rakete erreicht den Orbit

    Der zweite Start der Alpha-Rakete war erfolgreich. Sie hat Satelliten in einer niedrigen Erdumlaufbahn ausgesetzt.

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 • MindFactory (u. a. PowerColor RX 6700 XT Hellhound 489€, ASRock RX 6600 XT Challenger D OC 388€) • Kingston NV2 1TB (PS5) 72,99€ • be quiet! Silent Loop 2 240 99,90€ • Star Wars: Squadrons PS4a 5€ • Acer 24"-FHD/165 Hz 149€ + Cashback • PCGH-Ratgeber-PC 3000 Radeon Edition 2.500€ [Werbung]
    •  /