Armins AVR-Buch - Daten_zum_PC_senden_und_empfangen

⇑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:

Bild Max232.jpg

Man kann ihn auch fertig bei Pollin oder Ebay kaufen.

Bild pollinrs232.jpg

⇑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



Man muß dies Bascom in den Einstellungen mitteilen.

Bild RS232D.jpg

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


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



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)