mikrocontroller.net

Forum: Projekte & Code Delay: Exakt n Ticks erzeugen (avr-gcc)


Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi, zum Erzeugen exakter Verzögerungen hier ein Makro, das exakt die 
vorgegebene Anzahl von Ticks zur Ausführung braucht.

Dies beinhaltet natürlich nicht die Zeit evtl. ISRs.

Erlaubt sind alle Konstanten <= 0x40000 (262144), wobei für Werte 
kleiner als 0 kein Code ausgegeben wird. Zeitmaschine gibt's erst 
nächstes Jahr :-)

Verwendung zB:
#include "exact-delay.h"

void foo (void)
{
    exact_delay (3);
}
verzögert genau 3 Ticks.

Viel Spaß beim Testen

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dies beinhaltet natürlich nicht die Zeit evtl. ISRs.

Was verstehst Du denn unter exakt?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Was verstehst Du denn unter exakt?

What you type is what you get :-)

Wenn du zB eine Verzögerung von 1000 Ticks haben willst, geht das evtl. 
über eine Verzögerungsschleife.

Bei 1001 Ticks geht das dann nicht mehr, weil man keine Schleife 
hinbekommt, deren Durchlaufzeit 1 Tick ist. Daher müssen nach der 
Schleife ne bestimmte Anzahl NOPs eingefügt werden.

Diese lästige Arbeit wird von den Makros übernommen.

Ausserdem funktionieren sie auch für kleine Verzögerungen wie 0, 1, 2, 
3, 4, ... ohne daß man sich den Kopf zerbrechen muss, wenn man den Delay 
ändern/anpassen will. Bei 1000 Ticks will man ja auch nicht 1000 NOPs im 
Code rumgammeln haben :-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, wenn ich 10 Takte Verzögerung haben möchte, und mir bei diesem 
"exakten" Verfahren ein Interrupt 1000 Takte daraus macht, ist mir nicht 
gedient.

Ein Vorschlag meinerseits wäre, per CLI/SEI das Timing besser 
einzuhalten. Andernfalls kann man auch for-next Schleifen verwenden, die 
dann genauso "exakte" Zeiten liefern. Bei 1000 Takten und mehr sind 
Timer die bessere Wahl.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist das, was es ist: eine Warteschleife. Und kein Design-Guide oder 
Tipp-Sammlung, wann welche Strategie eingesetzt werden sollte ;-)

Es ist einfach ein weiteres Teil in einem Werkzeugkasten. Nicht mehr, 
nicht weniger.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs noch etwas verbessert:

* Es geht jetzt auch für ältere Versionen der binutils
* Der erzeugte Code ist kürzer geworden:
  Ticks  | Anz. Befehle
---------+--------------- 
    <= 0 |      0
     1   |      1
     2   |      1
     3   |      2
     4   |      2
     5   |      3
     6   |      3
     7   |      4
     8   |      4
         +
     9   |      3
    10   |      4
    11   |      4
    12   |      3
    13   |      4
    14   |      4
    15   |      3
    16   |      4
    17   |      4
   ...   |    ...
   768   |      3 
   769   |      4 
   770   |      4 
         +
   771   |      5 
   772   |      6 
   773   |      4 
   774   |      5 
   775   |      5 
   776   |      6 
   777   |      4 
   ...   |    ...
0x40004  |      6

== EDIT ==
ARGL

Hatte eben nen Tippteufel im Post...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest du das ganze noch auf längere Delays erweitern? Dann hättest du 
damit nämlich eine bessere delay Funktion geschaffen, als das was der 
gcc mitliefert.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt K. wrote:
> Könntest du das ganze noch auf längere Delays erweitern?

hmmm... eigentlich wollte ich ja keine Monster-Makros schreiben...

Hab's erweitert auf ein Maximum von 0x5000007 = 83.886.087 Ticks.

Vielleich kann das auch mal jemand testen, der nen anderen Simulator als 
Brain 0.9 hat?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, ich werde es nachher mal an einem echten AVR nachmessen. 
83.886.087 Ticks sind rund 4s (bei 20MHz), das sollte eigentlich für 
alle Fälle ausreichen. Klar, für Verzögerungen größer als ein paar ms 
ist ein Timer sinnvoll, aber z.B. für eine Wartezeit bei einer Init 
reicht solch ein einfaches Delay. Und es ist schön, wenn diese eine 
Delay Funktion eben alles kann, von 1 Tick bis >4s, dann kann man diese 
universell einsetzen.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es mal im AVR-Studio mit 0x5000007 durchlaufen lassen. Stimmt 
exakt.
Danke für dieses nette Weihnachtsgeschenk.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, danke. Könntest du auch mal für ein paar kleinere Werte testen?

Ist blöd, ich weiß, weil der Wert ja konstant sein muss. Könnte man das 
Testen irgendwie automatisieren? zB mal Durchtesten für alle Werte 
0...1000?

Dazu müsste man AVR-Studio skripten können bzw. batch-Jobs laufen 
lassen.

Der Grund dafür ist, weil immer anderer Code generiert wird abhängig von 
der Verzögerung.

Daß es also für eine Verzögerung stimmt, heisst nicht automatisch, daß 
es auch für einen anderen Delay korrekt ist. Auch dann nicht, wenn der 
Delay kleiner ist.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung wie man in AVR-Studio skriptet.
Ich habe jetzt mal folgede Werte getestet und sie sind alle i.O.
1
5
10 bis und mit 50
100
500
1000
5000
10000
50000

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.