Ein Text LCD mit dem myMM32 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.
Die Aufgabe
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
Vorbereitung
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, öffnen 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 MM32L0 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 myMM32 Board light tun.
Führen Sie folgende Vorbereitungsarbeiten durch:
- neues Klassendiagramm anlegen
- Zielsprache ARM C++
- Zielplattform MM32L073 myMM32 Board light HAL
- Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR, …) laden
- Boardpaket für das MM32 Board light aus dem SiSy LibStore laden
BEACHTE: Bitte laden Sie für diese Übung das Treiberpaket „Board Package myMM32 Board light“ aus dem SiSy LibStore
Lösungsansatz
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 https://sisy.name/mymcu_download/produkte/MM32/RK_myMM32_light_de_en.pdf können wir den nächst möglichen Analogeingang ermitteln.
MERKE: Spezielle Treiberpakete für bekannte Boards = LibStore Board Packages
Realisierung
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 MM32"); 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.
Test
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
- Erstellen (Kompilieren und Linken)
- Brennen
- 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:
- Klassendiagramm anlegen und öffnen
- Diagrammvorlage für PEC Applikation auswählen
- laden des richtigen Board Treiber-Pakets aus dem SiSy Online LibStore
- gewünschte Bausteine im Explorer suchen und ins Diagramm ziehen
- Klassen aggregieren
- den nötigen Quellcode in den Operationen erstellen
- Erstellen und Brennen eine ARM Applikation im Klassendiagramm
Und weil es so schön war hier das Ganze noch mal als Video.
Übung 10
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.