Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
light_lcd [2020/01/15 16:40]
huwi [Weiter mit:]
light_lcd [2020/07/07 14:13] (aktuell)
huwi [Übung]
Zeile 1: Zeile 1:
-====== Einen Text LCD mit dem mySTM32 light verwenden ====== +====== Ein Text LCD mit dem mySTM32 light verwenden ====== 
-... +{{tag>ADC ANALOG LCD DISPLAY}} 
 +Für diese Übung benötigen Sie ein [[http://shop.myavr.de/Add-Ons%20und%20Zubeh%C3%B6r/myAVR%20LCD%20Add-On%20f%C3%BCr%20Textausgaben,%203%20V%20ARM.htm?sp=article.sp.php&artID=200181|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 [[https://de.wikipedia.org/wiki/HD44780|Quasistandard]] bezeichnen. Auf jeden Fall sind Textausgaben als Benutzerschnittstelle viel Leistungsfähiger und Anwenderfreundlicher als Blinkcodes von LEDs
 ===== Die Aufgabe ===== ===== Die Aufgabe =====
-...+{{ :stm32light:uclcdpoti.jpg?nolink&500|}} 
 +Es ist eine Mikrocontrollerlösung zu entwickeln bei der ein Analogwert auf einem Textdisplay visualisiert wird.
  
-**Anforderungen:** +**Anforderungen an die Lösung:** 
-//...//+  * Textdisplay mit [[https://de.wikipedia.org/wiki/HD44780|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 ===== ===== 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, öffenen sie das SiSy UML-Projekt wieder. Führen Sie folgende Vorbereitungsarbeiten durch:+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   * neues Klassendiagramm anlegen
   * Zielsprache //ARM C++//    * Zielsprache //ARM C++// 
   * Zielplattform //STM32F042 mySTM32 Board light HAL//   * Zielplattform //STM32F042 mySTM32 Board light HAL//
   * Diagrammvorlage //Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)// laden   * Diagrammvorlage //Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)// laden
-  * Treiberpaket für //STM32F0// zuweisen +  * **Boardpaket für das //STM32 Board light// aus dem SiSy LibStore laden** 
-  * optional Template //stm32F042_48Mhz// zuweisem+  * optional Template //stm32F042_48Mhz// zuweisen
  
-{{:neueskldhallo.jpg?direct&290|}}{{:pecapplication.jpg?direct&250|}}{{:stm32light:stml001.png?direct&450|}} +{{:neueskldhallo.jpg?direct&280|}}{{:pecapplication.jpg?direct&240|}}{{:stm32light:basicpatternboardpack.png?nolink&550|}} 
 + 
 +**BEACHTE: Bitte laden Sie für diese Übung das Treiberpaket "Board Package mySTM32 Board light" aus dem SiSy LibStore** 
 + 
 +{{::boardpack.png?nolink&800|}}
  
 ===== Lösungsansatz ===== ===== 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 aufbauenDie 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.
  
-[[http://shop.myavr.de/index.php?sp=article.sp.php&artID=71|AddOn Temperatursensor LM75]]+{{:stm32light:peclcd.png?nolink&1000|}}
  
-...+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.
  
-**__MERKE:__ ... ... **+Wenden wir die Prinzipien der Objektorientierung auf die Aufgabenstellung an ergibt sich daraus folgende Systembausteine: 
 + 
 +{{:uml:classsensor.png?nolink&150|}} {{:uml:klassecontroller.jpg?nolink&150|}} {{:uml:display.png?direct&150|}}\\  
 +{{:uml:sensor.png?nolink&150|}} {{:uml:smd32pin.jpg?nolink&150|}} {{:stm32light:lcd_modul_g.png?direct&250|}} 
 + 
 +Diese Systembausteine lassen sich zu folgender Anwendungsarchitektur als möglichen Grobentwurf zusammensetzen: 
 + 
 +{{:stm32light:gobdesignlcd.png?direct&1100|}} 
 + 
 +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 [[http://sisy.name/mymcu_download/produkte/lcd/techb_lcd_de_en.pdf|technische Beschreibung]] ist hilfreich. 
 + 
 +{{:stm32light:schaltplanlcd1602.png?nolink&800|}} 
 + 
 +Aus dem Schaltplan //(vglSeite 5, Technische Beschreibung myAVR LCD Add-On)// ergibt sich, dass die ersten 8 Pins am Erweiterungsanschluss durch das Add-On belegt sindDas 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 [[http://sisy.name/mymcu_download/produkte-mystm/mystm32-board-light/RK_mySTM32_light_de_en_2019-12.pdf|Referenzkarte]] können wir den nächst möglichen Analogeingang ermitteln. 
 + 
 + {{:stm32light:pinb0_adc8.png?nolink&300|}} 
 + 
 +**__MERKE:__ Spezielle Treiberpakete für bekannte Boards = LibStore Board Packages **
  
 ===== Realisierung ===== ===== Realisierung =====
-...+Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhaltenZusätzlich müssen wir noch die konkret verwendeten Ressourcen unseres Controllers zuweisenFü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.
  
-{{:stm32light:i2cexample.png?direct&1100|}}+{{:stm32light:lcdstep1.png?direct&350|}}{{:stm32light:lcdstep2.png?direct&350|}}{{:stm32light:lcdstep3.png?direct&350|}}
  
-... 
  
->Controller::onWork():void<code c> +Vervollständigen Sie ihr Klassenmodell soweit, dass es mit der folgenden Darstellung übereinstimmtOrdnen sie die Elemente übersichtlich an.
-// continuous event from the Mainloop +
-// WENN ... DANN +
-//      ... +
-// SONST +
-//      ... +
-</code>+
  
-{{ :stm32light:stml012a.png?direct&200|}}+{{:stm32light:kdlcd.png?nolink&1100|}} 
 + 
 +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**: 
 + 
 +{{ :stm32light:sdlcdstart.png?direct&200|}}
 >Controller::onStart():void<code c> >Controller::onStart():void<code c>
-...+// boot sequence after start SysTick 
 +display.setPos(1,1); 
 +display.write("Hallo mySTM32.de"); 
 +display.setPos(1,2); 
 +display.write("================"); 
 +waitMs(2000); 
 +display.clear();
 </code> </code>
  
-{{ :stm32light:stml012.png?direct&300|}}+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<code c> >Controller::onWork():void<code c>
-...+// 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
 </code> </code>
  
-...+Diesen Feinentwurf können Sie gern mit jemanden Diskutieren der vielleicht schon etwas Erfahrung mit der Programmierung von Mikrocontrollern hatZumindest 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 {{ :stm32light:sdlcd1.png?nolink&450|}} <code c> 
 +// 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); 
 +</code> 
 + 
 +Sie können die Anwendung jetzt erstellen, übertragen und testen
  
 ===== Test ===== ===== Test =====
-Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.+{{ :stm32light:stm32blcd.png?direct&300|}}Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
   - Erstellen (Kompilieren und Linken)   - Erstellen (Kompilieren und Linken)
   - Brennen   - Brennen
   - verbinden Sie ...   - verbinden Sie ...
  
-{{:erstellenbrennen.png?350|}}{{:stm32light:flashlight.png?direct&300|}}{{:stm32light:stm32bl2.png?direct&300|}}+{{:erstellenbrennen.png?400|}}{{:stm32light:flashlight.png?direct&350|}} 
 + 
 +====== 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. 
 + 
 +{{:stm32light:kdlcd10bit.png?direct&1100|}} 
 + 
 + 
 +Ändern Sie den Quelltext der Operation **OnWork()** der Klasse **Controller** wie folgt: 
 + 
 +>Controller::onWork():void {{ :stm32light:sdlcd1.png?nolink&450|}} <code c> 
 +// 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); 
 +</code> 
 + 
 +Erstellen sie das Programm, übertragen die Lösung auf den Mikrocontroller und testen sie die Anwendung. Vergleichen Sie beide Lösungen. 
  
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
 +{{tag>Video}}
 Erlernte und gefestigte Arbeitsschritte: 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. Und weil es so schön war hier das Ganze noch mal als Video.
  
-<<<< ACHTUNG VERALTETES VIDEO >>>>+><html><iframe width="1028" height="580" src="https://www.youtube.com/embed/iR5lf4leAkU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
  
-><html><iframe width="640" height="440" src="https://www.youtube.com/embed/GNvT2T8sD6I" frameborder="0" allowfullscreen></iframe></html>+[[https://youtu.be/gWuvE7pBtvk|oder die schnelle Version ohne Sprachkommentare]]
  
-====== Übung ====== +====== Übung 10 ====== 
-...+Erweitern Sie die Anwendung um eine AlarmLEDDie 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: ====== ====== Weiter mit: ======
 +  * [[light I2C|I2C Bausteine mit dem mySTM32 light verwenden]]
   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]
-  * [[light CAN|den CAN Bus auf dem mySTM32 light nutzen]] <sub>(erfordert eine SiSy Lizenz ab Version 3.7x)</sub>+ 
 +====== Suchbegriffe ======