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