Aladin auf der Waldbühne Altenbrak

Hervorgehoben

Im Juni, Juli und August 2024 wird das Stück „Aladin und die Wunderlampe„, für das ich den Text geschrieben und Uwe Heynitz die Musik komponiert hat, auf der malerischen Waldbühne Altenbrak im Harz (wildromantische Gegend in Deutschland) vom Fairytale . Theater Thale aufgeführt.

Ich fahre da hin und freue mich schon sehr auf den Besuch: ich hab beim Schreiben ja bestimmte Bilder im Kopf und mach es extra nicht einfach. In diesem Stück kommen sprechende Frösche, ein explodierender Kessel, ein fliegender Teppich (Orient), eine badende Prinzessin und vieles mehr – natürlich auch die Schatzhöhle – vor. Bin gespannt, wie man diese Dinge im Freien bei Tageslicht umsetzen kann. Der Regisseur Ronny Große hat bestimmt tolle Ideen!

Allen in der Gegend (vorzugsweise mit Kindern, doch auch viele Erwachsene tauchen gerne in die phantastische Märchenwelt ein) ist ein Besuch empfohlen. Karten sind im Internet-Vorverkauf erhältlich.

Gute Unterhaltung!

Foto der Uraufführung mit Jakob Ritschel, Paul Gratzer und Patrick Ritschel.

Workshop: First Steps on ESP32-C3

In den rund zweieinhalb Stunden werden wir erst ein bisschen über die Grundlagen sprechen. Fragen wie „Was ist ein embedded System?“, „Aus welchen Komponenten besteht ein embedded System?“, „Wie programmiert man ein embedded System und was ist eine Firmware?“ werden diskutiert.

In praktischen Übungen werden wir erst die LEDs in Betrieb nehmen, dann die Taster. Im Anschluss programmieren wir ein kleines Spielchen. Die dafür notwendigen Entwicklungsboards werden für die Dauer des Workshops zur Verfügung gestellt.

Als Programmiersprache kommt C zum Einsatz.

Dauer

2 1/2 Stunden

Ziel

Kennenlernen der modernen ESP32-C Controller mit RISC-V Prozessor und erste Schritte zur eigenen Firmware

Voraussetzungen

Begleitmaterial

(2) RISC-V Simulator

Erweitern Sie den RISC-V Disassembler um eine Befehlsabarbeitung. Implementieren Sie dazu die Registerbank, den Befehlsspeicher und den Datenspeicher als eigene Klassen (sofern Sie eine objektorientierte Sprache einsetzen).

Arbeiten Sie Befehl für Befehl ab, so wie die Befehle im RISC-V Instruction Set Manual (Volume 1) definiert sind. Geben Sie am Ende der Abarbeitung die Inhalte der Register auf dem Bildschirm aus.

Eine Implementierung der Peripherie ist nicht notwendig. Aus diesem Grund werden Funktionen wie printf() nicht funktionieren.

(1) RISC-V Disassembler

Entwickeln Sie ein PC-Programm (Beispielsweise in C, C++ oder Java), das ein RISC-V Compilat disassembliert. Es soll Anweisung für Anweisung auf dem Bildschirm ausgeben.

Implementieren Sie alle Befehle des RV32I – und des RV32M Befehlssatzes. Achten Sie dabei besonders auf die korrekte Behandlung der Immediate-Values (die ja „scrambled“, also durcheinander codiert sind).

Um Testdaten (Compilate) zu generieren, gehen Sie dabei wie folgt vor:

C in RISC-V übersetzen und Hex-File generieren

Um ein C-Programm bzw. einzelne C-Funktionen in RISC-V-Code zu übersetzen, kann das Programm per

riscv32-esp-elf-c++.exe -c -march=rv32im -mabi=ilp32 .\square.c

compiliert werden (im Beispiel square.c). Die Parameter rv32im und ilp32 definieren die Zielarchitektur: RV32I + Multiply. In diesem Fall keine Compressed-Befehle, die der ESP32-C3 aber unterstützt.Das entstandene .o-File kann dann per

riscv32-esp-elf-objcopy.exe -O ihex .\square.o .\square.hex

in ein Intel-Hex-File übersetzt werden. Der generierte Inhalt sieht dann so aus:

Diese Daten können dann händisch oder per Tool in den Simulator übernommen werden.

HexFile2CArrayConverter

Mit diesem Tool kann ein generiertes Hex-File in ein C Array konvertiert werden, um dieses anschließend im Programm weiterzuverwenden.

Ein typischer generierter Output ist:

// -------------- code begin, generated Wed Nov 08 11:00:31 CET 2023
static const uint8_t squarefct_0[] = {   

0x13, 0x01, 0x01, 0xFE, 0x23, 0x2E, 0x81, 0x00, 0x13, 0x04, 0x01, 0x02, 0x23, 0x26, 0xA4, 0xFE,    

0x83, 0x27, 0xC4, 0xFE, 0xB3, 0x87, 0xF7, 0x02, 0x13, 0x85, 0x07, 0x00, 0x03, 0x24, 0xC1, 0x01,

0x13, 0x01, 0x01, 0x02, 0x67, 0x80, 0x00, 0x00};


static const uint8_t* squarefcts[] = { squarefct_0};
static const uint32_t squarefct_startaddresses[] = { 0x00000000};
static const uint32_t squarefct_arraysizes[] = { 39};
#define SQUAREFCTCOUNT 1
// -------------- code end

Aufruf des Tools:

java -jar HexFile2CArrayConverter.jar

Synopsis: HexToCConverter <file.hex> <arrayname> [-w/-b]
  converts the given HEX file; the result will be printed in the terminal
    and also copied into the Clipboard.
  the name of the created array must be provided in <arrayname>. A C style name
    shall be used.
  use -w to generate arrays of words (uint32_t), -b arrays of bytes (uint8_t)

React-O-Mat

Entwickeln Sie auf dem Book Development Board oder einem anderen Board mit zwei Tastern ein Programm, das die grüne LED aufleuchten lässt. Schalten Sie nach einer zufälligen Zeit die LED dunkel.

Nun sind zwei Spieler gefordert, einer den linken und einer den rechten Knopf zu drücken. Die Spielerin, die zuerst gedrückt hat, hat gewonnen. Auf der LED-Matrix soll ein blauer Pfeil zur siegenden Spielerin zeigen.

Sollte ein Spieler zu früh drücken, hat dieser verloren. Dies soll auf der LED-Matrix mit einem roten Pfeil auf den jeweiligen Spieler angezeigt werden.

Durch einen Reset kann das Spiel nun neu gestartet werden.

Verwenden Sie zum Erkennen der Knopfdrücke Interrupts.

Blink mit Multitasking

Verwenden Sie das BDB (book development board) zur Ausarbeitung des Beispiels.

Erstellen Sie unter FreeRTOS einen Task, der die LED_PUSH im Sekundentakt blinken lässt. Ein zweiter Task soll die LED_PULL ebenso im Sekundentakt blinken lassen.

Implementieren Sie nun in einem dritten Task eine Behandlung der beiden Taster. Beim Drücken des linken Tasters (SW2BOOT) soll das Blinked der LED_PULL verlangsamt, beim Drücken des rechten Tasters (SW3APP) beschleunigt werden.

