Okay, ich versuche es einmal:Zitat von ProgDom
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.
Lesezeichen