Hallo, ich hab ein problem mit meinem bascom program. Ich sende dem µc über den uart zB einen String wie L12crfl. die 12 soll in eine variable übergeben werden und zunächst eien servo steuern. das ganze haut auch hin aber nur ein mal!? danach hängt das programm in der hauptschleife fest?! warum löst der interrupt nur einmal aus? Ich wäre für jede hilfe dankbar hier der code: ---------------------------------------------------------- $regfile = "m8def.dat" $crystal = 3686400 $baud = 9600 Config Portc.0 = Output Config Portc.1 = Output On Urxc Onrxd Enable Urxc Enable Interrupts Dim Dat As Byte Dim Lr As String * 1 Dim Inputstr As String * 6 Dim Ml As String * 6 Dim Mr As String * 6 Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 10 Inputstr = "" Main: Servo(1) = Ml * 10 Servo(2) = Mr * 10 Print Ml ; Mr Goto Main Onrxd: Do 'interrupt bei If Usr.rxc = 1 Then Inputstr = Inputstr + Chr(udr) If Udr = 13 Then Goto Lor End If Loop Return Lor: Print Inputstr Lr = Left(inputstr , 1) 'L oder R ? Select Case Lr Case "L" Goto L Case "R" Goto R End Select Goto Main L: 'wert auslesen Ml = Right(inputstr , 3) Ml = Left(ml , 2) Print Ml Goto Main R: Mr = Right(inputstr , 3) Mr = Left(mr , 2) Print Mr Goto Main
joa das macht sinn, kann ich das so machen? inputstr = "" vielen dank schonmal
hab jetzt inputstr = "" in die main schleife eingefügt und in die L und R, aber er hängt sich immernoch auf............
ich glaube es liegt daran dass ich das return des interrupts nie erreiche; ich wüsste jetzt aber gar nicht wie ich das machen sollte, schließlich soll bei "enter" gesprungen werden. jemand ne idee?
Hallo, was soll das werden? If Udr = 13 Then Goto Lor Das Ende der Interruptroutine ist Return und nur Return. Du solltest Dich mit der Funktion von Interrupts befassen, auch BasCom dürfte erst mit Return ein RETI machen und damit die Interrupts wieder freigeben... Wie bei "enter" reagiert wird, ist ein Problem der Hauptschleife, die Interruptroutine hat nur die Zeichen an den String anzuhängen und weiter nichts. Gruß aus Berlin Michael
die ganzen "GoTo's"... da fehlt immer ein "Return" an passender Stelle. Print im USART Interrupt ist auch irgentwie nich richtig ---------------------------------------------------------- $regfile = "m8def.dat" $crystal = 3686400 $baud = 9600 Config Portc.0 = Output Config Portc.1 = Output On Urxc Onrxd Enable Urxc Enable Interrupts Dim rechtslinks as Byte Dim Dat As Byte Dim Lr As String * 1 Dim Inputstr As String * 6 Dim Ml As String * 6 Dim Mr As String * 6 Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 10 Inputstr = "" rechtslinks = 0 Main: Servo(1) = Ml * 10 Servo(2) = Mr * 10 Select Case (rechtslinks) Case 1 Print Inputstr Case 2 Print M1 Case 3 Print Mr End Select rechtslinks = 0 Print Ml ; Mr Goto Main Onrxd: 'interrupt bei Inputstr = Inputstr + Chr(udr) If Udr = 13 Then Goto Lor Return Lor: rechtslinks = 1 'Print Inputstr Lr = Left(inputstr , 1) 'L oder R ? Select Case Lr Case "L" Goto L Case "R" Goto R End Select Return L: 'wert auslesen Ml = Right(inputstr , 3) Ml = Left(ml , 2) 'Print Ml rechtslinks = 2 Return R: Mr = Right(inputstr , 3) Mr = Left(mr , 2) rechtslinks = 3 'Print Mr Return
Hallo, naja, irgendwie stimmt die ganze Struktur nicht. In der IRQ-Routine nur: Onrxd: 'interrupt bei Inputstr = Inputstr + Chr(udr) If Udr = 13 Then Flag = true ' Flag setzen, daß "enter" kam Return Main: IF FLAG = true den Krempel zur Auswertung hier rein flag = false 'Flag hier zurücksetzen wenn fertig bearbeitet. ENDIF und der Rest ... Goto Main Sorry, benutze kein Bascom, Syntax ist nur Beispiel... Ich wprde in der IRQ-Routine auch als erstes den Flag-Zustand abfragen und den Strin nur erweitern, wenn der vorige fertig bearbeitet wurde, sonst den Inhalt von UDR eben wegwerfen. Das ist aber dann die nöchste Baustelle. ;) Interrupt-Routinen so kurz wie möglich, Bearbeitung im Hauptprogramm sollte mit Sicherheit auch bei Bascom Beachtung finden. Gruß aus Berlin Michael
sieht interressant aus, ich probier mal das ganze in eine ähnliche struktur zu bringen.... vielen dank
Hallo, ich benutze (in ASM) meist solche einfachen Semaphoren-Strukturen. Komplett wird es dann etwa so: Onrxd: if flag = true ' letzter Event noch nicht bearbeitet!!! error = true ' Fehler, es gingen Daten verloren... dummy = UDR ' Daten abholen und wegwerfen, damit der IRQ nicht hängenbleibt else Inputstr = Inputstr + Chr(udr) If Udr = 13 Then Flag = true ' Flag setzen, daß "enter" endif kam Return Beim UART kann man natürlich auch die Flags auswerten, bei anderen Sachen, wo ich nicht sicher bin, ob mein Konstrukt in der verfügbaren Zeit fertig wird, hat es mir aber schon oft bei der Fehlersuche geholfen... Natürlich muß die Hauptroutine sich noch um das Fehlerflag kümmern. Alles nur als Anregung zu verstehen. Gruß aus Berlin Michael
so das interrupt problem ist gelöst, aber nach einigen sekunden hängt sich das programm wieder auf.es bringt wohl die strigs durcheinander.wie kann ich denn ein string auf seine richtigkeit überprüfen? ich sende zb: R13CR L05CR R15CR L09CR . . .
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.