
RPi Pico – SDK Portzugriffe
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Inzwischen habe ich einen besseren Einblick in die SDK-Funktionen zum
Rpi Pico gefunden. Die lang gesuchte Übersicht aller Funktionen steht
genau in dem Dokument, wo ich sie gleich hätte suchen sollten: raspberry-pi-pico-c-sdk.pdf.
Im Abschnitt 4.1.10. hardware_gpio steht alles, was man immer schon
über die GPIO-Verwendung wissen wollte, aber nie zu fragen wagte. Für
Portausgaben braucht man gpio_init, gpio_set_dir und gpio_put.
//Pico SDK GPIO, time_us
#include "pico/stdlib.h"
void setup() {
gpio_init(2);
gpio_set_dir(2, true);
uint32_t t = time_us_32();
while (true) {
t+=1; while (t>time_us_32());
gpio_put(2, 1);
t+=1; while (t>time_us_32());
gpio_put(2, 0);
}
}
void loop() {}
Dieses kleine Programm erzeugt ein symmetrishes Rechtecksignal an GP2.
Natürlich wollte ich richtig schnelle und genaue Ausgaben erreichen.
Versuche ohne jede Verzögerung brachten eine Frequenz von knapp über 30
MHz! Mit sleep_us kann ich zwar langsamere Signale erzeugen, aber es
kommt nie genau die Freqeunz heraus, die ich haben will, weil
Programmlaufzeiten dazu kommen. Deshalb verwende ich jetzt den
Mikrosekunden-Hardware-Timer des Pico. Er hat eine Breite von 64 Bit,
aber ich brauche nur die unteren 32 Bit, die ich mit time_us_32()
abfragen kann. Mit t+=1; while (t>time_us_32()); warte ich
dann bis zur nächsten Mikrosekunde. Jede Phase dauert dann unabhängig
von der Programmlaufzeit genau eine Mikrosekunde. Diese Methode sieht
zwar sehr primitiv aus, aber es entsteht tatsächlich eine Frequenz von
500,000 kHz.
Ganz ohne eine Zeitmessung und mit nur einem Port kann man einen sehr
einfachen RC-Generator bilden. Weil jeder Port nach einem Reset als
Eingang mit Hysterese funktioniert, wird keine weitere Initialisierung
benötigt. Es reicht die Abfrage und das Umschalten zwischen Pullup und
Pulldown. Man kann nun einen beliebigen Kondensator zwischen GP0 und
GND anschließen. Es funktioniert auch mit einem Piezo-Schallwandler,
der dann einen Ton von rund 1 kHz abgibt.
//Pico SDK GPIO, RC-Generator
#include "pico/stdlib.h"
void setup() {
while (true) {
if (gpio_get(0)) gpio_pull_down(0); else gpio_pull_up(0);
}
}
void loop() {}
Diese Messung entstand ganz ohne einen Kondensator, also nur mit der
Kapazität des Oszilloskops und des Ports. Man sieht ein Dreiecksignal
mit ca. 300 kHz und einer Amplitude von 1 Vss. Ein leichtes Zittern
entsteht durch die zeitlich endlichen Abtastpunkte irgendwo im
MHz-Bereich. Mit größeren Kapazitäten ist das Signal entsprechend
präziser.
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry