-         

Ergebnis 1 bis 8 von 8

Thema: Zeitproblem bei parallelem Servo

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339

    Zeitproblem bei parallelem Servo

    Anzeige

    Hallo,
    ich habe ein Problem mit dem Quellcode (siehe unten). Wenn ich den Servo, der in dem Code konfiguriert ist rausnehme, also Config Servo entferne und die Servo(1) = Anweisungen rausnehme funktioniert der Code einwandfrei !
    Der Timer läuft mit der gewünschten Frequenz und auch die Wait-Befehle funktionieren richtig.
    Wenn ich nun den Servo dazu nehme, dann funktioniert auch der Timer und alles, aber die Wait-Befehle brauchen nicht gerade unwesentlich länger. Bestimmt 4 bis 5mal so lang.

    Woran liegt das ?


    Code:
    $regfile = "M16def.dat"
    $crystal = 2000000
    $baud = 9600
    
    
    Config Portb = Output
    Portb.0 = 1
    Config Pina.5 = Output
    
    Config Servos = 1 , Servo1 = Porta.5 , Reload = 10
    
    
    Dim Sservorichtung As Byte : Sservorichtung = 2
    Dim Sensorservo As Byte : Sensorservo = 25
    Servo(1) = Sensorservo
    
    Config Timer1 = Timer , Prescale = 64
    Enable Timer1
    On Timer1 Sensor_abfrage
    Enable Interrupts
    Timer1 = 34285
    
    
    Wait 5
    
       Print "aM-1" : Waitms 10
       Print "c1HF"
       Print "aM-4" : Waitms 10
       Print "c3HF" : Waitms 425
     
    Do
    
       Print "aM-1" : Waitms 10
       Print "c2RF"
       Print "aM-3" : Waitms 10
    
    Loop
    
    
    Sensor_abfrage:
       Timer1 = 34285
    
       If Sensorservo > 58 Then Sservorichtung = 1
       If Sensorservo < 26 Then Sservorichtung = 2
    
       If Sservorichtung = 1 Then Sensorservo = Sensorservo - 5
       If Sservorichtung = 2 Then Sensorservo = Sensorservo + 5
    
       Servo(1) = Sensorservo
    
    Return
    * human knowledge belongs to the world *

    www.domspage.de - Robotik - TobiSAt8

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569

    Re: Zeitproblem bei parallelem Servo

    Zitat Zitat von ProgDom
    Hallo,
    ich habe ein Problem mit dem Quellcode (siehe unten). Wenn ich den Servo, der in dem Code konfiguriert ist rausnehme, also Config Servo entferne und die Servo(1) = Anweisungen rausnehme funktioniert der Code einwandfrei !
    Der Timer läuft mit der gewünschten Frequenz und auch die Wait-Befehle funktionieren richtig.
    Wenn ich nun den Servo dazu nehme, dann funktioniert auch der Timer und alles, aber die Wait-Befehle brauchen nicht gerade unwesentlich länger. Bestimmt 4 bis 5mal so lang.

    Woran liegt das ?
    Okay, ich versuche es einmal:

    Der Wait Befehl unter Bascom wird schlicht und einfach dadurch realisiert, das eine Schleife Solange vorbei ist, bis die Anzahl der Prozessortakte Vorbei ist, die der eingestellten Zeit entsprechen.

    Der Servocode wird von Bascom in einer Interupt Service Routine durchgeführt.

    In deinem Fall heisst das:

    Während er in der Warteschleife hängt, wird diese immer wieder durch den entsprechenden Interupt unterbrochen und die Servowerte werden "rausgejagt".
    Da bei der von die verwendeten Taktfrequenz von 2 MHz diese Routine sehr häufig ausgeführt werden muss (ich vermute sogar häufiger als er es bei 2 MHz ausführen kann) braucht die Zeitzählschleife (der Wait Befehl) naturgemäß wesentlich länger.

    Man kann sich dieses in etwa wie folgt vorstellen:
    Nehmen wir einmal an, jemand sortiert in einer Sekunde jeweils eine Flasche in ein Regal ein und misst die Zeit bis er 10 Flaschen in diesem Regal hat. Dann braucht diese Person ohne eine Unterbrechung 10 Sekunden dafür.
    Wird er während dieser Tätikeit aber z.B. durch das Telefon unterbrochen braucht diese Person dafür naturgemäß wesentlich länger dafür.


    Lösungsansätze:

    a) höhere Taktfrequenz verwenden (min. 8 MHz), oder
    b) anderen Reload Wert für die Servoconfig verwenden (statt 10 z.B. 20 oder noch höher), oder
    c) wenn es nur ein oder 2 Servo sein sollen, könnte man die Ansteuerung manuell über den Timer 1 mittels seiner 2 vorhandenen Hardware PWM Kanäle realisieren. Da diese quasi nebenbei und ohne weiteres zutun des generiert wird, kann diese Methode auch keine Verzögerungen bei deinen "Wait" Befehlen verursachen. Allerdings wirst du dich bei dieser Methode mit dem Datenblatt des ATmega 16 etwas intensiver auseinandersetzen müssen.

    Grüße,
    da Hanni.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Hallo,

    daran dachte ich natürlich auch zunächst, jedoch hat die Timer-Interrupt-Routine eine Frequenz von einem Hertz !!!

    Selbst wenn sie jetzt fünf mal während des Wait 5 aufgereufen wird, kann ich mir kaum vorstellen, dass die Interrupt-Routine länger als 3 Sekunden braucht bei 2Mhz, denn nur dann würde der Wait-Befehl so lange verzögert werden !
    * human knowledge belongs to the world *

    www.domspage.de - Robotik - TobiSAt8

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569

    Re: Zeitproblem bei parallelem Servo

    Zitat Zitat von Hanni
    Der Servocode wird von Bascom in einer Interupt Service Routine durchgeführt.

    In deinem Fall heisst das:

    Während er in der Warteschleife hängt, wird diese immer wieder durch den entsprechenden Interupt unterbrochen und die Servowerte werden "rausgejagt".
    Da bei der von die verwendeten Taktfrequenz von 2 MHz diese Routine sehr häufig ausgeführt werden muss (ich vermute sogar häufiger als er es bei 2 MHz ausführen kann) braucht die Zeitzählschleife (der Wait Befehl) naturgemäß wesentlich länger.
    Defakto bremst damit nicht deine selbstgeschriebene Timerroutine das ganze aus sondern der Timerinterupt in dem die Servoansteuerung läuft (und den du daher verständlicherweise nicht in deinen paar Zeilen Basic finden kannst !!)

    Hier noch einmal ein relevanter Beitrag (Servosteuerung) aus dem Forum dazu: klick mich

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Jaja, der Tag war heut lang, ich habe gerade auch noch gemerkt, dass du den Servo-Timmer meinst, leider zu spät ^^
    * human knowledge belongs to the world *

    www.domspage.de - Robotik - TobiSAt8

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Nuja, deswegen bist du ja kein schlechter Mensch

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Ich muss ja gerade nochmal nachfragen (wobei ich morgen wahrscheinlich sagen werde das es doch völlig klar war, bin nur schon über 26h auf den Beinen ^^ und will das hier noch fertig bekommen !).

    Also warum funktioniert denn sowas einwandfrei:

    Code:
    Dim I As Byte
    Do
    For I = 0 To 100
    Servo(1) = I
    Waitms 1000
    Next
    
    For I = 200 To 0 Step -1
    Servo(1) = I
    Waitms 1000
    Next
    Loop
    Dabei werden doch eigentlich auch während des Wait-Befehls Servosteuerimpulse ausgesendet. Nur warum stimmen da die Zeiten genau ????
    * human knowledge belongs to the world *

    www.domspage.de - Robotik - TobiSAt8

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von ProgDom
    Ich muss ja gerade nochmal nachfragen (wobei ich morgen wahrscheinlich sagen werde das es doch völlig klar war, bin nur schon über 26h auf den Beinen ^^ und will das hier noch fertig bekommen !).
    Vorschlag: Schlaf mal drüber

    Ansonsten: hast du sonst noch etwas verändert, also z.B. den Takt ?

Berechtigungen

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