Im Master fehlt hinter A das on.
Hi Leuts,
ich hock grad vor einem, wahrscheinlich simplen Problem:
Ich versuch gerade mehrere Atmega8 zu verbinden, und zwar via UART.
Erstmal will ich es mit 2 Schaffen, danach mit mehreren. Ich verbinde also RxD un TxD jeweils gekreuzt. Eine Nachricht, der der Master sendet, heißt z.B. "A ON": Das heißt das er Slave A meint und die Nachricht "ON" schickt, was einfach eine LED anschalten soll.
Hier mein Code:
Master:
Und Slave:Code:'Master $regfile = "M8def.dat" $crystal = 8000000 $hwstack = 100 $swstack = 100 $framesize = 100 'Uart $baud = 9600 Config Serialin = Buffered , Size = 15 , Bytematch = 13 Enable Interrupts 'Main: Do 'senden Print "A" Wait 2 Print "B ON" Wait 2 Print "A OFF" Wait 2 Print "B OFF" Wait 2 Loop
Wenn ich jedoch starte, dann passiert beim Slave nix. Der Master sendet fließig(sieht man am Hyperterminal) doch der Slave verarbeitet das Signal nicht. Ankommen tuts (Serial0charmatch wird aufgerufen), aber er erkennt "A" nicht. Wenn ich per Hyperterminal "A ON" sende, dann funzts...Code:'Slave 1 $regfile = "M8def.dat" $crystal = 8000000 $hwstack = 100 $swstack = 100 $framesize = 100 $baud = 9600 'Globale Variablen Dim Tmp As Byte Dim New_command As String * 15 Dim Command_array(3) As String * 5 Dim New_status As Bit 'Prozeduren Declare Sub Serial0charmatch() Declare Sub Do_set_command(cmd_output As String) 'Configs Config Portc.5 = Output Portc.5 = 1 Config Serialin = Buffered , Size = 15 , Bytematch = 13 Enable Interrupts 'Main: Do If New_command <> "" Then 'Alles in Großbuchstaben umwandeln New_command = Ucase(new_command) 'Anweisung aufteilen Tmp = Split(new_command , Command_array(1) , " ") Select Case Command_array(1) Case "A" 'Status des Ausganges/der Ausgänge zurück geben Call Do_set_command(command_array(2)) Toggle Portc.5 End Select New_command = "" End If Loop 'Subs Sub Serial0charmatch() Input New_command Noecho End Sub Sub Do_set_command(cmd_output As String * 5) Select Case Cmd_output Case "ON" Portc.5 = 1 Case "OFF" Portc.5 = 0 End Select End Sub
Ich bin nicht so der Bascom-Kreck, vielleicht hab ich mich mit irgendwelchen Variablen vertaen...
Vielleicht kann ja irgendjemand helfen,
Grüße,
Tom
Im Master fehlt hinter A das on.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hi,
danke für deine Antwort, aber das "A" hatte ich nur mal zu Testzwecken genommen, um zu prüfen, ob es an dem "on" liegt.
Gruß,
Tom
EDIT:
Ich hab jetzt nochmal nachgeprüft, und den Slave mal das ausgeben lassen, was er bekommt. Er bekommt ganz normal "A OFF" und dann halt CR.
Ich verstehe nicht warum das nicht funktioniert, ich hab auch schon versucht CHR(64) zu senden. A kommt an aber es tut sich nix...
Hi,
Semikolon (carriage return) hinter den Text setzen.
Print "A on";
sollte funktionieren
Gruß
Christian
Hi,
danke für die Antwort aber soweit ich weiß verhindert das Semikolon Carrige Return. Ohne sollte CR und LineFeed(oder so) automatisch gesendet werden.
Gruß,
Tom
PS: Habs auch ausprobiert
hi,
ich hab den quelltext nur mal überflogen, kann es evtl. daran liegen, dass du bei deiner slave zwar ein "A[leer]ON" erhälst, aber in deiner auswertung auf das Signal "AON" wartest, also dieses Leerzeichen nicht bei der auswertung mit einbeziehst?
Wie gesagt, ich hab den code nur überflogen und in Bascom hab ich auch lang nicht mehr programmiert.
mfg robin
Hallo,
guter Ansatz, abersplittet das eingangssignal nach einer Leerzeile in ein Array.Code:Tmp = Split(new_command , Command_array(1) , " ")
Und wie gesagt, wenn ich mit Hyperterminal genau das gleiche sende wie der master, dann funktionierts beim Slave!
Grüße,
Tom
Edit:
Sagtmal kann es sein das die Server-Zeit um eine Stunde zu spät ist?
Wenn es vom Hyperterminal aus geht, zwischen den µC aber nicht, dann würde ich mal auf einen Unterschied zwischen den CR/New_Line Zeichen tippen.
Lass dir doch mal die Länge des Strings ausgeben, bevor der Split Befehl es zerstückelt, und danach die Längen der einzelnen Stücke.
Evtl. kannst du auch die ASCII Werte aller Zeichen ausgeben.
Wenn dann irgendwo noch der Wert 10 oder 13 auftaucht, dann ist das der Grund für den Fehler.
Gruß
Rolf
Moin,
kann man eig. auch 2 Atmega über Pins und Ports miteinander "reden" lassen ?
Wäre doch deutlich einfacher oder nicht ?
MfG iBot
Hi,
danke Rolf, das hilft mir weiter:
Ich hab jetzt herausgefunden, dass der Gesamtstring (New_command) eine länge von 6 hat, und Command_Array(1) eine Länge von 3. (Bei "A ON").
Es besteht aus den Ascii Zeichen: 53, 10, 66, 32,79, 78.
Command_Array(1) besteht aus 53, 10, 66.
Was ja völliger quatsch ist!!
Wenn ichs per Hyperterminal mache dann bekomm ich meine 64, etc...
Was läuft da denn schief?
Grüße,
Tom
Edit:
Geht bestimmt auch, aber mit UART hat man halt schon das Protokoll vorgefertigt...............
Lesezeichen