Hallo!
In diesem Beitrag möchte ich mit der Datenübertragung vom Computer zum µC weiter machen. Diesmal möchte ich näher auf den Befehl CONFIG SERIALIN eingehen. Mit CONFIG SERIALIN kann man sich die Arbeit mit der UART ein wenig bequemer machen. Anstatt ständig nachzufragen ob irgendetwas über die UART angekommen ist, kann man den Text von CONFIG SERIALIN buffern lassen. Weiters kann man sich benachrichtigen lassen, wenn z.B. ein CARRIAGE RETURN oder ein LINEFEED über die UART rein gekommen ist.
So hat man während der gesamten Kommunikation nichts zu tun. Die Daten werden im Hintergrund empfangen. Und sobald die Daten vollständig im Buffer sind, wird eine vorgegebene Prozedur ausgeführt in der man auf die empfangenen Daten reagieren kann. Das ist, in meinen Augen, eine ziemlich feine Sache. Auch wenn man diese Möglichkeit nicht direkt nutzt, so ist ein Buffer trotzdem etwas Feines. Denn so kann man sicherstellen, dass man keine Daten übersieht, auch wenn man den Empfang von Daten nicht ständig kontrollieren kann.
Stellt die Hardware-UART so ein, dass ein Buffer für den Empfang verwendet wird.
Mit dem SIZE-Parameter wird die Größe des Buffers eingestellt. Der Buffer kann bis zu 255 Zeichen groß sein.
Mit diesem Parameter kann man einstellen ob und wann ein Label oder eine Unterprozedur angesprungen werden soll. Gibt man ALL an, dann wird das Label oder die Unterprozedur mit dem Namen "Serial0ByteReceived" ausgeführt sobald ein Zeichen empfangen wurde. Gibt man einen einstelligen Text (z.B. "a") oder eine Zahl (z.B. 13) an, dann wird das Label oder die Unterprozedur mit dem Namen "Serial0CharMatch" ausgeführt sobald dieser Text oder das Zeichen mit der angegebenen ASCII-Nummer empfangen wurde. Die Zahl 13 steht für CARRIAGE RETURN und die Zahl 10 steht für LINEFEED. Da der Befehl INPUT normalerweise auf CARRIAGE RETURN (13) reagiert, empfiehlt es sich auch bei CONFIG SERIALIN auf dieses unsichtbare Zeichen zu reagieren. Hier ein kleines Beispiel:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 38400
Declare Sub Serial0charmatch()
Config Serialin = Buffered , Size = 30 , Bytematch = 13
Enable Interrupts
'Hauptschleife
Do
!NOP
Loop
End
Sub Serial0charmatch()
Local Incoming_data As String * 30
'Daten vom Buffer auslesen
Input Incoming_data Noecho
'Ausgelesene Daten zurück schicken
Print Incoming_data
End Sub
In diesem Beispiel wird immer dann, wenn ein CARRIAGE RETURN empfangen wird, die Unterprozedur "Serial0charmatch" ausgeführt. In dieser Unterprozedur wird mit dem Befehl INPUT der neue Bufferinhalt in die lokale Variable "Incoming_data" übertragen. NOECHO kümmert sich darum, dass dabei kein Echo zurück gegeben wird. Da Bascom zum Buffern im Hintergrund Interrupts braucht, muss man diese mit ENABLE INTERRUPTS aktivieren. In der Hauptschleife wird nichts gemacht. Das wird mit dem Assembler-Befehl NOP symbolisiert. NOP steht für "No Operation" und erledigt einen Takt lang "nichts". ;-) Das Rufezeichen kennzeichnet einen eingebundenen Assembler-Befehl.
Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?config_serialin.htm
Damit kann man einen Buffer für den Versand von Daten über die UART einrichten. Wenn man Daten ohne Buffer über die UART schickt, dann bleibt das Programm so lange stehen bis alle Daten verschickt wurden. Im Gegensatz zum µC selber, ist so ein Versand sehr, sehr langsam. Um das Programm schneller fortsetzen zu können, kann man einen Buffer einrichten. Die Daten werden mit PRINT in den Buffer geschrieben. Und falls der Buffer groß genug für die neuen Daten ist, läuft das Programm weiter. Die Daten werden im Hintergrund über die UART verschickt.
Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?config_serialout.htm
mfg Gerold :-)
Den zugehörigen Original-Beitrag findest du im Loetstelle-Forum.
Ich programmiere Progressive Web Applications, Mobile Apps, Desktop-Programme und noch vieles mehr. Falls es dich interessiert, findest du mehr Informationen darüber auf meiner Business-Website.