Ein Text LCD mit dem mySTM32 light verwenden

Für diese Übung benötigen Sie ein Text-LCD Add-On in der 3V Ausführung. Kleine Displays finden wir nicht selten an eingebetteten Systemen. Dabei unterscheidet man zum Beispiel in Text- und Grafik-Displays. Diese Übung zeigt die Anwendung eines Textdisplays mit 16 Zeichen in je zwei Zeilen. Diese Art Display kann man auf Grund ihrer häufigen Anwendung schon fast als Quasistandard bezeichnen. Auf jeden Fall sind Textausgaben als Benutzerschnittstelle viel Leistungsfähiger und Anwenderfreundlicher als Blinkcodes von LEDs.

Es ist eine Mikrocontrollerlösung zu entwickeln bei der ein Analogwert auf einem Textdisplay visualisiert wird.

Anforderungen an die Lösung:

  • Textdisplay mit HD44780 Displaycontroller oder kompatibel
  • Display im 4 Bit Modus, Pins sparen
  • Analogwert als Zahl in der erster Zeile darstellen
  • Analogwert als Balken in der zweiten Zeile darstellen

Wenn Sie noch ein Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt „nach oben“. Falls das Projekt nicht mehr geöffnet ist, öffenen sie das SiSy UML-Projekt wieder.

Die Vorbereitungsarbeiten unterscheiden sich diesmal etwas von der bisherigen Prozedur. Damit wir wenig Schreibaufwand für den nötigen Quellcode haben benutzen wir diesmal ein spezielles Board-Paket aus dem SiSy Online-LibStore, statt das allgemeine Treiberpaket für den STM32F0 zu laden. Da der Anschluss des Displays mehrere Pins beansprucht und diese in den Zielsystemen sehr unterschiedlich angeordnet sein können ist der Bibliotheksbaustein allgemeingültig gehalten. Der Entwickler muss die Zuordnung der konkreten Pins für das Display normalerweise selber implementieren, indem er die entsprechenden Pin-Operationen überschreibt. Wenn ein Board und dessen Pin-Konfiguration bekannt ist, kann die Pin-Anpassung als vorbereiteter Baustein geladen werden. Genau das werden wir für das mySTM32 Board light tun.

Führen Sie folgende Vorbereitungsarbeiten durch:

  • neues Klassendiagramm anlegen
  • Zielsprache ARM C++
  • Zielplattform STM32F042 mySTM32 Board light HAL
  • Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR) laden
  • Boardpaket für das STM32 Board light aus dem SiSy LibStore laden
  • optional Template stm32F042_48Mhz zuweisen

BEACHTE: Bitte laden Sie für diese Übung das Treiberpaket „Bard Package mySTM32 Board light“ aus dem SiSy LibStore

Wenn wir uns die Aufgabenstellung genauer ansehen stellen wir fest, dass einige der Anforderungen in vorangegangenen Übungen bereits bearbeitet wurde.

  • Pakete aus dem LibStore laden
  • einen Analogwert einlesen
  • Zahlenwerte als Texte formatieren

Darauf können wir aufbauen. Die Aufgabe erinnert an die Ausgabe der Werte per UART. Diesmal senden wir die Ausgaben nicht an den PC sondern an das Display. Schauen wir uns den Bibliotheksbaustein PecTextLcd16x2 an.

Die Ausgabe der Texte erfolgt über die Operation write(„…“). Für die Ausgabe an bestimmen Positionen steht uns die Operation setPos(x,Y) zur Verfügung mit clear() kann das Display gelöscht werden. Das sollte für die Aufgabe reichen.

Wenden wir die Prinzipien der Objektorientierung auf die Aufgabenstellung an ergibt sich daraus folgende Systembausteine:


Diese Systembausteine lassen sich zu folgender Anwendungsarchitektur als möglichen Grobentwurf zusammensetzen:

Dieser Architekturentwurf lässt sich wie folgt als „natürlicher“ Text lesen:

  • Der Controller hat einen Sensor und ein Display
  • Der Sensor ist ein PecAdcChannel mit adcResolution8bit
  • Das Display ist ein PecTextLcd16x2 mit lcd_useBacklight

Die konkreten Pins, Kanäle, und sonstige Hardwarekonfigurationen müssen während der Realisierung zugewiesen werden. Dazu ist es notwendig sich mit dem Text LCD Add-On näher zu beschäftigen. Ein blick in die technische Beschreibung ist hilfreich.

Aus dem Schaltplan (vgl. Seite 5, Technische Beschreibung myAVR LCD Add-On) ergibt sich, dass die ersten 8 Pins am Erweiterungsanschluss durch das Add-On belegt sind. Das sind die Pins A0 bis A7. Diese stehen somit für andere Aufgaben nicht mehr zur Verfügung. Der Sensor muss an einem anderen Pin angeschlossen werden. Auf der Referenzkarte können wir den nächst möglichen Analogeingang ermitteln.

MERKE: Spezielle Treiberpakete für bekannte Boards = LibStore Board Packages

Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich müssen wir noch die konkret verwendeten Ressourcen unseres Controllers zuweisen. Für das Display benutzen wir die Konfiguration aus dem Boardpaket textLcdSTMlight. Für den ADC sollen wir PinB0 nutzen. Die Handlungsschritte für die korrekte Konfiguration des Text-Displays werden im Folgenden näher gezeigt.

Vervollständigen Sie ihr Klassenmodell soweit, dass es mit der folgenden Darstellung übereinstimmt. Ordnen sie die Elemente übersichtlich an.

Als ersten vorsichtigen Test geben wir auf Zeile eins und zwei einfache Begrüßungstexte aus die wir nach zwei Sekunden wieder löschen. Notieren sie folgenden Code in der Operation onStart() der Klasse Controller:

Controller::onStart():void
// boot sequence after start SysTick
display.setPos(1,1);
display.write("Hallo mySTM32.de");
display.setPos(1,2);
display.write("================");
waitMs(2000);
display.clear();

Das können wir bei Bedarf schon einmal erstellen, übertragen und testen.

Die eigentliche Lösung der Aufgabenstellung erfolgt in der Operation onWork() der Klasse Controller. Bei etwas komplexeren Lösungen die offensichtlich mehr als drei Zeilen Code erfordern notieren zuerst die Lösungsidee als Kommentare.

Controller::onWork():void
// continuous event from the Mainloop
// lese Analogwert ein
// formatiere die Textausgabe 
// Textausgabe Analogwert in der ersten Zeile
// Balken als Anzeige in der zweiten Zeile
// WIEDERHOLE VON 0 BIS 16 
//   WENN WERT<MAX/16 DANN Ausgbae "*"
//   SONST                 Ausgabe " " 
// dem Auge Zeit lassen das Display zu lesen

Diesen Feinentwurf können Sie gern mit jemanden Diskutieren der vielleicht schon etwas Erfahrung mit der Programmierung von Mikrocontrollern hat. Zumindest sollen Sie für sich selbst diesen Lösungsentwurf noch einmal in Ruhe verinnerlichen und gedanklich durchspielen.

Jetzt kann der eigentliche Quellcode geschrieben werden. Ergänzen Sie den Code der Operation onWork() der Klasse Controller wie folgt:

Controller::onWork():void
// continuous event from the Mainloop ---------------
// lese Analogwert ein
uint8_t value;
value=sensor.getValue();
// formatiere die Textausgabe ------------------------
String txt;
txt.format("Value=%d  ",value);
// Textausgabe Analogwert in der ersten Zeile --------
display.home();
display.write(txt);
// Balken als Anzeige in der zweiten Zeile -----------
display.setPos(1,2);
for (uint8_t i=0; i<16; i++ )
{
	if (i<=value/16) display.write("*");
	else             display.write(" ");
}
// dem Auge Zeit lassen das Display zu lesen ---------
waitMs(100);

Sie können die Anwendung jetzt erstellen, übertragen und testen.

Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.

  1. Erstellen (Kompilieren und Linken)
  2. Brennen
  3. verbinden Sie …

Variante

Ändern die die Anwendung so ab, dass ein 10 Bit Analogwert (0..1023) auf dem Display visualisiert wird. Ändern Sie das Klassenmodell so ab, dass der Sensor 10 Bit Analogwerte liefert.

Ändern Sie den Quelltext der Operation OnWork() der Klasse Controller wie folgt:

Controller::onWork():void
// continuous event from the Mainloop ---------------
// lese Analogwert ein
uint16_t value;
value=sensor.getValue();
// formatiere die Textausgabe ------------------------
String txt;
txt.format("Value=%d  ",value);
// Textausgabe Analogwert in der ersten Zeile --------
display.home();
display.write(txt);
// Balken als Anzeige in der zweiten Zeile -----------
display.setPos(1,2);
for (uint16_t i=0; i<16; i++ )
{
	if (i<=value/64) display.write("*");
	else             display.write(" ");
}
// dem Auge Zeit lassen das Display zu lesen ---------
waitMs(100);

Erstellen sie das Programm, übertragen die Lösung auf den Mikrocontroller und testen sie die Anwendung. Vergleichen Sie beide Lösungen.

Videozusammenfassung

Erlernte und gefestigte Arbeitsschritte:

  1. Klassendiagramm anlegen und öffnen
  2. Diagrammvorlage für PEC Applikation auswählen
  3. laden des richtigen Board Treiber-Pakets aus dem SiSy Online LibStore
  4. gewünschte Bausteine im Explorer suchen und ins Diagramm ziehen
  5. Klassen aggregieren
  6. den nötigen Quellcode in den Operationen erstellen
  7. Erstellen und Brennen eine ARM Applikation im Klassendiagramm

Und weil es so schön war hier das Ganze noch mal als Video.

«« ACHTUNG VERALTETES VIDEO »»

Übung

Erweitern Sie die Anwendung um eine AlarmLED. Die AlarmLED soll bei Sensorwerten unter 100 schnell Blinken (flicker).
Bei werten über 100 ist die LED aus. Nutzen Sie für die AlarmLED das Pin B4. Geben Sie die Information „OK“ oder „ALARM“ zusätzlich auf dem Display aus.

Weiter mit: