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 ?
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
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.
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