Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitproblem bei parallelem Servo
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 ?
$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
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.
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 !
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 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=181025#181025)
Jaja, der Tag war heut lang, ich habe gerade auch noch gemerkt, dass du den Servo-Timmer meinst, leider zu spät ^^
Nuja, deswegen bist du ja kein schlechter Mensch :D
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:
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 ????
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 :D
Ansonsten: hast du sonst noch etwas verändert, also z.B. den Takt ?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.