Kommunikation mit dem PC
Eingebettete Systeme besitzen oft eine Schnittstelle zur PC-Welt oder anderen eingebetteten Systemen. Das können ein USB-Anschluss, Ethernet, Infrarot, Bluetooth oder zum Beispiel auch WiFi sein. Eine nach wie vor oft verwendete Schnittstelle ist die gute alte UART. Obwohl diese schon recht betagt ist, finden wir faktisch in jeder Controllerfamilie diese Schnittstelle wieder. Der XMC4500 verfügt über 3 universelle serielle Schnittstellen (USIC) mit je 2 Kanälen, die unter anderem auch als UART bzw. USART arbeiten können. Die hohe Verfügbarkeit und die einfache Handhabung machen diese Schnittstelle sehr attraktiv. So können eingebettete Systeme über diese Schnittstelle Messwerte senden oder konfiguriert und debuggt werden.
Die Aufgabe
Die Aufgabe soll darin bestehen, die Zeichenkette „Hallo XMC!“ per UART an den PC zu senden. Dort werden die empfangenen Daten in einem Terminal-Programm angezeigt.
Vorbereitung
Falls Sie jetzt noch das 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. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache ARM C++. Beachten Sie die Einstellungen für die Zielplattform XMC4500 Relax Kit. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie die Diagrammvorlage für eine PEC Applikation und weisen das Treiberpaket für den XMC4500 zu.
Grundlagen
Da heutige Rechner kaum noch über eine klassische RS232-Schnittstelle (COM) verfügen, benutzen wir eine USB-UART-Bridge. Auf dem Zusatzboard für das XMC4500 Relax Kit ist dafür eine entsprechende Nachrüstung vorgesehen.
Studieren wir die Referenzunterlagen stellen wir fest, dass sich die Sendeleitung TxD (transmit data) und die Empfangsleitung RxD (receive data) der USIC/UART als Alternativfunktionen über die Busmatrix auf verschiedene GPIO-Pins legen lassen. Wir wollen die USIC1 Channel0 am Port 2 verwenden. Damit lautet unsere Konfiguration: Pin 2.14 ist die Sendeleitung TxD und Pin 2.15 ist die Empfangsleitung RxD. Die Geschwindigkeit für die Datenübertragung legen wir mit 9600 Baud fest.
Zusätzlich ist die USB-UART-Bridge mit dem PC zu verbinden. Dazu benötigen Sie ein zweites Mini-USB-Kabel. Über die USB-Verbindung zum integrierten JLink wird der Controller programmiert und das System mit Spannung versorgt.
Entwurf
Für die zu entwerfende Anwendung wollen wir vorhandene Bausteine (Klasse/Templates) für die UART nutzen. Dazu schauen wir uns in den UML Paketen des Frameworks um.
Dort werden wir fündig mit dem allgemeinen Interface für eine UART und den konkreten Templates für die UART-Anbindung an einen bestimmten Port sowie den gewünschten Baudraten.
Ergänzen Sie die Grundstruktur zu dem hier gezeigten Entwurf.
Realisierung
Nachdem wir die benötigten Bausteine (PecUart, usart1c0_P2.14/P2.15_xmc4500, baudrate9600) aus der Bibliothek bezogen und zu einer Komponenten (Terminal) zusammengesetzt haben wurde diese im System (Controller) als Instanz (terminal) aggregiert. Jetzt können wir die Instanz der Komponente benutzen. Realisieren Sie die geforderte Ausgabe der Zeichenkette „Hallo XMC!“ wie folgt in der Methode onWork.
terminal.writeString("Hallo XMC!\n"); waitMs(1000);
Test
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers und starten Sie 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äte-Manager zu entnehmen).
Jetzt können Sie die gewünschten Daten vom Controller empfangen.
Erweiterung
Als Erweiterung der Anwendung sollen Zeichen vom PC empfangen und wieder zurückgesendet werden. Dabei ist zu beachten, dass nur dann, wenn Zeichen verfügbar sind, diese auch von der UART abgeholt werden dürfen. Mit den Operationen dataAvailable und readByte stellt die UART die benötigte Funktionalität zur Verfügung. Dieses „Echo“ ergänzen Sie bitte wie folgt in der Methode onWork:
while (terminal.dataAvailable()) { char zeichen; zeichen=terminal.readByte(); terminal.writeByte(zeichen); } // das ist jetzt nur noch Kommentar // terminal.writeString("Hallo XMC!\n"); // waitMs(100);
Videozusammenfassung
Erlernte und gefestigte Arbeitsschritte:
- Klassendiagramm anlegen und öffnen
- Diagrammvorlage für ARM C++ Applikation auswählen und laden
- Navigator auf UML Pakete umschalten
- gewünschte Klassen im Navigator suchen und ins Diagramm ziehen
- Klassen aggregieren
- Operationen einer Klasse anlegen
- Klassen und Templates zu Komponenten zusammenbauen
- den nötigen Quellcode in den Operationen erstellen
- Erstellen und Brennen einer ARM Applikation im Klassendiagramm
- das Sisy-Controlcenter konfigurieren und anwenden
Und hier diesen Abschnitt wiederum als Videozusammenfassung.
Übung
Erweitern Sie zur Übung die Anwendung um einen Taster. Die Ausgabe „Hallo XMC!“ per UART soll nur erfolgen, solange der Taster gedrückt ist. Das Echo soll unabhängig von der gedrückten Taste zurück gesendet werden.