Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
usart [2019/01/29 17:07]
huwi [Videozusammenfassung]
usart [2019/07/27 16:49] (aktuell)
huwi
Zeile 1: Zeile 1:
 ====== Die UART-Klasse ====== ====== Die UART-Klasse ======
-Die UART ([[http://​de.wikipedia.org/​wiki/​Universal_Asynchronous_Receiver_Transmitter|Universal Asynchronous Receiver Transmitter]]) oder besser gesagt USART (Universal Synchronous/​Asynchronous Receiver Transmitter) ist für eingebettete Systeme eine der wichtigsten Kommunikationsschnittstellen. Technisch gesehen verfügen AVR-Mikrocontroller über eine USART, aber in den meisten Fällen wird diese als UART, also asynchron betrieben. Zwischen Controllern erfolgt die Verbindung oft direkt und über größere Entfernungen mit entsprechenden Treiberbausteinen (vgl. [[http://​de.wikipedia.org/​wiki/​RS-232|RS232]]/​[[http://​de.wikipedia.org/​wiki/​EIA-485|RS485]]). Die grundlegenden Funktionen der UART sind im myAVR C++ Framework in der gleichnamigen Klasse //​Uart// ​zusammengegfasst.+Die UART ([[http://​de.wikipedia.org/​wiki/​Universal_Asynchronous_Receiver_Transmitter|Universal Asynchronous Receiver Transmitter]]) oder besser gesagt USART (Universal Synchronous/​Asynchronous Receiver Transmitter) ist für eingebettete Systeme eine der wichtigsten Kommunikationsschnittstellen. Technisch gesehen verfügen AVR-Mikrocontroller über eine USART, aber in den meisten Fällen wird diese als UART, also asynchron betrieben. Zwischen Controllern erfolgt die Verbindung oft direkt und über größere Entfernungen mit entsprechenden Treiberbausteinen (vgl. [[http://​de.wikipedia.org/​wiki/​RS-232|RS232]]/​[[http://​de.wikipedia.org/​wiki/​EIA-485|RS485]]). Die grundlegenden Funktionen der UART sind im myAVR C++ Framework in der gleichnamigen Klasse //​Uart// ​zusammengefasst.
  
->>>>>>>>>>>>​>​{{:​uart.jpg?​350|}}+>​{{:​uart.jpg?​350|}}
  
 Wichtig ist noch zu erwähnen, dass die Klasse //Uart// auch ein Ereignis //onEvent// auslöst, wenn ein Datenbyte empfangen wurde. Dabei ist die Uart-Instanz der Sender des Ereignisses und als Daten wird das empfangene Byte übergeben. Wichtig ist noch zu erwähnen, dass die Klasse //Uart// auch ein Ereignis //onEvent// auslöst, wenn ein Datenbyte empfangen wurde. Dabei ist die Uart-Instanz der Sender des Ereignisses und als Daten wird das empfangene Byte übergeben.
Zeile 9: Zeile 9:
 Bei dem hier verwendeten Experimentierboard ist die serielle Schnittstelle über den mySmartUSB MK2 bereits mit dem PC verbunden. Da heute der gute alte COM-Port an PCs und vor allem an Notebooks leider kaum noch anzutreffen ist, wird als Treiberbaustein eine [[http://​www.silabs.com/​products/​interface/​usbtouart/​Pages/​usb-to-uart-bridge.aspx|USB-UART-Bridge]] verwendet. Wir schließen das Bord dementsprechend über USB an. Der Mikrocontroller merkt gar nicht, dass er per USB angeschlossen wurde und auf PC-Seite wird im System ein virtueller COM-Port eingerichtet. Somit ist das recht aufwendige USB-Protokoll vor dem Anwender verborgen und es werden ganz simpel einzelne Datenbytes hin und her geworfen - wie in den guten alten Zeiten. ​ Bei dem hier verwendeten Experimentierboard ist die serielle Schnittstelle über den mySmartUSB MK2 bereits mit dem PC verbunden. Da heute der gute alte COM-Port an PCs und vor allem an Notebooks leider kaum noch anzutreffen ist, wird als Treiberbaustein eine [[http://​www.silabs.com/​products/​interface/​usbtouart/​Pages/​usb-to-uart-bridge.aspx|USB-UART-Bridge]] verwendet. Wir schließen das Bord dementsprechend über USB an. Der Mikrocontroller merkt gar nicht, dass er per USB angeschlossen wurde und auf PC-Seite wird im System ein virtueller COM-Port eingerichtet. Somit ist das recht aufwendige USB-Protokoll vor dem Anwender verborgen und es werden ganz simpel einzelne Datenbytes hin und her geworfen - wie in den guten alten Zeiten. ​
  
->>>>>>>>​>​{{:​usb.jpg?​500|}}+>​{{:​usb.jpg?​500|}}
  
 Auf PC-Seite benötigt man nur noch ein kleines Programm, um Datenbytes vom COM-Port abzuholen. Dafür gibt es zahlreiche Lösungen. In manchen Betriebssystemen wird solch ein Terminal-Programm sogar noch mitgeliefert. In der hier verwendeten Entwicklungsumgebung SiSy steht das //myAVR ControlCenter//​ dafür zur Verfügung. Entscheidend für eine erfolgreiche Kommunikation ist, dass beide Kommunikationspartner mit den gleichen Einstellungen arbeiten. Zum Beispiel mit 9600 Baud Geschwindigkeit,​ 8 Daten-Bits, 1 Stopp-Bit und ohne Paritätsprüfung (9600,​n,​8,​1). Die folgende Darstellung zeigt genau diese Einstellungen im //​ControlCenter//​. ​ Auf PC-Seite benötigt man nur noch ein kleines Programm, um Datenbytes vom COM-Port abzuholen. Dafür gibt es zahlreiche Lösungen. In manchen Betriebssystemen wird solch ein Terminal-Programm sogar noch mitgeliefert. In der hier verwendeten Entwicklungsumgebung SiSy steht das //myAVR ControlCenter//​ dafür zur Verfügung. Entscheidend für eine erfolgreiche Kommunikation ist, dass beide Kommunikationspartner mit den gleichen Einstellungen arbeiten. Zum Beispiel mit 9600 Baud Geschwindigkeit,​ 8 Daten-Bits, 1 Stopp-Bit und ohne Paritätsprüfung (9600,​n,​8,​1). Die folgende Darstellung zeigt genau diese Einstellungen im //​ControlCenter//​. ​
  
->>>>>​> {{:​com.jpg?​600|}}+>​{{:​com.jpg?​600|}}
  
 Wir wollen diesen Einstellungen hier im Tutorial als unseren Kommunikationsstandard betrachten. Beachten Sie, dass der konkrete COM-Port an jedem System unterschiedlich zugeordnet sein kann. Oft wird COM3 oder COM4 bei der Erstinstallation als virtueller COM-Port zugewiesen. Sie können die Zuordnung des konkreten COM-Ports über den Gerätemanager überprüfen und auch ändern. Des Weiteren wurden im //myAVR ControlCenter//​ spezielle Optionen für den mySmartUSB MK2 aktiviert. Dadurch wird dieser beim Testen der Anwendung automatisch vom Programmer-Modus in den Daten-Modus und zurück umgeschaltet. Wir wollen diesen Einstellungen hier im Tutorial als unseren Kommunikationsstandard betrachten. Beachten Sie, dass der konkrete COM-Port an jedem System unterschiedlich zugeordnet sein kann. Oft wird COM3 oder COM4 bei der Erstinstallation als virtueller COM-Port zugewiesen. Sie können die Zuordnung des konkreten COM-Ports über den Gerätemanager überprüfen und auch ändern. Des Weiteren wurden im //myAVR ControlCenter//​ spezielle Optionen für den mySmartUSB MK2 aktiviert. Dadurch wird dieser beim Testen der Anwendung automatisch vom Programmer-Modus in den Daten-Modus und zurück umgeschaltet.
Zeile 22: Zeile 22:
 Wir wollen uns an die UART langsam herantasten. Zunächst gilt es, eine serielle Verbindung zum PC aufzubauen und ganz simple Daten an diesen zu senden. Die Geschwindigkeit mit der die Daten gesendet werden soll 9600 Baud betragen. Bei AVR Controllern sind die üblichen Einstellungen von 8 Daten-Bits, keine Paritätsprüfung und 1 Stoppbit Werksstandard und für die USART nach dem RESET voreingestellt. Es ist der folgende Plan zu realisieren:​ Wir wollen uns an die UART langsam herantasten. Zunächst gilt es, eine serielle Verbindung zum PC aufzubauen und ganz simple Daten an diesen zu senden. Die Geschwindigkeit mit der die Daten gesendet werden soll 9600 Baud betragen. Bei AVR Controllern sind die üblichen Einstellungen von 8 Daten-Bits, keine Paritätsprüfung und 1 Stoppbit Werksstandard und für die USART nach dem RESET voreingestellt. Es ist der folgende Plan zu realisieren:​
  
->>><​code cpp>+><​code cpp>
 ////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////​
 // ENTWURF Beispiel Uart1 // ENTWURF Beispiel Uart1
Zeile 48: Zeile 48:
 späteren Wartungsaufwand in der Software. Wir wählen den Begriff //​terminal//​ für unsere Uart-Instanz und initialisieren diese mit 9600 Baud. Zusätzlich sorgen wir mit der Funktion //waitMs// dafür, dass die Handbremse etwas angezogen wird. Damit nachher nicht alles viel zu schnell geht. späteren Wartungsaufwand in der Software. Wir wählen den Begriff //​terminal//​ für unsere Uart-Instanz und initialisieren diese mit 9600 Baud. Zusätzlich sorgen wir mit der Funktion //waitMs// dafür, dass die Handbremse etwas angezogen wird. Damit nachher nicht alles viel zu schnell geht.
  
->>><​code cpp>+><​code cpp>
 ////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////​
 // Beispiel Uart1 // Beispiel Uart1
Zeile 74: Zeile 74:
 Bilden, übertragen und testen Sie das Programm. Mit der Schaltfläche //​Ausführen//​ startet SiSy das //myAVR ControlCenter//​. Überprüfen Sie die Einstellungen für den COM Port und aktivieren Sie die serielle Verbindung. ​ Bilden, übertragen und testen Sie das Programm. Mit der Schaltfläche //​Ausführen//​ startet SiSy das //myAVR ControlCenter//​. Überprüfen Sie die Einstellungen für den COM Port und aktivieren Sie die serielle Verbindung. ​
  
->>>>>​>​{{:​com.jpg?​600|}}+>​{{:​com.jpg?​600|}}
  
 Mit der Schaltfläche //Start// wird der COM-Port geöffnet und es beginnt die Kommunikation. Mit der Schaltfläche //Start// wird der COM-Port geöffnet und es beginnt die Kommunikation.
  
->>>>​>​{{:​coma.jpg?​600|}}+>​{{:​coma.jpg?​600|}}
  
 Sie erhalten im Terminalprogramm das empfangene Zeichen als Buchstabe **"​A"​** dargestellt. Wenn Sie die Initialisierung der Variable //wert// mit der Zahl 65 und der Kodierung von druckbaren Zeichen in der [[http://​en.wikipedia.org/​wiki/​ASCII|ASCII-Tabelle]] anschauen, sollte klar werden warum im Controlcenter ein A erscheint. Sie können sich die empfangenen Werte auch als Zahl anschauen, indem Sie das Darstellungsformat von //Text// auf //Zahl// umschalten. Sie erhalten im Terminalprogramm das empfangene Zeichen als Buchstabe **"​A"​** dargestellt. Wenn Sie die Initialisierung der Variable //wert// mit der Zahl 65 und der Kodierung von druckbaren Zeichen in der [[http://​en.wikipedia.org/​wiki/​ASCII|ASCII-Tabelle]] anschauen, sollte klar werden warum im Controlcenter ein A erscheint. Sie können sich die empfangenen Werte auch als Zahl anschauen, indem Sie das Darstellungsformat von //Text// auf //Zahl// umschalten.
  
->>>>​>​{{:​comz.jpg?​600|}}+>​{{:​comz.jpg?​600|}}
  
 Das Programm lässt sich leicht erweitern, um etwas weniger langweilig ein A nach dem anderen zu senden. Ergänzen Sie in der Operation //onWork// das Hochzählen des zu sendenden Wertes. Das Programm lässt sich leicht erweitern, um etwas weniger langweilig ein A nach dem anderen zu senden. Ergänzen Sie in der Operation //onWork// das Hochzählen des zu sendenden Wertes.
  
->>><​code cpp>+><​code cpp>
 class Application : public Controller class Application : public Controller
 { {
Zeile 111: Zeile 111:
 Bilden, übertragen und testen Sie das Programm. Siehe da - der Mikrocontroller kennt das Alphabet! Bilden, übertragen und testen Sie das Programm. Siehe da - der Mikrocontroller kennt das Alphabet!
  
->>>>​>​{{:​compp.jpg?​600|}}+>​{{:​compp.jpg?​600|}}
  
 Jetzt macht es auch Sinn sich das Ganze mal grafisch anzuschauen,​ indem man das Ausgabeformat //Oszi// im Controlcenter wählt. Jetzt macht es auch Sinn sich das Ganze mal grafisch anzuschauen,​ indem man das Ausgabeformat //Oszi// im Controlcenter wählt.
  
->><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​cYlYS2A7CZ8"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​+><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​cYlYS2A7CZ8"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​
  
 ==== Zeichen empfangen und auswerten ==== ==== Zeichen empfangen und auswerten ====
Zeile 122: Zeile 122:
 Zunächst wieder erst der Plan: Zunächst wieder erst der Plan:
  
->>><​code cpp>+><​code cpp>
 ////////////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////////////​
 // Entwurf Beispiel Uart-Kommando-Interpreter // Entwurf Beispiel Uart-Kommando-Interpreter
Zeile 158: Zeile 158:
 Als Aktoren benutzen wir die LEDs und schließen diese an Port B Bit 0 bis 3 an. Als Aktoren benutzen wir die LEDs und schließen diese an Port B Bit 0 bis 3 an.
  
->>>>>>>​>​{{:​kommandos.jpg?​400|}}+>​{{:​kommandos.jpg?​400|}}
  
 Jetzt kann die Realisierung beginnen. Jetzt kann die Realisierung beginnen.
  
->>><​code cpp>+><​code cpp>
 ////////////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////////////​
 // Beispiel Uart-Kommando-Interpreter // Beispiel Uart-Kommando-Interpreter
Zeile 213: Zeile 213:
 Soll die Steuerung, während Sie auf die Kommandos wartet, weitere Aufgaben übernehmen wie zum Beispiel Messwerte erfassen und eine entsprechende Regelung realisieren,​ dann kann es günstig sein, den Kommandointerpreter in der Ereignisbehandlung //onEvent// zu positionieren. Das kann dann wie folgt aussehen: Soll die Steuerung, während Sie auf die Kommandos wartet, weitere Aufgaben übernehmen wie zum Beispiel Messwerte erfassen und eine entsprechende Regelung realisieren,​ dann kann es günstig sein, den Kommandointerpreter in der Ereignisbehandlung //onEvent// zu positionieren. Das kann dann wie folgt aussehen:
  
->>><​code cpp>+><​code cpp>
 //////////////////////////////////////////////////////////​ //////////////////////////////////////////////////////////​
 // Beispiel Kommandointerpreter 2 // Beispiel Kommandointerpreter 2
Zeile 268: Zeile 268:
 Ändern, bilden, übertragen und testen Sie das Programm. ​ Ändern, bilden, übertragen und testen Sie das Programm. ​
  
 +====== Videozusammenfassung ======
 +><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​tm4PCRexPc4"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​
  
- 
-====== Videozusammenfassung ====== 
->>><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​tm4PCRexPc4"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​ 
 ====== Nächstes Thema ====== ====== Nächstes Thema ======
 [[STRINGS|Zeichenketten in myAVR C++]] [[STRINGS|Zeichenketten in myAVR C++]]