mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik hilfe! Bascom/UART-Interrupt hängt


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst deinen Inputstr nach dem Bearbeiten "leeren".

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
joa das macht sinn, kann ich das so machen?

inputstr = ""

vielen dank schonmal

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt inputstr = "" in die main schleife eingefügt und in die L und 
R, aber er hängt sich immernoch auf............

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht interressant aus, ich probier mal das ganze in eine ähnliche 
struktur zu bringen....
vielen dank

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
.
.
.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.