Lernpaket Mikrocontroller Kap 4       

Elektronik-Labor  Lernpakete  AVR  LPmikros                  

 4 Die serielle Schnittstelle
 
Die serielle Kommunikation über die Leitungen TXD und RXD ist entscheidend für zahlreiche Anwendungen des Mikrocontrollers von der Messwerterfassung bis zur Steuerung externer Verbraucher oder der Programmierung und der Fehlersuche in Programmen. Mit der seriellen Software-Schnittstelle kann der Tiny85 Kontakt mit dem PC aufnehmen.
 
4.1 Print-Ausgaben
 
Mit dem Print-Befehl lassen sich Daten an den PC schicken, was für Messwerte oder zur Fehlersuche sinnvoll ist. Während alle ATmega-Controller eine serielle Schnittstelle als Hardware-Baugruppe besitzen, muss man bei ATtiny-Controllern eine Software-Schnittstelle einrichten.
 
 

 
Abb. 4.1: Detailschaltbild zur seriellen Schnittstelle
 
Die Sendeleitung muss in diesem Fall an B1 liegen, weil diese Leitung zum RXD-Eingang des USB-Seriell-Wandlers führt. B1 wird durch die Programmierung zur Sendeleitung TXD des Controllers. Die Initialisierung mit Open "comb.1:9600,8,n,1" For Output As #1 legt die Sendeleitung B1 fest und stellt die Baudrate auf 9600 Bit pro Sekunde ein. Die Schnittstelle erhält die Nummer #1.
 
B1 muss als Ausgang konfiguriert werden, darf aber ansonsten im Programm nicht als Port verwendet werden. Es verbietet sich daher, den Port B insgesamt anzusprechen, denn damit würde man auch B1 verändern und die serielle Datenausgabe stören.
 
 
'Print1.bas Blinker mit Print-Ausgabe 
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
 
Dim N As Byte
Open "comb.1:9600,8,n,1" For Output As #1
Config Portb = &B00011010
 
For N = 1 To 100
  Portb.3 = 1                       
  Portb.4 = 0                                              
  Waitms 500
  Portb.3 = 0                                              
  Portb.4 = 1                                              
  Waitms 500
  Print #1 , N
Next N
 
End
 
Listing 4.1: Ausgabe von Zahlen
 
Das Programm realisiert einen Wechselblinker mit einer Zählschleife. Die Zählervariable N wird zusätzlich mit Print #1, N ausgegeben. Starten Sie das Bascom-Terminal und stellen Sie die passenden Parameter ein. Die Übertragungsrate beträgt 9600 Baud. Beim Starten des Terminals schickt Bascom einen Reset-Impuls über die DTR-Leitung. Das bereits geladene Programm startet daher neu.
 
 

 
Abb. 4.2: Ausgaben im Bascom-Terminal


4.2 Text- und Byte-Ausgabe
 
Über die serielle Schnittstelle werden Bytes gesendet. Je nach Interpretation kann ein einzelnes Byte als Zahl aufgefasst werden oder als Textzeichen nach der ASCII-Tabelle. Abb. 4.3 zeigt den Aufbau eines Bytes 85 mit Startbit und Stoppbit, wie es an einer echten RS232-Schnittstelle auftritt. Das serielle Signal am Ausgang B1 ist dagegen invertiert, d.h. der Ruhezustand ist high und der aktive Zustand ist low. Bei einer Übertragungsrate von 9600 Baud werden 9600 Bits pro Sekunde gesendet. Jedes Bit braucht 1000 ms / 9600 = 0,104 ms. Ein ganzes Byte benötigt 1,04 ms, weil zusätzlich zu den acht Datenbits das Startbit und das Stoppbit gesendet werden. Man kann also etwa bis zu 1000 Zeichen pro Sekunde übertragen.
 

Abb. 4.3: Serielle Datenübertragung von acht Bits  ((RS232.jpg))
 
Das Programm Print2.bas demonstriert die Ausgabe eines Text-Strings in Anführungszeichen und eines Zahlenwerts in der Variablen N. Ein Semikolon am Ende der Print-Ausgabe unterdrückt die beiden Zeichen LF (Line Feed, Neue Zeile, ASCII 13) und CR (Carriage Return, Wagenrücklauf, ASCII 10), sodass die folgende Print-Ausgabe in der gleichen Zeile erscheint.
 
 
'Print2.bas
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
 
Dim N As Byte
Open "comb.1:9600,8,n,1" For Output As #1
 
For N = 1 To 10
  Print #1 , "ATtiny85 ";
  Print #1 , N
Next N
 
For N = 48 To 90
  Print #1 , Chr(n);
Next N
 
Print #1 , " "
 
For N = 48 To 90
  Put #1 , N
Next N
 
End
 
Listing 4.2: Text, zahlen und ASCII-Zeichen
 
In einer zweiten und dritten Schleife werden die ASCII-Zeichen für die Zeichen „0“ bis „Z“ erzeugt. Dazu gibt es zwei Möglichkeiten. Chr(n) steht für ein Text-Zeichen mit dem ASCII-Wert n. Mit Put #1, N sendet man direkt das Byte N, das dann im Terminal als Textzeichen dargestellt wird. Im Terminal sieht man, dass beide Befehle zum selben Ergebnis führen.
 
 

 
Abb. 4.4: Ausgabe im Bascom-Terminal
 
Eine alternative Darstellung bietet das Terminal in LPmikro85.exe. Hier sieht man auch die Byte-Darstellung. Die Steuerzeichen 13 10 an einem Zeilenende bleiben in der Textdarstellung unsichtbar und steuern nur das Verhalten des Terminals. In der Byte-Darstellung werden sie sichtbar.
 

 
Abb. 4.5: Das Terminal in PLmikro85.exe
 
4.3 Daten empfangen
 
Der serielle Sendekanal an B1 wurde bisher schon genutzt. Nun kommt ein Empfangskanal an B2 hinzu. Die Portleitung B2 wird dabei zur Empfangsleitung RXD, die Daten von der Sendeleitung TXD des USB-Wandlers empfängt. Die Schnittstelle bekommt die Nummer  #2. Mit Input #2, Dat wird eine serielle Eingabe aus dem Terminal in die Variable Dat eingelesen.
 
 
'Input1.bas   Zahleneingabe
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
 
Dim Dat As Byte
 
Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.2:9600,8,n,1" For Input As #2
 
 
Config Portb.3 = Output
Do
  Input #2 , Dat
  Print #1 , Dat
  If Dat = 1 Then Portb.3 = 1
  If Dat = 0 Then Portb.3 = 0
Loop
 
End
 
Listing 4.3: Daten-Eingabe mit Input
 
Das Programm erwartet Zahleneingaben, die mit Enter abgeschlossen werden. Weil Dat als Byte-Variable deklariert wurde, können Zahlen bis maximal 255 eingegeben werden. Jede Eingabe wird mit Print zurückgesendet. Mit dem Bascom-Terminal tippt man die Ziffern ein und drückt dann Enter. Erst dann erscheint die Eingabe am Bildschirm. Falls man eine zu große Zahl eingibt, wird das Low-Byte ausgewertet. Die Eingabe 300 führt auf diese Weise zum Wert 44, denn 256 + 44 = 300.
 
In einer einfachen Interpreterschleife werden die Eingaben ausgewertet. Eine Eins schaltet die LED an B3 ein, eine Null schaltet sie aus. Alle anderen Eingaben bleiben ohne Wirkung.
 
 

 
Abb. 4.6: Zahleneingaben 1 und 0
 
 
4.5 Texteingabe
 
Mit Input kann auch ein ganzer Text empfangen werden. Die Variable Eingabe wird dazu als String mit einer maximalen Länge von 20 Zeichen deklariert. So kann man ein einfaches Code-Schloss realisieren. Der Benutzer muss ein geheimes Passwort eingeben, nur dann wird der Ausgang B3 eingeschaltet, über den dann ein elektromechanischer Öffner betätigt wird.  
 
'Input2.bas  Texteingabe
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
 
Dim Eingabe As String * 20
 
Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.2:9600,8,n,1" For Input As #2
 
 
Config Portb.3 = Output
Do
  Print #1 , "Eingabe: ";
  Input #2 , Eingabe
  Print #1 , Eingabe
  If Eingabe = "ATtiny85" Then Portb.3 = 1
Loop
 
 
Listing 4.4: Texteingabe und Vergleich
 
Das Passwort lautet in diesem Fall „ATtiny85“ und sollte natürlich bei einem ernsthaften Einsatz ersetzt werden. Im Terminal erscheint zuerst eine Eingabeaufforderung. Das eingegebene Passwort wird dann wieder zurück gesendet. Nur bei einer korrekten Eingabe mit der gleichen Groß/Kleinschreibung wird der Ausgang eingeschaltet.
 

 
Abb. 4.7: Eingabeversuche 
 
 
 
 
4.5 Byte-Empfang
 
Steuerkommandos über die serielle Schnittstelle können als Text oder als Bytes festgelegt sein. Wenn z.B. ein Kommando 100 lauten soll, wären als Text drei Ziffern und zwei Steuerzeichen (CR und LF) zu übertragen. Legt man das Byte-Format fest, ist nur ein einzelnes Zeichen nötig. Einzelbytes lassen sich mit Get empfangen und mit Put senden. Das Beispielprogramm sendet jedes empfangene Zeichen zurück.
 
Nur die Bytes 51 und 52 werden ausgewertet und führen dazu, dass die Ports B3 und B4 umgeschaltet werden. Das entspricht den ASCII-Codes der Ziffern 3 und 4. Man braucht also nur noch einen Tastendruck auf die 3, um den Port B3 umzuschalten. Ein Dauerdruck auf die Taste 3 führt zu einem schnellen Flackern. Das gleiche gilt entsprechend für die Taste 4 und den Port B4.
 
'Input3.bas  Byte-Eingabe
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
 
Dim Dat As Byte
 
Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.2:9600,8,n,1" For Input As #2
 
Config Portb.3 = Output
Config Portb.4 = Output
Do
  Get #2 , Dat
  Put #1 , Dat
  If Dat = 51 Then Toggle Portb.3
  If Dat = 52 Then Toggle Portb.4
Loop
 
End
 
Listing 4.5: Byte-Empfang und -Auswertung
 
 

 
Abb. 4.8 Steuerung über Einzeltasten  

 



Elektronik-Labor  Lernpakete  AVR  LPmikros