-         

Ergebnis 1 bis 4 von 4

Thema: Timing-Probleme mit RS232 ..

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.10.2010
    Beiträge
    46

    Timing-Probleme mit RS232 ..

    Anzeige

    Hallo Leute.

    Ich hoffe ich bin hier richtig, wenn nicht bitte von den Admins verschieben.

    Ich habe ein kleines Problem mit RS232 und hoffe Ihr könnt mir helfen und
    bevor jetzt jemand sagt:

    Nimm "C"..
    Nimm "Asembler"..
    Schau in die Doku ...
    etc.
    Ich habe Bascom, und die Doks vorwärts und Rückwärts gewälzt. Ich habe gegoogelt und Bekannte gefragt, aber leider keine Lösung für mein Problem gefunden.

    Zur Vorgeschichte:
    Ich habe mir vor ein paar Wochen einen kleinen Roboter gebaut. Aus Geldmangel habe ich mir meinen IR-Sensor selber gebaut.
    Wenn der groß ist soll er mal ein autonomer Staubsauger werden.

    http://www.youtube.com/watch?v=D4ZRUNkrvfs

    Mit dieser Sensor Platine kann ich bis zu 8 Sensoren einzeln ansteuern.
    Der Controller des Robis ist ein atmega16.
    Programmiert habe ich in Bascom.

    Nun habe ich kleines Programm in Gambas2 (Linux Basic) geschrieben das mir grafisch den Robi darstellt und wo ich gezielt einzelne Sensoren und die Motoren abfragen kann.
    Das Programm ist erst mal rudimentär und soll später ausgebaut werden.
    Momentan ist die Verbindung zum Robi über ein RS232-Kabel.

    Zum Problem:
    Ich habe nun auf meinem Robi das Problem das wenn ich per RS232 in den Testmodus gehe er bei Abfrage der Motoren die befehle sauber ausführt.
    Die Befehle die ich per RS232 mit Hterm für die Motoren übertrage sind:

    links
    rechts
    beide
    stop

    Der Robi steuert dann dementsprechend die Motoren auch an und quittiert die empfangenen Befehle.

    Bei den Sensoren habe ich das Problem das er nicht mehr den Sensor ausschaltet.
    Ich kann den Sensor starten in Hterm mit den Befehlen..
    sensor1 ein
    sensor2 ein
    sensor3 ein

    ..und sollte dann den jeweiligen Sensor auch wieder ausschalten können mit..
    sensor aus.
    Das ist der Plan.

    Bei der Motor Steuerung funktioniert es. Bei den Sensoren nicht.
    Während der Motor zustand zurück gesendet wird, werden beim Sensor der Stopp-Befehl abgeschnitten und das sieht dann so aus.
    Siehe Anhang:

    Ich bin ehrlich gesagt etwas mit meinem Latein am ende.
    Wenn ich aus der Schleife den Befehl "call ir_1()" raus nehme und den Sensor abfrage funktioniert es. Es scheint also
    irgendwie ein Timing-Problem zu sein.

    Ich bin eigentlich davon ausgegangen das wenn der Controller per RS232 ein Zeichen empfängt das er es irgendwo zwischen puffert (Frame) bis zum Überlauf, oder bis zur Abfrage mit dem Input-befehl.

    Hier habe ich die entscheidenden Sub-Routinen.
    Code:
    Do
    
     If Ischarwaiting() = 1 Then
      Input Empfangen
      Call Decode()
     End If
    .
    .
    .
    loop
    end
    
    Sub Ir_1()
     Id1 = 1
     For X = 0 To Max_ping
      Ir1 = 1
      Waitus 300
      Ir1 = 0
      Waitus 100
      If Eingang = 1 And Sensor_test = 0 Then
        Status_led = 1
        Print "sensor1"
        Call Vollbremsung
        Waitms 200
        Call Zurueck_setzen()
        Waitms 200
        Call Vollbremsung()
        Schwenk = 1
       Else
        Status_led = 0
      End If
      If Eingang = 1 And Sensor_test = 1 Then
        Status_led = 1
        Print "sensor1"
       Else
        Status_led = 0
      End If
     Next X
     Id1 = 0
    End Sub
    
    
    Sub Decode()
      If Empfangen = "links" Then
        Call Test_motor(1)
      End If
      If Empfangen = "rechts" Then
       Call Test_motor(2)
      End If
      If Empfangen = "beide" Then
       Call Test_motor(3)
      End If
      If Empfangen = "sensor1 ein" Then
       Call Test_sensor(1)
      End If
      If Empfangen = "sensor2 ein" Then
       Call Test_sensor(2)
      End If
      If Empfangen = "sensor3 ein" Then
       Call Test_sensor(3)
      End If
    End Sub
    
    
    Sub Test_sensor(byval Wert As Byte)
     Dim Sens_nr As Byte
    
       Sensor_test = 1
       Sens_nr = Wert
    
       Schleife_sensor_test:
       If Sens_nr = 1 Then
        Call Ir_1()
       End If
       If Sens_nr = 2 Then
        Call Ir_2()
       End If
       If Sens_nr = 3 Then
        Call Ir_3()
       End If
       If Ischarwaiting() = 1 Then
        Input Empfangen
        If Empfangen = "sensor aus" Then
         Print "Sensor aus"
         Sensor_test = 0
         Exit Sub
        End If
       End If
       Goto Schleife_sensor_test
    End Sub
    
    
    Sub Test_motor(byval Wert As Byte)
      Call Odo_reset()
      If Wert = 1 Then
       Print "linker motor"
       Call Nur_links()
      End If
      If Wert = 2 Then
       Print "rechter motor"
       Call Nur_rechts()
      End If
      If Wert = 3 Then
       Print "beide motoren"
       Call Voraus()
      End If
    
      Call Vollgas()
      Call Anfahren()
     Schleife_test:
      If Ischarwaiting() = 1 Then
       Input Empfangen
       If Empfangen = "stop" Then
        Call Vollbremsung()
        Exit Sub
       End If
      End If
    '  Call Odometer()
      Goto Schleife_test
    End Sub
    Ich weiß der eine oder andere wird jetzt die Hände über dem Kopf zusammenschlagen und etwas von Spagetticode murmeln.
    Der Code ist gewachsen und wenn die primären Funktionen erst mal tun überarbeite ich den ganzen Code.
    Versprochen.

    Aber erstmal muss die ganze Elektronik mit der Software zusammenspielen und ich muss wissen wieso er den Befehl "sensor aus" nicht ganz empfängt/auswertet.
    Wieso er nur die beiden Anfangsbuchstaben anzeigt und den Rest des Befehls verschluckt.

    Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt und mein Problem geschildert.

    Das sind die Werte für:
    Code:
    $regfile = "m16def.dat"
    $framesize = 100
    $swstack = 100
    $hwstack = 100
    $crystal = 16000000
    $baud = 19200
    Der Controller wird mir 16Mhz getaktet.

    Ich hoffe Ihr findet den Fehler und habt eine Lösung für mein Problem.
    Ich weiß nämlich nicht mehr weiter.

    Gruß
    Thomas
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken hterm_robi1-2.jpg  

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wenn Empfangen = "sensorx ein" rufst du Test_sensor
    In Test sensor checkst du den Sensor
    dann fragst du, ob "sensor aus" empfangen wurde
    wenn nein, machst du "goto" schleife_sensor_test (die du allerdings nicht herzeigst)
    Aber wenn du da mal drin bist, fragst du NIE WIEDER auf "sensor aus" ab.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.10.2010
    Beiträge
    46
    Hallo Leute.

    Danke hat sich erledigt.
    Habe die Lösung hier gefunden

    http://halvar.at/elektronik/kleiner_...om_computer_2/

    Gruß
    Thomas

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.10.2010
    Beiträge
    46
    Hallo Robert.

    Wie gesagt hat sich erledigt.
    Will Dir aber trotzdem gerne Antworten.
    "schleife_sensor_test"ist nur ein Label auf den gesprungen wird.

    Schleife_sensor_test:
    If Sens_nr = 1 Then
    Call Ir_1()
    End If
    If Sens_nr = 2 Then
    Call Ir_2()
    End If
    If Sens_nr = 3 Then
    Call Ir_3()
    End If
    If Ischarwaiting() = 1 Then
    Input Empfangen
    If Empfangen = "sensor aus" Then
    Print "Sensor aus"
    Sensor_test = 0
    Exit Sub
    End If
    End If
    Goto Schleife_sensor_test

    Ich verstecke nix
    Alles Da.

    Gruß
    Thomas

Berechtigungen

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