-         
Ergebnis 1 bis 6 von 6

Thema: Servo braucht zu lange

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.09.2004
    Ort
    Abensberg (Niederbayern)
    Alter
    34
    Beiträge
    224

    Servo braucht zu lange

    Anzeige

    Hallo zusammen,

    hab da ein kleines Problem mit nem Servo. Wenn in meinem Fall Pin D6 auf High geht, soll der Servo nach 2 Sekunden nach links fahren, das funktioniert auch einwandfrei. Wenn der Pin auf Low geht, soll er die Mittelstellung anfahren. Und genau hier liegt mein Problem: Hier dauert es auch ungefähr 2 Sekunden, bis der Servo das macht. Sollte er aber gleich machen, wenn der Pin auf Low geht. Hab noch nicht so viel Erfahrung mit Bascom, weiß vielleicht jemand, wo mein Fehler liegt?

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    Config Servos = 1 , Servo1 = Portd.7 , Reload = 10
    Ddrd = &B01111111
    Config Pind.7 = Output
    Config Pind.6 = Input
    Enable Interrupts
    Do
    If Pind.6 = 1 Then
    Wait 2
    Servo(1) = 60
    Else
    Servo(1) = 120
    End If
    Loop
    End

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.837
    Ich vermute (ohne gewähr):
    Angenommen, Pind.6 geht auf 1
    er wartet 2 sekunden, setzt dann das servo
    dann checkt er sofort wieder den Input
    logo, so hast du es ja geschrieben,

    aaaaaaber

    der Pin geht ja IRGENDWANN auf eins, mit großer Wahrscheinlichkeit grad dann, wenn grad WAIT 2 läuft. In der Zeit merkt er aber von nix
    Es kann also auch max. 2 sekunden dauern, bis er wieder zu "DO" kommt und sieht, dass der Pin inzwischen auf "0" ist.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.09.2004
    Ort
    Abensberg (Niederbayern)
    Alter
    34
    Beiträge
    224
    Hmmm...da könntest du recht haben. Hast du vielleicht ne Idee, wie man das programmiertechnisch anders lösen könnte?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.837
    Ich nehm da eigentlich immer einen Timer mit 1 mS, der immer läuft (interrupt)
    Wenn ich will, daß in zwei sekunden etwas passiert, lade ich einen Zähler mit 2000, der dann von dem Timer runtergezählt wird. Geht der Zähler von 1 auf null, passiert dann eben was, sonst nicht.
    Die sonstige Zeit frag ich ununterbrochen und ohne Warten immer meine Pins ab, da versäum ich nix.

    Noch 'ne Frage: wenn innerhalb der 2 Sekunden der Pin von 1 wieder auf 0 geht, soll dann das Abbiegen vorzeitig abgebrochen werden, oder macht er das trotzdem ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.09.2004
    Ort
    Abensberg (Niederbayern)
    Alter
    34
    Beiträge
    224
    Kannst du mir da vielleicht ein Beispiel für meinen Fall geben? Der Servo sollte schon in seine Stellung fahren, es muss also nicht vorzeitig abgebrochen werden.

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.837
    Schnell hingefetzes Beispiel, nicht getestet, ohne Gewähr und nix:
    deine Pin- und Servo konfiguration kannst du selbst einfügen.

    Code:
    Const Tmr_c_prescale =  xxx
    Const Tmr_c_preload =   xxx
    
    Config Timer1 = Timer , Prescale = Tmr_c_prescale 'Timer 1mS
    
    
    On Timer1 Interrupt_ticker                        ' Timer for Timer Queue
    
    dim mycount as word
    
       Enable Timer1
    
    
       Enable Interrupts
    
       Do
    	If Pind.6 = 1 Then 
    	       mycount = 2000
            else 		 
    	       mycount = 0
                           Servo(1) = 120 
            End If 
        Loop 
    End
    '-----------------------------------------------------
    Interrupt_ticker:
       Timer1 = Tmr_c_preload
    
       if mycount > 0 
       then 
           decr mycount 
           if mycount = 0
           then 
         	    Servo(1) = 60
           end if
       end if
       Return
    Prescale und Preload mußt du dir aus dem "$crystal = " ausrechnen.

    Btw:
    Du mußt übrigens Timer1 nehmen, weil Bascom timer0 für die Servos braucht.



    Ich hoff', das klappt


    EDIT: Bei Pin=0 MUSST du den Zähler zurücksetzen, sonst fetzt er dir ja vielleicht ins gerade-fahren rein.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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