Hallo. Ich habe mir dem Counter1 eines Atmega8 eine Zeitspanne gemessen und habe jetzt die Anzahl der Zyklen dieser Zeitspanne in 2 Registern. Ich hab versucht eine Warteschleife zu generieren die diese Zahl an Zyklen wartet, aber ich bekomms nicht hin. Wie muss eine Schleife aussehen, die genau (+-2 Zyklen) diese Anzahl an Zyklen wartet? (Warteschleife)
Eine solche Schleife gibt es nicht. Die minimal mögliche Zähl- schleife findest du in der avr-libc in <util/delay_basic.h> als _delay_loop_1(), und die braucht 3 Zyklen pro Durchlauf (einen für das Herunterzählen eines Registers und zwei für den bedingten Rücksprung). Wenn du schon einen Timer hast, warum nimmst du den dann nicht, um die exakte Verzögerung zu ermitteln?
Jan schrieb: > Ich hab versucht eine Warteschleife zu generieren die diese Zahl an > Zyklen wartet, aber ich bekomms nicht hin. Wie muss eine Schleife > aussehen, die genau (+-2 Zyklen) diese Anzahl an Zyklen wartet? > (Warteschleife) Kein Problem: Beitrag "Re: AVR: Delay 7 ... 65542 Zyklen" Wenns zyklusgenau sein soll, mußt Du natürlich auch sämtliche Interrupts sperren. Peter
@Peter: Danke, das hat geholfen, ich habe das Makro jetzt als Funktion für mich umgeschrieben, weil ich ja keine Konstanten übergebe, sondern eine 16Bit Zahl und 2 Registern.
Irgendwas sagt mir, dass du mit einem Timer wesentlich besser bedient bist, als mit einer Warteschleife.
Ich habe es auch mit einem Counter ausprobiert, der gestartet wird wenn gewartet werden soll und sich in seinem Output Compare Match Interupt dann selbst deaktiviert. Dort wo gewartet werden soll habe ich dann abgefragt ob der Counter aktiviert ist und bin erst weiter gegangen nachdem er sich selbst deaktiviert hat. Bei dieser Methode war der Code Aufwand wesentlich größer, da viel vom Counter konfiguriert werden musste. Außerdem befinde ich mich dort wo gewartet werden soll bereits in einem Interupt. Ich weiß zwar das verschachtelte Interupts möglich sind, aber im zweiten Interupt, also dem vom Counter bewirkte reti einen Sprung zum Interupt Vektor 0x000 (Reset) und nicht zurück in den Interupt der den Counter aufgerufen hat....warum auch immer, aber das war mir jetzt zuviel Arbeit herauszufinden was da schief lief. Außerdem soll im fertigen Programm diese Funktion nur alle paar Minuten aufgerufen werden, insofern kann ich mir die aktive Wartefunktion schon erlauben und ich sehe auch keine andere Möglichkeit nicht aktiv zu warten. wie oben beschrieben soll nach dem Warten bestimmter zeitlich Abhängiger Code ausgeführt werden. Wenn ich diesen Code in den Interupt vom Counter packen würde, wäre der Code Aufwand noch größer und ich bräuchte Speicher über den Aufruf des Counters hinweg, damit er sich in der Zeit orientieren kann (Es geht um Abtastung eines Signals, allerdings aperiodisch).
Um genau n Ticks zu warten (auch 0 oder 1 oder ...) kannst du diese Assembler-Makros zusammen mit avr-gcc bzw. avr-as verwenden: Beitrag "Delay: Exakt n Ticks erzeugen (avr-gcc)" Das geht allerdings nur dann, wenn n zur Compilezeit bekannt ist. Johann
Jan schrieb: > Außerdem befinde ich mich dort wo > gewartet werden soll bereits in einem Interupt. Erste Programmierregel bei Mikrocontrollern: Interrupts nie warten/blockieren lassen!
Johann L. schrieb:
> Das geht allerdings nur dann, wenn n zur Compilezeit bekannt ist.
Da es sich ja um einen Meßwert handelt, können den nur Hellseher zur
Compilezeit wissen.
Peter
Peter Dannegger schrieb: > Johann L. schrieb: >> Das geht allerdings nur dann, wenn n zur Compilezeit bekannt ist. > > Da es sich ja um einen Meßwert handelt, können den nur Hellseher zur > Compilezeit wissen. > > Peter Es gibt auch eine Version für Zyklenzahlen, die nicht zur Compilezeit bekannt sind. Dann allerdings muss eine gewisse Mindestanzahl an Zyklen vorhanden sein, damit das Ergebnis exakt ist (sind glaub um die 20). Liegt die Zyklenzahl darunter, geht Genauigkeit verloren, was wohl jedem einleuchtet ;-) Die Mächtigkeit der Assembler-Makros hat man natürlich auch in dem Fall verfügbar. Mit Assembler-Makros kann man wesentlich mehr formulieren als mit dem C-Präprozessor. Johann
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.