Aus Raspberry Pi Geek 12/2021

VS-Code (2): C-Programme für den Pico (Seite 2)

Abbildung 4: Das Devboard-HAT des Autors erleichtert das Verbinden der Komponenten.

Abbildung 4: Das Devboard-HAT des Autors erleichtert das Verbinden der Komponenten.

Die folgenden Abschnitte gehen davon aus, dass der BME280 am Port SPI1 des Pico hängt. Der Pico vergibt die Pins dynamisch. Das Programm geht von der Pin-Zuordnung aus der Tabelle “Pin-Belegung” aus, das sind die Pins unten rechts bei oben liegendem USB-Anschluss.

Los geht’s

Nach den Vorbereitungen wechseln Sie ins Projektverzeichnis und starten mit der Eingabe von code . den Editor. Der Punkt steht für das aktuelle Verzeichnis, alternativ geben Sie ein anderes Verzeichnis an. Die Statuszeile am unteren Rand des Editors sollte bis auf die Farbgebung so aussehen wie in Abbildung 5: Ganz links sehen Sie die aktuelle Zahl an Fehlern und Warnungen. Die Schaltfläche Copy to Pico überträgt später das fertige Programm auf den Controller. Der nächste Abschnitt zeigt an, dass die IDE mithilfe von CMake das Programm im Debug-Modus baut. Mit einem Klick schalten Sie bei Bedarf in den Release-Modus um, der den Code optimiert.

Abbildung 5: Die Statuszeile des Editors dient nicht nur zur Information, sondern erlaubt auch das Aktivieren oder Ändern von Aktionen.

Abbildung 5: Die Statuszeile des Editors dient nicht nur zur Information, sondern erlaubt auch das Aktivieren oder Ändern von Aktionen.

Allerdings weiß CMake noch nicht, welchen Compiler Sie nutzen wollen, denn auf dem RasPi gibt es mehrere davon. Ein Klick auf Kein Kit ausgewählt zeigt einen Dialog (Abbildung 6), in dem Sie die Variante arm-none-eabi auswählen. Diesen Schritt benötigt die Software nur einmal je Projekt.

Abbildung 6: Vor dem Kompilieren gilt es, den passenden Compiler auszuw&auml;hlen &ndash; im vorliegenden Fall <span class="ui-element">arm-none-eabi-gcc</span>.

Abbildung 6: Vor dem Kompilieren gilt es, den passenden Compiler auszuwählen – im vorliegenden Fall arm-none-eabi-gcc.

Anschließend laden Sie die Datei CMakeLists.txt per Doppelklick auf den Dateinamen in der Auswahlliste links in den Editor und fügen die Zeilen aus Abbildung 7 (blau markiert) ein. Mit add_executable sagen Sie der IDE, welche finale Datei Sie erzeugen möchten und welche Quelldateien Sie dafür brauchen. Die Datei pico-bme280.c erstellte der Projektgenerator, die Datei bme280.c kommt vom Bosch-API, die Datei user.c erstellen wir später.

Abbildung 7: Diese &Auml;nderungen gilt es, an der <code>CMakeLists.txt</code> vorzunehmen.

Abbildung 7: Diese Änderungen gilt es, an der CMakeLists.txt vorzunehmen.

Die nachfolgenden add_compile_definitions-Befehle setzen ein paar C-Makros für die SPI-Pin-Belegung sowie für Anwendungszwecke. Damit der Sensor später den richtigen Luftdruck ausgibt, müssen Sie hier unter ALTITUDE_AT_LOC die Höhe des Orts über dem Meeresspiegel eintragen, an dem Sie messen, im Beispiel 520 Meter. Mit UPDATE_INTERVAL legen Sie fest, in welchen Intervallen (Sekunden) die Messungen erfolgen.

Nach dem Speichern konfiguriert CMake das Projekt und findet gleich einen Fehler. Das sehen Sie an drei Stellen. Zum einen unterstreicht die Software fehlerhafte Zeilen rot, zum anderen markiert sie im Verzeichnisbaum links die Anzahl der Fehler in der Datei. Die Ausgabe zeigt dann nach etwas Hochblättern das eigentliche Problem: Die Datei user.c existiert noch nicht, aber das ist bekannt. Sie dürfen es also vorerst ignorieren.

Der Vorteil der IDE liegt darin, dass Sie Fehler oft schon im Vorfeld erkennen, etwa wenn Sie sich bei einem Variablenamen vertippt haben. Andere Fehler tauchen erst beim Versuch auf, den Code zu kompilieren. Wieder andere verschwinden: Dabei handelt es sich um solche, die sich auf automatisch generierte Dateien beziehen. Mit der Zeit bekommen Sie ein Gefühl für die Relevanz der Meldungen.

Nächste Schritte

Der Rumpf des Projekts samt Beschreibung ist damit fertig. Jetzt stehen zwei Aufgaben an. Zum einen gilt es, das Hauptprogramm in der Datei pico-bme280.c mit sinnvollem Inhalt zu füllen, zum anderen benötigt das Bosch-API drei Funktionen.

Das Hauptprogramm für einen Pico unterscheidet sich nicht vom Hauptprogramm anderer MCUs. Zuerst initialisiert es die Pico- sowie die Sensorhardware, anschließend liest es in einer Endlosschleife die Sensorwerte ein und gibt sie aus.

Listing 2 zeigt einen Ausschnitt des Programms. Die Zeilen initialisieren den SPI-Port und den Chip-Select-Pin des Pico. Den Teil mit dem Hauptprogramm finden Sie in Listing 3. Es initialisiert die Pico-Hardware (Zeile 6) und den Sensor (Zeile 7). Alle vorgestellten Programme, Quellcodes und den ersten Teil der Reihe finden Sie im Download-Bereich zum Artikel.

Listing 2

Hardware initialisieren

void init_hw() {
  stdio_init_all();
  spi_init(SPI_PORT, 1000000); // SPI with 1Mhz
  gpio_set_function(SPI_RX, GPIO_FUNC_SPI);
  gpio_set_function(SPI_SCK,GPIO_FUNC_SPI);
  gpio_set_function(SPI_TX, GPIO_FUNC_SPI);
  gpio_init(SPI_CS);
  gpio_set_dir(SPI_CS, GPIO_OUT);
  gpio_put(SPI_CS, 1);
}

Listing 3

Hauptprogramm mit Endlosschleife

int main() {
  struct bme280_dev dev;
  struct bme280_data sensor_data;
  int8_t rslt;
  uint32_t delay;
  init_hw();
  rslt = init_sensor(&dev,&delay);
  if (rslt != BME280_OK) {
    printf("could not initialize sensor. RC: %d\n", rslt);
  } else {
    printf("Temperature, Pressure, Humidity\n");
    while (read_sensor(&dev,&delay,&sensor_data) == BME280_OK) {
      print_data(&sensor_data);
      sleep_ms(1000*UPDATE_INTERVAL);
    }
    printf("error while reading sensor: RC: %d", rslt);
  }
  return 0;
}

Die Endlosschleife, bestehend aus Lesen, Ausgeben und Warten, sehen Sie in den Zeilen 12 bis 15. Der eigentliche Code für den Sensor (Initialisierung und Auslesen) ist nicht Pico-spezifisch, das komplette Programm finden Sie im Github-Repo des Autors für den BME280 [7] und BMP280 [8].

Die Datei user.c enthält drei Funktionen für das Schlafen sowie für das Lesen und Schreiben von Daten über SPI. Die Signatur (Übergabeparameter) der Funktionen gibt Bosch vor, der Inhalt ist dann die Umsetzung mit Funktionen aus dem Pico-SDK (Listing 4).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben