PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitproblem bei parallelem Servo



ProgDom
07.08.2006, 18:26
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

Hanni
07.08.2006, 19:00
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.

ProgDom
07.08.2006, 19:29
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 !

Hanni
07.08.2006, 19:53
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)

ProgDom
07.08.2006, 19:57
Jaja, der Tag war heut lang, ich habe gerade auch noch gemerkt, dass du den Servo-Timmer meinst, leider zu spät ^^

Hanni
07.08.2006, 19:59
Nuja, deswegen bist du ja kein schlechter Mensch :D

ProgDom
07.08.2006, 20:15
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 ????

Hanni
07.08.2006, 20:59
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 ?