serielle Kommunikation mit dem Atmega8

Teil II




In Teil I haben wir ja jetzt kennen gelernt , wie man Texte oder Zahlen seriell an den PC senden kann.
Jetzt möchte man natürlich auch gern mal Daten vom PC erhalten und auswerten.

Dazu gibt es 3 Möglichkeiten.
Hier werde ich euch 2 dieser 3 Möglichkeiten einmal näher erklären.
Die 3. Möglichkeit gibt es dann im Teil III.


Nehmen wir mal als erstes den Befehl : INKEY ( )


Inkey( ) hat den Vorteil , das wenn man diesen Befehl zum Beispiel in einer Schleife benutzt ,
diese dadurch nicht blockiert wird .



Beispiel :

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600

Dim A as byte

Do

    A = Inkey()
    If A > 0 then exit do

loop



In diesem Beispielcode wird also die DO LOOP Schleife endlos durchlaufen und darauf gewartet
das seriell eine Zahl ankommt die größer ist als Null.
Sobald Inkey() eine Zahl größer Null erkannt und an der Variablen 'A' übergeben hat , wird die
Schleife mit dem Befehl : exit do  verlassen.

Warum sitzt hinter Inkey() immer eine Klammer ?

Der Atmega8 hat zur seriellen Kommunikation die beiden Pins D.0 + D.1
Man kann aber dennoch , auch bei anderen Atmel-Typen , noch weitere "Software" COM-Ports
aktivieren.
So das man mit mehreren COM-Ports arbeiten kann.
Da der Atmega dann wissen muß , mit welchem der COM-Ports gerade gearbeitet wird, wird dies
durch die Klammern mitgeteilt.
Bei der Nutzung der regulären Pins ( D.0 + D.1 ) läßt man die Klammer leer.
Dennoch darf sie nicht fehlen.


Die 2. Möglichkeit Daten empfangen zu können , wäre mit dem Befehl : waitkey()

Waitkey() hat sowohl einen Vor-, als auch einen Nachteil.
Waitkey() läßt den Code bzw. den ganzen Atmega an dieser Stelle stehen !

Beispiel :

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600

Dim A as byte

Do

    A = Waitkey()
    If A > 0 then exit do

loop


In diesem Beispielcode wird die DO LOOP  Schleife quasi an der Stelle Waitkey() angehalten und
darauf gewartet das ein Zeichen vom PC gesendet wird.
Das kann natürlich in manchen Situation sehr unpraktisch sein.

Jetzt kann man aber diesen Umstand des Blockierens umgehen und dennoch waitkey() nutzen.
Dafür gibt es den Befehl : Ischarwaiting()

Ischarwaiting() kann man übersetzen mit : Ist ein Zeichen anliegend das wartet abgeholt zu werden ?


Beispiel :

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600

Dim A as byte

Do

    IF Ischarwaiting()= 1 then
       A = Waitkey()
       If A > 0 then exit do
    endif

loop


In diesem Beispielcode wird die DO LOOP  Schleife endlos durchlaufen , während parallel nachgeguckt wird
ob am seriellen Eingang ein Zeichen anliegt.
Ist ein Zeichen anliegend würde die IF-Anweisung zutreffen und es wird mittels waitkey() dieses Zeichen ausgelesen.
Danach kommt wieder die Auswertung ob das Zeichen größer Null - wenn ja , Schleife verlassen.

Jetzt muß man ein wenig Abwägen , welche der beiden Möglichkeiten gerade die bessere Wahl ist.

Bei Inkey() hat man den Vorteil , das dadurch der Programmablauf nicht blockiert wird ..... ABER  ..... Nachteil ,
wenn nach der Inkey() Abfrage viele Anweisungen und /oder Programmcode folgt bevor wieder mit Inkey() abgefragt
wird ob ein Zeichen anliegt , könnte es passieren das mal ein Zeichen "verloren" geht , weil der Folgecode einfach
zeitlich zu lang war.

Bei waitkey() ist der Nachteil das dieser Befehl den Programablauf blockieren würde.
Je nach Projekt aber auch ein Vorteil , das wenn man unbedingt warten will , man keine Pause programieren muß ,
denn es geht eh erst weiter wenn ein Zeichen anliegt.
Möchte man aber nicht warten aber dennoch nicht Gefahr laufen evtl. ein Zeichen zu verlieren , kann man eben den
Befehl : Ischarwaiting() nutzen und danach mit waitkey() das Zeichen abholen.


Ganz gleich welche Möglichkeit man am Ende ausgewählt hat , es wird mit diesen Funktionen immer nur EIN ZEICHEN
ausgewertet !
Wenn vom PC also ein ganzer Text erwartet wird, muß der jeweilige Befehl , ob Inkey()  oder waitkey() so oft wiederholt
werden wie die Gesamtanzahl an Zeichen des zu erwartenden Textes sind.
Verständlich das also diese Befehle mehr für den Austausch von Zahlen , als ein Austausch von Texten gedacht ist -
aber dennoch möglich.


zurück zur Beispiel-Übersicht