ohhm das was ich verwende nennt sich eSLIP und war irgendwie mal der vorgänger von tcp/ip oder sowas (würde mir sowas nie selbst ausdenken, zuwenig drin in der birne)
Druckbare Version
ohhm das was ich verwende nennt sich eSLIP und war irgendwie mal der vorgänger von tcp/ip oder sowas (würde mir sowas nie selbst ausdenken, zuwenig drin in der birne)
*hehe* :mrgreen: diese Sachen kann keiner erfinden.Zitat:
..zuwenig drin in der birne..
Die gibt's alle schon, da sind wir noch am Schnuller gehangen
Das besagte Netzwerkprojekt kann man sich hier etwas näher ansehen.
http://www.marvins-lab.roboterbastler.de
Hier entsteht eine Dokumentation die aber jetzt bereits einiges erhellendes zu bieten hat.
Netter Gruß
Ps. Sorry, bisschen Schleichwerbung muss schon sein :-)
Hallo,Zitat:
Zitat von Foooob
mit nachfolgendem Code wartet der AVR zunaechst auf ein bestimmtes Zeichen oder eine Zeichenfolge. In meinem Beispiel horcht der AVR auf ein "a".
Anschliessend liest der AVR die naechsten anstehenden Zeichen ein und speichert diese in die Stringvariable "zeichen".
Das ganze ist eine Endlosschleife. Mit diesem Programmschnipsel habe ich erfolgreich in einem anderen Projekt die Daten einer GPS-Mouse (Koordinaten, Geschwindigkeit usw. ) eingelesen.
Der Code basiert auf einem Beispiel aus dem Buch von Claus Kuehnel "Programmieren der AVR-Risc...") - na, kennt hier ja jeder...
Code:$lib "glcdKS108.lib"
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 20
$framesize = 40
$baud = 4800
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portb , Ce = 1 , Ce2 = 0 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
Config Serialin = Buffered , Size = 10
Declare Function Read_string(byval T As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Enable Interrupts
Dim Zeichen As String * 6
Setfont 6x8font
Cls
Lcdat 1 , 1 , "wait_for_string"
Do
Print "test"
Call Wait_for_string( "a")
'Zeichen = Read_string(8)
Print "Alles wird gut"
Lcdat 3 , 1 , "Zeichen a empfangen"
waitms 500
Loop
End
Sub Wait_for_string(byval S As String) As String
Local Ii As Byte
Local Cc As Byte
Ii = 1
M1:
Cc = Waitkey()
If Cc <> Mid(s , Ii , 1) Then
Goto M1
Else
Incr Ii
If Ii > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval T As Byte) As String
Local Cc As Byte
Local Ss As String * 10
Ss = ""
Do
Cc = Waitkey()
Ss = Ss + Chr(cc)
Loop Until Cc = ","
Read_string = Left(ss , T)
End Function
$include "6x8font.font"
Screenshot: http://www.elektronik-web.de/atmel/r...tforstring.gif
Drahtigel: http://www.elektronik-web.de/atmel/roboternetz/wfs.jpg
Vielleicht hilft es ja etwas weiter...
Mit freundlichen Gruessen
Digitali
Danke für die Hilfe!
Ich bin gerade dabei einen Code zu schreiben. Mir kamen auch einige gute Ideen dazu.
Habe noch eine kurze (recht primitive Frage)
Gibts in BASCOM kein Ungleich??
Ich würd gern ´ne While-Schleife machen bei der geprüft werden soll ob Udr ungleich "Y" ist, also sowas hier
Aber weder ! noch not oder != funktionieren.Code:While Udr ! "Y"
....
Wend
Kennt sowas BASCOM nicht? Kann doch nicht sein oder??
In der Bascom-Hilfe unter Stichwort "Language Fundamentals" gefunden:
----schnipp----
Relational Operators
= Equality X = Y
<> Inequality X <> Y
< Less than X < Y
> Greater than X > Y
<= Less than or equal to X <= Y
>= Greater than or equal to X >= Y
----schnapp----
@ digitali
Vielen Dank für die Hilfe!
Deinen Code weiter oben habe ich mal analysiert und versucht nachzuvollziehen. Man! Der verwendet Schlüsselwörter die ich noch gar nicht kannte aber die einem das Leben echt vereinfachen ;-)
Ich habe aber noch einige Fragen zu denen ich unter anderem auch in der Bascom-Hilfe und im Datasheet nix fand.
1. Config Serialin = Buffered , Size = 10
Ich schätze mal hier setzt du den Eingangspuffer für die RS-232 auf 10 Bytes. Ich dachte der ist bei jedem Mega fest eingestellt und kann nicht verändert werden? Oder etwa doch?
2. Zeichen = Read_string(8)
Darfste ja eigentlich nicht auskommentieren. Aber ganz eine andere Frage: Was bewirkt diese Zeile? Sie ruft die Funktion read_string auf und übergibt ihr den Parameter für die Länge des Strings (hier 8), richtig?
Und die Zeile: Read_string = Left(ss , T) ist dann der Rückgabewert der Funktion read_string als String? Und dieser Rückgabewert ist dann gleich dem String Zeichen??
Wieso ist dann aber Zeichen 6 Stellen lang? Müsste es nicht 8 sein? Da wir ja den String Ss bis zum 8. Zeichen von links "ausschneiden".
3. Du schreibst Cc = ","
Das heist das Komma ist das Endezeichen? Hier verwendest du aber im Gegensatz zu der Zeile weiter oben nicht das Chr(), also Chr(Cc) = "," Wenn ich auf ein Endezeichen im ASCI-Standard warte könnte/sollte/müsste ich dann Chr(Cc) = "," schreiben?
Man, ich hätte glaub echt gleich von Anfang an die Dinger mit C programmieren sollen. Ich tu mir teilweise immer noch sehr schwer mit BASIC weil ich sonst immer nur mit C und C++ zu tun hab.
EDIT: Ich habe das Programm auf mein Board angepasst aber noch nicht getestet, da ich erst den Code verstehen will.
Also in der Basom-Hilfe Stichwort "config serialin" steht nichts von einem fest eingestellten Wert. Im Original-Programm stand der Wert auf 100.Zitat:
Zitat von Foooob
Ich hatte es auskommentiert, weil ich keine weiteren Zeichen nach dem Empfang von "a" eingelesen hatte. Wollte nur ad hoc zeigen, dass zumindest das wait_for_string so schon mal funktioniert.Zitat:
Zitat von Foooob
Die Funktion read_string habe ich so aus dem Beispiel uebernommen und deren Werte auf die Schnelle nicht weiter angepasst. Sie liest dann die nachfolgenden 8 Werte ein und uebergibt diese der Stringvariable (die ich haette mit der Laenge 8 deklarieren muessen) "Zeichen".
Das Beispiel stammt, wie gesagt, aus einem Programm welches den Datenstrom einer GPS-Mouse einliest. Die einzelnen Werte innerhalb eines Datensatzes werden immer mit einem "," getrennt.Zitat:
Zitat von Foooob
Beispiel:
$GPRMC,213926.206,V,0000.0000,N,00000.0000,E,,,140 606,,*18
Mit freundlichen Gruessen
Digitali
Ich habe es gerade ausprobiert! Es funktioniert super!!
Ich habs eben auch mit großen Datenmengen probiert. Bei ´nem Puffer von 10 Bytes hat er hin und wieder noch einen Fehler reingehaun. Jetzt hab ich den Puffer auf 100 gesetzt und die Sache klappt 1A, er verschluckt auch nichts mehr.
Vielen Dank für den Code und die Erklärung zu meinen Fragen!
Jetzt muss ich doch nochmal auf was zurückkommen...
Ich würde das ganze gern als Interrupt ausführen, aber das funktioniert nicht, nur frage ich mich wieso....
Wenn ich den Code nun so schreibe:
Dann funktioniert das Auslesen der RS-232 problemlos, allerdings wartet mein Programm dann logischerweise immer an der Stelle Call Wait_for_string( "y") bis ein String reingeflattert kommt. Erst dann würde er das "Hallo" anzeigen.Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Call Wait_for_string( "y")
Zeichen = Read_string(6)
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
End
Das will ich jedoch nicht und so habe ich mir gedacht das einfach in einen Interrupt zu legen, der dann so ausschaut:
Nun zeigt mein AVR das "Hallo" an, allerdings wertet er keine Zeichenkette von der UART aus....nur wieso??? Denn das interessante kommt jetzt, wenn ich die Zeile Zeichen = Read_string(6) (und nur diese) wieder oben in Do...Loop reinhaue sieht man wieder dass er auf das Interrupt (korrekt) reagiert.Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
On Urxc
Enable Urxc
Enable Interrupts
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
Onrxd:
Call Wait_for_string( "y")
Zeichen = Read_string(6)
Return
End
Nun nimmt er Strings von der RS-232 entgegen und gibt diese auch (fast) korrekt aus, allein das Startzeichen ("y") lässt er noch stehen aber das wäre ja nicht so wild. Nur dumm dass er jetzt erst wieder auf einen Rückgabewert der Funktion Read_string wartet und vorher nichts anderes macht.Code:
$regfile = "m128def.dat" 'ATmega128
$crystal = 11059200 'Quarz: 11059200 Hz
$hwstack = 32 'Hardware Stack
$swstack = 32 'Software Stack
$framesize = 32 'Framesize
$baud = 9600
Config Serialin = Buffered , Size = 100
Declare Function Read_string(byval Stringlaenge As Byte) As String
Declare Sub Wait_for_string(byval S As String)
Dim Zeichen As String * 8
On Urxc
Enable Urxc
Enable Interrupts
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
Config Lcdbus = 4
Waitms 100
Initlcd
Cursor Off
Do
Zeichen = Read_string(6)
Locate 2 , 1
Lcd Zeichen
Locate 3 , 10
Lcd "Hallo"
Loop
'***BEGIN***********AUSLESEN DER RS-232********************
Sub Wait_for_string(byval S As String) As String
Local Startpunkt As Byte
Local Empfangen As Byte
Startpunkt = 1
M1:
Empfangen = Waitkey()
If Empfangen <> Mid(s , Startpunkt , 1) Then
Goto M1
Else
Incr Startpunkt
If Startpunkt > Len(s) Then Goto M2
Goto M1
End If
M2:
End Sub
Function Read_string(byval Stringlaenge As Byte) As String
Local Empfangen As Byte
Local Ss As String * 10
Ss = ""
Do
Empfangen = Waitkey()
Ss = Ss + Chr(empfangen)
Loop Until Empfangen = ","
Read_string = Left(ss , Stringlaenge)
End Function
'***ENDE***********AUSLESEN DER RS-232********************
Onrxd:
Call Wait_for_string( "y")
Return
End
Aber mein Verstand steigt schon beim 2. Codebeispiel aus. Wieso führt der AVR beim Interrupt das nicht wie gewüscht aus? Ich habe doch die 2 auszuführenden Anweisungen lediglich vom Hauptprogramm ins Interrupt gelegt??