Du machst nach jedem Inkey(#2) zwei ziemlich lange "PRINT" Befehle. In der Zeit ist der Empfang nicht bereit.
Empfehlung: erst "inkey" bis X=0 , dabei die Daten sammeln, und erst dann "PRINT"
Hallo zusammen,
und das Neue Jahr fängt nicht besser an, als das alte aufgehöhrt hat.
Ich hoffe Euer Start ist besser als meiner.
Problem: Mit dem RN-Minicontrol will ich am PC eingegebene Texte an das RN-Funk übergeben und gleichzeitig am PC den Empfang kontrollieren. Damit ist die RS232 für den PC erforderlich, das RN-Funk muss über eine Soft UART angesprochen werden (der Max ist beim RN-Runk entfernt).
Auf der anderen Seite der Funkstrecke sitzt ein RNmega128 mit Easyradio on Board, der allerdings 2 UARTs hat und damit an dem 2ten PC problemlos funktioniert.
Die Soft UART des RN-Minicontrol kann problemlos senden (es kommt alles am RN128 bzw. 2ten PC an), aber der Empfang ist mal da mal nicht, mal verstümmelt, mal genau 2 Zeichen (je nach Code Version und nicht klar reproduzierbar).
Getestet habe ich verschiedene Ports (auch PD3 mit INT1), in zig Kombinationen mit Buffer und ohne .....
Getestet habe ich auch eine Verbindung vom Funk (in) eine Kabelverbindung auf PD3 (--> Int1 Interrupt) was gar nicht funktioniert hat....
Ebenso hatte ich die Empfangsabfrage im Int1 --> da kam mal was ....
Könnt Ihr bitte mal drüber schauen --> ich bin mittlerweile betriebsblind
Zusatzfrage: Kann ich in das RN-Minicontrol einfach einen ATmega162 einbauen? Der hätte 2 UARTs.Code:'############################################################## ' 'Aufgabe: ' Lese alle Bytes vom Funk und gebe diese auf RS232 aus ' Lese alle Bytes vom PC via RS232 und gebe diese auf Funk aus ' ' ' Verkabelung: ' JP5 --> Pin 5 (PD4) mit dem Funkmodul TTL RS232 OUT verbunden ' --> Pin 4 (PB4) mit dem Funkmodul TTL RS232 IN verbunden ' ' RS232 --> PC Kabel ' '############################################################## $regfile = "m168def.dat" 'Prozessor $crystal = 16000000 'Quarzfrequenz $hwstack = 32 $framesize = 32 $swstack = 32 $baud = 19200 'Für RS232, für Funk in Soft UART angegeben On Int1 Int1_int 'Wenn PD3 den Status ändert. Für Soft UART benötigt? Enable Int1 Config Int1 = Falling 'Auch Rising schon getestet Enable Interrupts Dim Funkempfang As Integer Dim D As Integer Dim X As Byte Dim S As String * 1 Dim Sendetext As String * 30 Dim Empfangtext As String * 30 Config Serialout = Buffered , Size = 100 Config Serialin = Buffered , Size = 100 ' ---------- Ende der Deklarationen ----------------------------------------- Print "Warte ich boote ..." ' Ausgabe am PC funktioniert gut Open "comd.4:19200,8,n,1" For Output As #1 'jp5 Pin 5 linkester bzw. außen Open "comb.4:19200,8,n,1" For Input As #2 'jp5 Pin 4 zweit linkester bzw. innen D = 1 Funkempfang = 0 Wait 3 Print "Los geht's" Do Print " Schleife = " ; D 'Geht auf RS232 und PC ' ---------- RS232 abfragen und über Funk Ausgeben ------------------------ Sendetext = "" While Ischarwaiting() <> 0 ' Wird vom RS232 gelesen S = Inkey() If S <> "0" Then Sendetext = Sendetext + S End If Wend If Len(sendetext) > 0 Then Print "Sende jetzt: " ; Sendetext Print #1 , Sendetext 'Geht gepuffert zum Funk Print #1 , Len(sendetext) End If ' ---------- bis hierhin funktioniert alles ------------------------ X = Inkey(#2) While X <> 0 Print "Hurra X= " ; Printbin X Print X = Inkey(#2) If X = 0 Then Print "Ende" End If Wend D = D + 1 Wait 3 Loop End Int1_int: Return
Danke.
Gruß
Burkhard
Du machst nach jedem Inkey(#2) zwei ziemlich lange "PRINT" Befehle. In der Zeit ist der Empfang nicht bereit.
Empfehlung: erst "inkey" bis X=0 , dabei die Daten sammeln, und erst dann "PRINT"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert,
danke für die rasche Antwort.
Das war einer meiner Tests --> nur ein einziges Inkey --> damit bekomme ich genau ein Zeichen, das funktioiniert (das Kabel ist also auch ok).
Problem ist, dass da keine Schleife funktioniert, mit while X<>0 .... und permanent X=Inkey() bekomme ich genau 1 Zeichen.
Ischarwaiting() funktioniert bei Soft UART nicht (da meckert schon der Compiler).
Theoretisch könnte ich immer 1 Byte senden, das Echo zurück geben und dann das nächste senden, aber das Endgerät sendet mit hoher Geschwindigkeit und erwartet eine Antwort innerhalb von wenigen ms. Und was wenn ich 2 Meldungen kurz nacheinander erhalte?
--> Ratlosigkeit
Meine 2te Frage war, ob ich in das RN-Minicontrol einfach einen ATmega162 einbauen? Der hätte 2 UARTs.
Kannst Du da etwas sagen?
Gruß
Burkhard
Also, wenn der 162 Pinkompatibel ist (?), kannst du ihn reintun.
versuche:
Kann ich jetzt nicht testen, sollte aber gehenCode:.......dein code etc ' ---------- bis hierhin funktioniert alles ------------------------ DIM instring as string * 8 DIM Inchar(8) as byte at instring overlay DIM inidx as byte inidx = 0 do incr inidx X = Inkey(#2) inchar(inidx) = X while X > 0 Print "<";Instring;">Len:";inidx
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert,
habe ich probiert (do ... while geändert in while .. wend) und keinen Erfolg gehabt.
Ob der ATmega162 pinkompatibel ist -->keine Ahnung, soweit ich gesehen habe ist er "Fuß-Anzahl-Kompatibel"
Gruß
Burkhard
mmmhh.
Ich würde, um den Fehler einzukreisen, einmal mit $BAUD deutlich runtergehen, also 1200 oder so. Wenn der Fehler dann verschwindet, weiss man, wo man was tun muss.
Ich seh mir mal die Bascom-Soft-Uart an, was es da mit dem Int1 auf sich hat.
Mega162: dass die Anzahl der HAxen übereinstimmt, ist, wie man so sagt, "notwendig", aber nicht "hinreichend". Sagt auch nix, wenn sie gleich viel kosten oder im selben Laden gekauft sind *g*
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Die Idee hinter ext. Int1 ist, dass man den Softuart-Empfang dort reinpackt um eine unmittelbare Reaktion auf eingehende Daten zu bekommen.
Eine leere Int1-ISR nutzt Dir nix. Nicht vergessen zum Abschluss der ISR das INTF1 zu löschen, ist in diesem Fall notwendig.
Nachteile einer solchen Konstruktion: Blockierung anderer ISR's während des Empfangs und andere ISR's können den Empfang behindern.
@PicNick
Das wird so nix, denn da müsste der PC dann senden, wenn der µC genau diese Stelle des Codes ausführt. Da wäre ein Waitkey() angebracht. Das hätte allerdings den Nachteil, dass der Code hängen bleibt, wenn nix von der Seriellen reinkommt.Code:.......dein code etc ' ---------- bis hierhin funktioniert alles ------------------------ DIM instring as string * 8 DIM Inchar(8) as byte at instring overlay DIM inidx as byte inidx = 0 do incr inidx X = Inkey(#2) inchar(inidx) = X while X > 0 Print "<";Instring;">Len:";inidx
Man könnte sich für Inkey() selber etwas stricken, so in etwa:
Code:Dim Time_Out As Word Time_Out = 10000 While PinB.4 = 1 And Time_Out > 0 Decr Time_Out Wend X = Inkey(#2) ' ...
Du hast recht, wer nix weiss, soll nix reden.
Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Na, ich denke, Du weist schon, speziell bei Inkey() mag das jetzt nicht der Fall sein.
Muss zugeben, das wusste ich auch nicht genau, nur ergab sich aus der Hilfe:Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
dass Inkey() nicht-blockierend wirkt und lustig weitermacht, wenn nichts ansteht. Ob etwas ansteht, kann bei Soft-UART sowieso nur aktiv per Polling festgestellt werden (außer man verwendet Intx).If there is no character waiting, a zero will be returned.
Daraus ergab sich, dass es im Pogrammablauf sehr unwahrscheinlich ist, dass das einzelne Inkey() gerade da kommt, wenn das Startbit vom PC kommt. Es gibt ein Beispiel dazu, "open.bas" im Samples-Ordner, da wird Inkey() in 'ner Do/Loop gepollt.
Aber um auch sagen zu können, was Inkey() tatsächlich macht, hab' ich's mir angesehen.
Wenn der Pin auf High liegt, liefert es eine 0 zurück, wenn er auf Low liegt, wird die Soft-UART Empfangsroutine ausgeführt.
Bei Deinem Code ist die Schleifenabbruchbedingung x = 0. Aus dem Gesagten ergibt sich, dass dies sehr wahrscheinlich gleich beim ersten Durchlauf zutrifft, die Schleife also sofort verlassen wird.
Waitkey() hingegen würde darauf warten, dass der Pegel Low geht, blockiert aber wenn nix über die Serielle kommt den weiteren Ablauf, deswegen mein Vorschlag mit dem Timeout.
Geändert von MagicWSmoke (02.01.2012 um 13:57 Uhr)
Das Bascom-Help hat mich über die Eigenheiten bzw. Unterschiede bei HW- und Softuart nicht befriedigt.
Bevor ich aber da mangels bessern Wissens nochmal "Lull" und "lall" erzähle, werd ich mir die diversen Soft-Uart Routinen disassemblieren und melde mich dann auf der Kampfstatt wieder *g*
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen