Forum: Mikrocontroller und Digitale Elektronik Warteschleife aus Zyklenzahl generieren.


von Jan (Gast)


Lesenswert?

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)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Jan (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Irgendwas sagt mir, dass du mit einem Timer wesentlich besser bedient 
bist, als mit einer Warteschleife.

von Jan (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.