-         

Ergebnis 1 bis 8 von 8

Thema: Programm funktioniert nur jedes zweite mal

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    36
    Beiträge
    232

    Programm funktioniert nur jedes zweite mal

    Anzeige

    Hi Leute!

    Ich bin mit meinem Programm schon recht zufrieden. Wenn ich einen Befehlsstring an meinen Mega8 sende, werden die Daten korrekt verarbeitet und es funktionert alles so, wie es soll. Dann schicke ich den zweiten Befehl und es tut sich nichts mehr! Die Motoren bleiben stehen und es wird auch nichts mehr an den PC zurückgesendet. Sende ich den dritten Befehl funktioniret es wieder.

    Ich denke er bleibt in einer der Schleifen hängen, aber ich finde den Fehler nicht. Bin auch für Verbesserungen aller Art dankbar!

    MFG!

    Achja ein Befehlsstring sieht so aus: m255-255-1-0000x

    Code:
    $regfile = "m8def.dat"                                     
    $crystal = 4000000                                         
    $baud = 9600                       
    
    Config Portb = Output
    
    Config Pind.5 = Output                                      'Motor 1 In1   D5
    Motor1_in1 Alias Portd.5
    Config Pind.6 = Output                                      'Motor 1 In2   D6
    Motor1_in2 Alias Portd.6
    Config Pind.7 = Output                                      'Motor 2 In1   D7
    Motor2_in1 Alias Portd.7
    Config Pinb.0 = Output                                      'Motor 2 In2   B0
    Motor2_in2 Alias Portb.0
    
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
    Enable Interrupts
    
    
    
    Dim S As String * 1                                         
    Dim Befehl As String * 22                                   
    Dim X As String * 1                                         
    Dim Laenge As Byte                                          
    Dim Instring As String * 22                                 
    Dim Strings(7) As String * 3                                
    Dim Char As String * 1                                      
    Dim Par As Byte                                             
    Dim Idx As Byte                                             
    Dim Pwms1 As Byte
    Dim Pwms2 As Byte
    Dim Richtung As Byte
    
    
    ' m255-255-1-0000x
    
    Do
       If Ischarwaiting() = 1 Then S = Inkey()
    
        If S = "m" Then                      
            Do                                       
            X = Inkey()
            Befehl = Befehl + X    
            Loop Until X = "x"            
    
                Laenge = Len(befehl)   
                Laenge = Laenge - 1    
    
                Instring = Left(befehl , Laenge)  
      Par = 1
      For Idx = 1 To Len(instring)
          Char = Mid(instring , Idx , 1)
          If Char = "-" Then
             Incr Par
          Else
             Strings(par) = Strings(par) + Char
          End If
      Next
    
      Pwms1 = Val(strings(1))   
      Pwms2 = Val(strings(2))
    
      Richtung = Val(strings(3))
    
      Print Pwms1
      Print Pwms2
      Print Richtung
    
      For Par = 1 To 5
      Strings(par) = ""
      Next
    
    End If
    
    Select Case Richtung
    
    Case 1:
    Motor1_in1 = 1
    Motor1_in2 = 0
    Motor2_in1 = 1
    Motor2_in2 = 0
    
    Case 2:
    Motor1_in1 = 0
    Motor1_in2 = 1
    Motor2_in1 = 0
    Motor2_in2 = 1
    
    Case 3:
    Motor1_in1 = 0
    Motor1_in2 = 1
    Motor2_in1 = 1
    Motor2_in2 = 0
    
    Case 4:
    Motor1_in1 = 1
    Motor1_in2 = 0
    Motor2_in1 = 0
    Motor2_in2 = 1
    
    Case Else:
    Motor1_in1 = 0
    Motor1_in2 = 0
    Motor2_in1 = 0
    Motor2_in2 = 0
    
    End Select
    
    Compare1a = Pwms1
    Compare1b = Pwms2
    
    Loop
    End


  2. #2
    Benutzer Stammmitglied
    Registriert seit
    14.09.2005
    Alter
    61
    Beiträge
    77
    Ich habe mir dein Programme jetzt nicht im Detail angeschaut. Aber es gibt nur eine Möglichkeit wo es hängen bleiben kann, und zwar in der DO LOOP
    Do
    X = Inkey()
    Befehl = Befehl + X
    Loop Until X = "x"

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    36
    Beiträge
    232
    OK das kann sein, wenn das "x" nicht richtig ankommt, aber dann sollten doch die Werte für die PWMs nicht geändert werden. Sprich die Motoren drehen mit der gleichen Geschwindigkeit weiter, oder?
    Bei mir bleiben die beiden Motoren stehen....


  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    36
    Beiträge
    232
    Problem gelöst:
    Ich hab vergessen den String "Befehl" nach einem Aufzeichnungsdurchlauf wieder zu leeren... So hat er immer den neuen Befehl angehängt...


  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    @King_Sixxx

    Du hast da recht große Schleifen die du vieleicht in Unterroutinen verschieben kannst.
    Dann wird es auch einfacher den Fehler zu finden.

    zb. den ganzen Passus nach If s= "m" then..... würde ich mal separieren.

    Könnte aber auch sein das dein Stack nur zu klein ist.
    wie gesagt ist bei dem langen Code schwer was zu lesen.
    Gruß
    Ratber

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Salut,

    wenn ich die eschichte richtig identifiziert habe sendest du den
    Zahlenwert dez. 255 z.B. als String "255"?
    Warum verwendest Du nicht den ASCII?
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    36
    Beiträge
    232
    @Ratber
    Du meinst ich schriebe die Routine für die Aufzeichnung und den Teil mit der Zerlegung in eine Unterroutine und rufe in der Hauptschleife nur die Unterroutinen auf?
    Hat das einen weiteren Vorteil als die Übersichtlichkeit?

    @Vitis
    Da ich auch Buchstaben versende, dachte ich, dass könne man nur mit einem String. Wie müsste es denn sonst aussehen??

    MFG!


  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Du meinst ich schriebe die Routine für die Aufzeichnung und den Teil mit der Zerlegung in eine Unterroutine und rufe in der Hauptschleife nur die Unterroutinen auf?
    Hat das einen weiteren Vorteil als die Übersichtlichkeit?
    Nicht unbedingt direkt.
    Gruß
    Ratber

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •