Raspberry Pico und PIO Programmierung mit PlatformIO (Visual Studio Code)

  • Nachdem ich gestern beschrieben habe, wie man die Programmierung des Raspberry Pico mit Visual Studio Code (VSC) einrichten kann, möchte ich in diesem Posting darauf eingehen, wie man die PIO Programmierung in dieser Umgebung realisieren kann. Grundlage dafür ist wieder die wiz-IO Platform.


    Der Raspberry Pico verfügt über zwei sog. PIOs mit jeweils vier Zustandsmaschinen. Damit können, völlig unabhängig von der eigentlichen CPU des µControllers, GPIO-Pins gesteuert und abgefragt werden. Somit können mehrere parallele Prozesse ausgeführt werden. Renè hat schon in seinem Posting "Statemachines und PIO - Programmierung beim Raspberry Pi Pico" erklärt, worum es dabei geht und wie das Ganze in Micro Python erfolgt. Ich möchte hier kurz beschreiben, wie man die Programmierung in C/C++ mit Hilfe von PlatformIO und VSC erledigen kann.


    Der Knackpunkt ist, dass die Zustandsmaschinen mit einem Assembler ähnlichen Befehlssatz programmiert werden müssen. Diesen Code kann man nicht einfach zwischen den normalen C-Code schreiben, es sind ein paar Formalismen zu beachten. Das Vorgehen wird wieder an einem "Blink" Beispiel erklärt. Es handelt sich hier um Beispielcode vom Pico-SDK.


    pio-blink-2.png


    Als erstes wird eine .pio Datei angelegt in der der PIO-Code hinterlegt ist. In diesem Beispiel soll sie blink.pio heißen.


    Zusätzlich zum eigentlichen PIO-Code ist in der Datei noch eine Helferfunktion zu definieren. Das muss zwischen den %c-sdk{ [Code...] %} Markern geschehen. Diese Helferfunktion dient dazu, in dem eigentlichen C-Programm das PIO-Programm mit den benötigten PINs zu "verbinden".


    Das eigentliche C/C++ Programm wird wie üblich geschrieben.


    Zu guter Letzt muss die platformio.ini Datei angepasst werden. Hierbei ist der Eintrag "board_build.pio = include/blink.pio" wichtig. Dieser Eintrag sorgt dafür, dass beim Compilieren aus der blink.pio eine Headerdatei blink.pio.h erzeugt wird. Diese muss im Hauptprogramm mit #include eingebunden werden. Man könnte die *.pio Datei auch im "src" Verzeichnis anlegen. Dann müsste der Eintrag "board_build.pio = src/blink.pio" heißen. Dementsprechend würde die Headerdatei in diesem Verzeichnis erzeugt.



    Das war es eigentlich. Die automatisch erzeugte Header Datei enthält ein Array mit dem Assemblercode und Funktionen, die für das Hauptprogramm erforderlich sind um die Zustandsmaschine(n) zu initialisieren und zu starten.


    Was macht das Programm? Es lässt drei LEDs in unterschiedlicher Frequenz blinken.


    pio-blink-output.png


    Die CPU des Pico kann nebenher etwas völlig anderes machen, weil die Zustandsmaschinen des Pico, wie schon gesagt, unabhängig von der CPU funktionieren.


    Zum C-Code ist folgendes zu sagen:


    Die Zeile sleep_ms(10000); wurde zum Beispielcode hinzugefügt, damit Zeit vorhanden ist um die serielle Konsole zu öffnen, und somit die Textausgabe sehen zu können.


    Am Ende der "main()" Funktion wurde eine Endlosschleife "while(1){};" eingefügt. Diese ist für die eigentliche PIO-Funktionalität nicht erforderlich. Ohne die Endlosschleife ist die Textausgabe per USB auf der Konsole nicht möglich, weil sich die CPU einfach abschaltet da kein weiterer Code auszuführen ist.


    Anders ist das mit der Ausgabe per UART. Verbindet man den Pin 1 (TX-Pin) des Picos per FTDI Adapter mit dem Computer (GND vom Adapter an PIN 3) erhält man eine Ausgabe seriell in einer Konsole (z.B. Putty, HTerm o.ä.). Dazu muss die Zeile "setup_default_uart();" wieder ein- und "stdio_init_all();" auskommentiert werden. Die Endlosschleife kann in diesem Fall entfallen.


  • KaiR

    Hat den Titel des Themas von „Raspberry Pico und PIO Programmierung mit Visual Studio Code“ zu „Raspberry Pico und PIO Programmierung mit PlatformIO (Visual Studio Code)“ geändert.