mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warteschleife aus Zyklenzahl generieren.


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.