Daten_zum_PC_senden_und_empfangen
(armin77, 01.02.2013, 19:43:53)
Habe in anderen Beiträgen geschrieben, wie man Daten zum PC sendet oder empfängt.
Fasse dies hier alles zusammen.
Wenn man Daten/Meßwerte zum PC senden oder empfangen will braucht man einen Pegelwandler,
da die Spannungpegel zwischen RS232 und AVR unterschiedlich sind.
Der MAX232 ist so einer:
Man kann ihn auch fertig bei Pollin oder Ebay kaufen.
Senden von Daten an den PC
Zusätzlich zu dem bekannten Programmkopf kommt die Angabe für die gewünschte Übertragungsgeschwindigkeit.
Man gibt sie in Bit/Sekunde oder Baud an. 2400 Baud bedeutet, dass 2400 Bit/Sekunden über die Leitung übertragen werden.
$baud=2400
Achtung:
Durch den $baud Befehl wird nicht nur die UART konfiguriert.
Es werden außerdem auch gleich die endsprechenden RXD / TXD-Pins konfiguriert!
Das bedeutet:
Pin 2 wird als Eingang und Pin 3 als Ausgang gesetzt und die Digitalports PD0 und PD1 sind damit nicht mehr verfügbar.
Komplett sieht das so aus:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Man muß dies Bascom in den Einstellungen mitteilen.
Die Baudrate (oberer Pfeil) sollte sich aus der AVR Taktfrequenz durch einfaches Teilen ermitteln lassen und wenn das nicht
möglich ist, höchstens 2% (siehe unterer Pfeil) von dieser abweichen.
Mit Print kann man dann eine Zeichenfolge/Text über die Uart senden
Print "Hallo Welt"
Print Variable
Print "Der Text ist" ; Variable
An diese Zeichenfolge werden von Bascom die unsichtbaren Zeichen CARRIAGE RETURN (CR) und LINEFEED (LF) angehängt.
Will man das nicht muß man den Print Befehl mit einem Strichpunkt ; beenden.
Hiermit wird ein Ausgangsbuffer eingerichtet
CONFIG SERIALOUT= BUFFERED
Der Buffer kann bis zu 255 Zeichen groß sein.
Size=255
Damit kann man einen Buffer für den Versand von Daten über die UART einrichten.
Ohne Puffer bleibt das Programm so lange stehen bis alle Daten verschickt wurden.
Um das Programm schneller fortsetzen zu können, kann man einen Buffer einrichten.
Die Daten werden mit PRINT in den Buffer geschoben und übertragen.
Der Puffer muß allerdings groß genug sein um die Daten aufzunehmen.
Empfangen von Daten
Mit dem Befehl INPUT liest man eine Zeichenfolge von der UART ein und schreibt sie in eine Variable.
INPUT wartet so lange auf die Zeichenfolge bis CARRIAGE RETURN gesendet wird.
Das bedeutet, das so lange das Hauptprogramm blockiert ist.
Das Programm bleibt also stehen, bis CR über die UART rein kommt.
Beispiel:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Empfangen As String * 20
Do
Input Empfangen
Print Empfangen
Loop
End
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Empfangen As String * 20
Do
Input Empfangen
Print Empfangen
Loop
End
Sollen noch andere Aufgaben im Hauptprogramm erledigt werden richtet man sich einen Empfangspuffer ein.
CONFIG SERIALIN = Buffered
Dann gibt man die Größe des Buffer an:
Size = 200
Der Buffer kann bis zu 255 Zeichen groß sein.
Bytematch = 13
Mit diesem Parameter gibt man an, ob und wann ein Unterprozedur aufgerufen werden soll.
Gibt man ein Zeichen z.b. a oder eine Zahl (z.B. 13) an, dann wird die Sub mit dem Namen "Serial0CharMatch" ausgeführt, wenn das Zeichen empfangen wurde.
Die Zahl 13 steht für CARRIAGE RETURN und die Zahl 10 steht für LINEFEED.
Gibt man ALL an, dann wird die Sub mit dem Namen "Serial0ByteReceived" ausgeführt sobald ein Zeichen empfangen wird.
ECHO
Die Einstellung ECHO ON gibt an, dass vom Befehl INPUT sofort nach dem Empfang eines Zeichens, dieses Zeichen zurück geschickt wird.
Die Einstellung ECHO OFF gibt an, dass nichts zurück geschickt werden soll.
Hier ein Beispiel.
Wird ein Text mit CARRIAGE RETURN am Ende empfangen, wird die Sub Serial0CharMatch aufgerufen.
Der Text wird eingelesen.
Im Hauptprogramm wird geprüft, ob etwas empfangen wurde.
Wenn ja wird es zurück gesendet.
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Declare Sub Serial0charmatch()
Config Serialin = Buffered , Size = 40 , Bytematch = 13
Enable Interrupts
Dim Empfangen As String * 20
Do
If Empfangen <> "" Then Print Empfangen
Loop
End
Sub Serial0charmatch()
Input Empfangen Noecho
End Sub
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Declare Sub Serial0charmatch()
Config Serialin = Buffered , Size = 40 , Bytematch = 13
Enable Interrupts
Dim Empfangen As String * 20
Do
If Empfangen <> "" Then Print Empfangen
Loop
End
Sub Serial0charmatch()
Input Empfangen Noecho
End Sub
Befehl Waitkey
Dieser Befehl wartet auf ein Zeichen der seriellen Schnittstelle (Zahl oder Textzeichen)
Syntax:
Variable = Waitkey()
Oder bei Verwendung einer Software-Uart:
Variable = Waitkey(#1)
Befehl Inkey
Dieser Befehl liest ein Zeichen von der seriellen Schnittstelle (Zahl oder Textzeichen)
Im Gegensatz zu Waitkey wird nicht gewartet.
Syntax:
Variable = Inkey()
Oder bei Verwendung einer Software-Uart
Variable=Inkey(#1)