serielle
Kommunikation mit dem Atmega8
Teil III
Kommen wir hier nun zum 3. und letzten Teil der Erklärung für die serielle Kommunikation mit einem PC.
Wir haben jetzt kennen gelernt wie man Daten und Texte an den PC senden kann und wie man Daten von
einem PC wieder empfangen kann.
Der Empfang von Texten mittels den Befehlen : Inkey() und waitkey() ist natürlich unter Umständen ein
wenig müßig.
Es geht auch einfacher .
Jedoch , einfacher heißt nicht gleich leichter. 
Der Atmega hat sowohl einen seriellen Eingangsspeicher , als auch einen seriellen Ausgnagsspeicher.
Dieser nennt sich : Serialin
Diesen Speicher kann man in seiner Empfangsgröße anpassen.
Zudem gibt es noch einen Parameter : Bytematch , mit dem man sagen kann , das der Eingangsspeicher
erst einmal alles sammeln soll was an seriellen Daten ankommt bis ein Zeichen eingegangen ist , das das
Gleiche ist , wie bei Bytematch hinterlegt - also quasi eine Abschlusskennung.
Das besondere an diesem Eingangsspeicher ist, das er autark arbeitet , also völlig unabhängig vom eigentlichen
Programmcode.
Das heißt aber auch wiederrum , wenn man sich nicht selber darum kümmert, ab und an mal in den Empfangsspeicher
nachzuschauen , wird dieser natürlich mit neuen Daten
überschrieben , sobald die am Anfang definierte
Speichergröße
überschritten wird !
Zu diesem Befehl : SerialIn gehört auch noch eine Subroutine : Serial0charmatch()
Die Daten die man nun in dem seriellen Speicher bekommt sind String-Daten.
In der Subroutine Serialcharmatch() übergibt man nun den eingegangenen Inhalt einer String-Variablen.
Beispiel :
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600
Config Serialin = Buffered , Size = 30 , Bytematch = 13
Dim Eingangstext as String * 30
Declare Sub Serialcharmatch()
Enable Interrupts
' Hauptschleife
Do
' hier würde der eigentliche Code dann stehen
Loop
end
Sub Serial0charmatch()
Input Eingangstext Noecho
end sub
Also , zuerst haben wir den Eingangsspeicher konfiguriert und gesagt es sollen die Daten
alle gesammelt / gespeichert werden ( config Serialin = buffered ).
Die Größe des Speicher haben wir durch Size = 30 mit 30 Bytes festgelegt.
Als Kennung für das Ende eines Strings haben wir die Zahl : 13 ( Bytematch = 13 ) genommen.
Da wir ja einen String im Speicher erhalten und diesen einer Variablen übergeben müssen ,
dimensionieren wir uns als nächstes einen String mit Namen: Eingangstext und einer Länge
von 30 Byte , gleich der Länge des Eingangsspeichers.
Wie anfangs ja erwähnt , gehört zum Befehl : Serialin auch noch eine Subroutine.
Subroutine müssen auch am Anfang dimensioniert bzw. angemeldet werden.
Das macht man mit : Declare Sub Serialcharmatch()
Da der Befehl serialin autark im Hintergrund läuft , nennt man soetwas auch Interrupt.
Es gibt verschiedene Befehle und Funktionen beim Atmega8 die autark im Hintergrund laufen
können .
Glücklicherweise muß man jetzt nicht für jeden möglichen Befehl oder jeder möglichen Funktion
die es gibt einen speziellen Interrupt aktivieren , sondern es reicht hier pauschal zu sagen :
Enable Interrupt
Da schaut der Atmega8 dann selber nach , welcher der vielen möglichen Funktionen damit gemeint ist.
Der eigentliche Programmablauf kann jetzt in einer DO LOOP oder auch MAIN Schleife ablaufen.
Dieser Programmteil hat dann nichts mit dem eigentlichen Empfang an seriellen Daten zu tun.
Jetzt fehlt nur noch , das man die Subroutine anlegt : Sub Serialcharmatch()
und in der Subroutine den Eingangsspeicher unserer String-Variablen : Eingangstext übergibt.
Input Eingangstext Noecho
Wann jetzt die String-Variable mit Daten vom Eingansgbuffer gefüllt wird , übernimmt der Atmega
selbstständig.
Darum sollte man im eigentlichen Code sehen , das man ab und an nachfragt ob denn der String :
Eingangstext schon einen Inhalt hat um entsprechend zu reagieren .
Beispiel :
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
$baud = 9600
Config Serialin = Buffered , Size = 30 , Bytematch = 13
Dim Eingangstext as String * 30
Declare Sub Serialcharmatch()
Enable Interrupts
' Hauptschleife
Do
If Eingangstext <> "" then
' Ausgang schalten ....
' LED aktivieren ....
' auswerten ....
Eingansgtext = ""
endif
Loop
end
Sub Serial0charmatch()
Input Eingangstext Noecho
end sub
Hier habe ich eine IF-Abfrage innerhalb der DO LOOP gesetzt , die nachschaut ob sich ein Inhalt bereits
in der String-Variabel : Eingansgtext befindet : If Eingansgtext < > ""
[ Ist der Inhalt von Eingansgtext kleiner oder größer als nichts ? ]
Wenn ein Inhalt vorhanden ist , kann dieser Ausgewertet und entsprechende Aktionen gestartet werden.
Wichtig ist , wenn man den Eingansgtext ausgewertet hat , diesen am Ende wieder zu leeren mit : Eingangstext = ""
Sonst passiert es , das man das auswertet , was man eigentlich schon ausgewertet hat .