Die Lösung soll iterativ verbessert/geändert werden (Verwenden Sie bedingte Compilierung (#ifdef), um zwischen den Lösungen per menuconfig zu wechseln):

  • Verwenden Sie im ersten Ansatz globale Variable zur Übergabe des Tastendrucks
  • Im zweiten Ansatz soll die globale Variable über einen Semaphor geschützt und synchronisiert werden
  • Schließlich soll das Ereignis über eine FreeRTOS Queue zugestellt werden

Vergleich von Sortieralgorithmen

Implementieren Sie die Sortierverfahren Selection Sort, Bubble Sort und Quicksort und führen Sie eine Geschwindigkeitsmessung durch. Verwenden Sie dafür mehrere Durchgänge in denen Sie Zufallsdaten erzeugen und diese jeweils mit den drei Verfahren sortieren.

Können Sie die in Sortierverfahren beschriebenen Aufwände bestätigen? Verwenden Sie die in Kapitel 3 beschriebene Instrumentierung zur Bestimmung der exakten Taktzyklenzahl.

Das Board, speziell zum Buch!

Zur Erleichterung des Einstiegs gibt es ein „Book Development Board“, das sämtliche Komponenten integriert hat, die für die Beispiele verwendet werden. Das sind

  • Der Mikrocontroller ESP32-C3, mit USB-C Anschluss für JTAG-Debugging und serielle Log-Ausgaben
  • Spannungswandler von 5V (USB) auf 3,3V
  • Zwei Taster für Benutzerinteraktion (plus ein Reset-Taster)
  • Zwei gelbe LEDs an GPIOs, eine in Push-Konfiguration und eine in Pull-Konfiguration
  • 25 dreifarbige WA2812b-LEDs mit eigenem Spannungswandler
  • Ein Potentiometer am ADC-Eingang
  • Eine Stiftleiste, um ein Modellbau-Servo per PWM anzuschließen
  • Stiftleisten zum Anschluss des Displays und des MAX3010x-Boards zum Aufbau eines Pulsoximeters
  • Ein Einschub für eine Mikro-SD-Karte
  • Eine Sockelleiste mit den seriellen RX und TX-Signalen
  • Ein RS-485 Transceiver nebst Stiftleiste für den Anschluss
  • Ein Temperatur-/Luftfeuchtesensor, angeschlossen über I2C (nicht im Buch beschrieben, als Zusatz)
  • Ein Beschleunigungssensor/Gyroskop, angeschlossen über SPI (nicht im Buch beschrieben, als Zusatz)
bdb, book development board

bdb, book development board

Wie die einzelnen Komponenten angeschlossen sind, kann dem Schaltplan weiter unten entnommen werden. Wichtig ist, dass Header für Jumper vorgesehen sind, da manche Pins mehrfach verwendet werden.

Konkret werden IO0, IO1, IO3 und IO9 mehrfach belegt und müssen für die jeweilige Anwendung gesetzt werden:

  • Für die beiden GPIO-LEDs muss Header 1 nach unten gejumpert werden
  • Die CS-Leitungen (SPI) für den Beschleunigungssensor und die SD-Karte befinden sich ebenso auf Header 1. D.h., dass die LEDs und Beschleunigungssensor/SD-Karte nicht gleichzeitig funktionieren.
  • Header zwei dient der Auswahl zwischen RS-485 Schnittstelle (IO9 wird hier für die Halbduplex-Richtungswahl verwendet) oder PWM (auf IO9 wird das PWM-Signal generiert).
  • Header 3 wählt die Interruptleitung vom Beschleunigungssensor oder vom Pulsoximetersensor.

Es ist auch wichtig zu wissen, dass der Taster SW3APP mit dem Potentiometer gemeinsam verdrahtet ist. Das bedeutet, dass ein Drehen am Poti den Taster auslösen kann. Zur Verwendung des Tasters muss das Poti deshalb in Endstellung sein. Ebenso ändert ein Drücken des Tasters den gemessenen Widerstand des Potis.

GPIOFunc1Func2Anmerkung
IO0LED_PUSHCS_SDJumper 1: LED oder SD-Karte
IO1LED_PULLCS_ACCJumper 1: LED oder Beschleunigung
IO2BTN, PotentiometerFunktionen beeinflussen sich gegenseitig
IO3IRQ_ACCIRQ_PULSEJumper 3: Wahl des Gerätes für IRQ
IO4MOSISPI-Leitung, einzige Funktion
IO5SDAI²C-Leitung, einzige Funktion
IO6SDLI²C-Leitung, einzige Funktion
IO7MISOSPI-Leitung, einzige Funktion
IO8LEDSWS2812c 5×5 LEDs Array
IO9RS485_DIRPWMJumper 2: Wahl RS485 oder PWM (Servo)
Gleichzeitig mit SW2BOOT belegt
TXD0Serial TXgeteilt mit RS-485 bzw. Serial Header (3,3V)
RXD0Serial RXgeteilt mit RS-485 bzw. Serial Header (3,3V)
IO18USB-JTAGFlash und Debug
IO19USB-JTAGFlash und Debug
Vordefinierte Verwendung der GPIOs

Bestellung und Lieferung

Das Board, sowie die Aufsätze Display und MAX3010x sind nun lieferbar. Bitte einfach eine Mail an patrick(AT)ritschel.at schicken, die Stückzahl und ob ein SD1306-Display bzw. ein MAX3010x gewünscht sind. Ich habe aufgrund der geringen Stückzahlen noch keine fixe Preisliste und werde die aktuellen Preise (v.a. der MAX3010x ist schwankt in meinem Einkauf stark) zusenden.

Das „Book Development Board“ mit Display und MAX30102 im Betrieb

Das Board dient nur dem Zweck des Erlernens eingebetteter Programmierung als Begleitung zum Buch. Es darf nicht für andere Zwecke verwendet werden. Es darf nicht unbeaufsichtigt betrieben werden.

This board is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

Schaltplan

Der Schaltplan sollte nur als Referenz verwendet werden und darf nicht als Basis kommerzieller Projekte.

The Schematic is in the Public Domain (or CC0 licensed, at your option). Unless required by applicable law or agreed to in writing, this schematic is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.