Archiv verlassen und diese Seite im Standarddesign anzeigen : präziese Warteschleife
Gibt es eigentlich eine Möglichkeit in Bascom Wartezeiten von 300 - 1000 µs genau abzumessen? Mit Waitus scheint dies nicht zu funktionieren und schon gar nicht, wenn man noch andere Interrupts hat.
Ich hab versucht mir mit einem Timer selbst eine Wait Funktion zu schreiben, aber habe keinen großen Erfolg gehabt, da alleine das inkrementieren von Variablen in der Warteschleife zu viiiel zu großen ungenauigkeiten führt. Hab dann einfach in der Warte funktion eine Schleife gebaut die nur eine Variable mit dem Wert der zu wartenden µs dekrementiert, damit kriege ich immerhin die Wartezeit auf ~33 µs genau abgemessen, aber das ist mir zu ungenau. Außerdem funktioniert das auch nicht mehr, wenn die interrupts anders kommen.
Es geht darum die Wartezeit zwischen den einzelnen Schritten eines Schrittmotors genau hinzubekommen, damit ich die Geschwindigkeit berechnen kann.
Ich bin mir nicht sicher, aber ich wage zu behaupten, dass wenn Interrupts auftreten, und zwar unbestimmt lang und zu irgenteiner Zeit, du es nicht genauer hinkriegst, wie oben beschrieben. Ohne Interrupts sieht die Sache anders aus...aber mit glaub ich nicht, dass man es so genau hinkriegst, wie dus haben willst.
Werner_Just
09.11.2005, 17:19
Hallo Static,
dürfte kein größeres Problem sein. Du musst das nur so realisieren, das die AVR-Hardware das alleine, also möglichst ohne Software-Unterstützung macht.
Also z.B. die Compare Funktion von Timer 1 verwenden, oder Timer1 so vorbesetzen, das der Timer nach der geforderten Zeit einen Overflow-Interrupt auslöst. Die Zeit für den Interruptaufruf ist konstant, die kannst Du also vorher abziehen.
Einzig Du must sicherstellen, das der AVR beim erreichen der gewählten Zeit nicht mit einem anderen Interupt beschäftigt ist.
> Ich hab versucht mir mit einem Timer selbst eine Wait Funktion zu
> schreiben, aber habe keinen großen Erfolg gehabt, da alleine das
> inkrementieren von Variablen in der Warteschleife zu viiiel zu großen
> ungenauigkeiten führt.
bei 300 bis 1000 µs eine Variable hochzählen? 1000µs passen selbst bei 16 MHz Takt problemlos in Timer 1.
> Es geht darum die Wartezeit zwischen den einzelnen Schritten eines
> Schrittmotors genau hinzubekommen, damit ich die Geschwindigkeit
> berechnen kann.
Dann würde ich die Compare-Variante wählen. Hierbei kannst Du den Timer gleich auch den Portpin zur Schittmotoransteuerung bedienen lassen.
Das lässt sich soweit in die Hardware-Funktionen packen, daß Du nur noch die Frequenz vorgibst, das exakte Recheck-Signal dazu erzeugt rein die Hardware. Das dürfte also nichmal durch andere Interrupts aus dem Tritt gebracht werden. Die Genauigkeit dürfte dabei bei 1-2 Takten liegen. Also bei +- 0,13µs bei 16 MHz Prozessortakt.
'nen fertigen Code hab ich leider nicht dazu. Auch ausprobiert hab ich es nicht. Aber vom prizipellen Ablauf her ...
Schrittmotorsteuerung an OC1A Pin
CONFIG TIMER1 = TIMER
PRESCALE= 1
CLEAR TIMER = 1
COMPARE A = TOGGLE
und dann mit
Compare1a = W
die benötigte Zeit in Timer1 laden.
Da ich es selbst nicht ausprobiert habe, keine Gewähr das da nicht noch diverse Fallstricke drin versteckt sind. ;)
Viel Glück!
Ciao,
Werner
Werner_Just
10.11.2005, 10:35
Hallo,
Gestern abend mal nachgeschaut. Rowalt hat 'nen Beispiel zur exakten Frequenzerzeugung via OC1A in seinem Buch.
Das Programm enthält neben der Hardwarekonfiguration und dem Setzen des Compare Registers ganze zwei Zeilen Code
Do
Loop
Das mit den Fallstricken sollte sich also in Grenzen halten.
Ciao,
Werner
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.