Lernpaket Mikrocontroller Kap 4
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