Kommunikation mit dem PC
Für sehr viele eingebetete Systeme ist es notwendig mit anderen Systemen zu kommunizieren. Dafür gibt es unterschiedlichste Varianten. Eine der wichtigsten Kommunikationsmöglichkeiten ist die gute alte serielle Schnittstelle. Die Älteren unter uns kennen die noch. Da haben wir früher die Maus angeschlossen. Für diese Kommunikationsschnittstelle gibt es verschiedene Namen. Je nachdem in welchem Umfeld man sich bewegt läuft einem die serielle Schnittstelle als COM, TTY, RS232, RS485, UART, USART, USIC oder SERCOM über den Weg. In unserem Mikrocontroller heißt diese UART (Universal Asynchron Receiver Transmitter) oder USART (Universal Synchron Asynchron Receiver Transmitter). Im PC wir diese, obwohl wir einen USB-Anschluss benutzen, als COM-Port auftauchen. Das kann man sich im Gerätemanager unter Anschlüsse (COM & LPT) anschauen. Dafür sorgt ein kleiner Controller eine sogenannte USB-UART-Bridge. Der COM-Port im Gerätemanager wird durch den entsprechenden Gerätetreiber nur simuliert. Man spricht auch von einem virtuellen COM-Port (VCP). Diesen COM-Port werden wir für diese Aufgabe benutzen.
Die Aufgabe
Die Aufgabe soll darin bestehen, Daten per UART an den PC zu senden. Dort werden die empfangenen Daten in einem Terminal-Programm angezeigt. Generieren Sie sich verändernde Daten indem sie einen Zähler um jeweils 1 erhöhen und diesen Wert senden.
Anforderungen an die Lösung:
- Datenübertragungsgeschwindigkeit 19200 Baud
- USB-UART-Bridge an Pin A9/A10 (bereits fest ferbunden)
- 8 Bit Zähler verwenden
- maximal 100 Werte pro Sekunde senden
Vorbereitung
Führen Sie folgende Vorbereitungsarbeiten durch:
- neues Klassendiagramm anlegen
- Zielsprache ARM C++
- Zielplattform MM32L073 myMM32 Board light
- Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR) laden
- Treiberpaket für MM32L0 zuweisen
Lösungsansatz
Die Aufgabe besteht darin die UART an den Pins A9/A10 mit 19200 Baud zu konfigurieren und Daten über diese Schnittstelle an den PC zu senden. Die Verbindung der USB-UART-Bridge zu den Pins A9 und A10 des Controllers ist auf dem Board bereits fest eingebaut. Sie Benutzen diese schon die ganze Zeit jedes mal beim Programmieren über den Bootloader.
Für den Empfang von seriellen Daten benutzt man sogenannte Terminals. In älteren Versionen des Betriebssystems Windows konnte man noch solch ein Terminalprogramm unter der Rubrik Zubehör finden. Es hieß HyperTerminal. Dieses Programm stammt aus einer Zeit in der man noch mit sogenannten Modems über das normale analoge Telefonnetz Kommunikationsverbindungen zwischen Computern hergestellt hat. Naja dann kam das Internet und das war es dann für das HyperTerminal als Betriebssystemkomponente.
Für Embedded-Entwickler ist so ein Programm immer noch wichtig um mit seinem Mikrocontroller zu kommunizieren. Deshalb gibt es in SiSy ein spezielles Terminalprogramm das ControlCenter. Wir abstrahieren die UART Verbindung zu unserem Terminal als neuen Systembaustein wie folgt:
Das PEC-Framework bietet als Bibliotheksbaustein für das Senden und Empfangen von Daten über die Serielle Schnittstelle das Template PecUart und Konfigurationen für verschiedene Übertragungsgeschwindigkeiten an.
Als Bibliotheksbausteine benötigen wir us dem UART-Paket die PecUart und baudrate19200 zur Konfiguration. Die Konfiguration der Datenübertragung muss sowohl am PC-Terminal als auch im Mikrocontroller exakt übereinstimmen. Sind die Einstellungen nicht identisch kommt es zu einer fehlerhaften Datenübertragung.
Wir nutzen zur Datenübertragung folgende Konfiguration:
- 19200 Baud
- 8 Datenbits (default)
- keine Paritätsprüfung (default)
- 1 Stoppbit (default)
Der Grobentwurf für diese Lösung sieht dann so aus:
MERKE: UART = immer die Datenübertragungsgeschwindigkeit in BAUD konfigurieren
Realisierung
Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss noch die richtige UART Konfiguration hinzugefügt werden. ARM Controller verfügen über eine Busmatrix. Das bedeutet, dass interne Bausteine wie eine UART nicht fest mit den entsprechenden Pins verbunden sind sondern der Hard-/Software-Entwickler aus mehreren möglichen Pin-Konfigurationen wählen kann. Die entsprechenden Informationen findet man in den Dokumentationen zum Controller (Data-Sheet, Reference-Manual, …). Am Anfang des Tutorials haben wir ihnen empfohlen sich diese Referenzkarte auszudrucken und neben die Tastatur zu legen. Jetzt ist ein guter Zeitpunkt sich die Referenzkarte anzuschauen. Sie finden hier die relevanten Informationen um die korrekte UART Konfiguration zu ermitteln.
Sie finden den Bibliotheksbaustein uart1portA9_MM32L0 über den Explorer. Sie können auch die kleine Fragezeichenschaltfläche an PecUart [?] benutzen.
Die Daten welche wir zum PC senden wollen generieren wir uns mit einem einfachen Zähler. Die Variable für diesen Zähler legen wir uns als Attribut der Klasse Controller an.
Ihr Klassenmodell sollte nach den entsprechenden Arbeitsschritten der folgenden Darstellung entsprechen.
Jetzt fehlt nur noch das geforderte Verhalten zu codieren. Die einfachste Variante ist den rohen Wert zu übertragen.
Controller::onWork():void// continous event from the Mainloop counter++; terminal.writeByte(counter); waitMs(10);
Vergleichen Sie diese Lösung mit dem folgenden alternativen Lösungsansatz.
Controller::onWork():void// continous event from the Mainloop counter++; String txt; txt.format("\n Hallo mySTM32, counter= %d",counter); terminal.writeString(txt); waitMs(10);
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 …
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers und Starten das Werkzeug ControlCenter.
- Erstellen (Kompilieren und Linken)
- Brennen
- Menü Werkzeuge, ControlCenter
Stellen Sie im ControlCenter die Parameter für die Verbindung mit dem Board ein. Achten Sie auf den richtigen COM-Port und die korrekte Baudrate. Der COM-Port ist ggf. dem Gerätemanager zu entnehmen.
Jetzt können Sie die gewünschten Daten vom Controller empfangen.
Videozusammenfassung
Erlernte und gefestigte Arbeitsschritte:
- Klassendiagramm anlegen und öffnen
- Diagrammvorlage für PEC Applikation auswählen, laden und Treiberpaket für STM32F4 einfügen
- gewünschte Bausteine im Explorer/Navigator suchen und ins Diagramm ziehen
- Klassen und Templates zu Komponenten zusammenbauen
- den nötigen Quellcode in den Operationen erstellen
- Erstellen und Brennen einer ARM Applikation im Klassendiagramm
- Bibliotheksbaustein PecUart anwednen
- das SiSy-Controlcenter konfigurieren und anwenden
Und hier diesen Abschnitt wiederum als Videozusammenfassung.
Übung 5
Fügen Sie einen Taster als SendenTaste der Systemlösung hinzu. Stellen Sie die Lösung so um, dass die Datenübertragung im 100 Millisekunden Systemereignis onEvent100ms() erfolgt wenn die Taste Senden betätigt ist.