Forum: Mikrocontroller und Digitale Elektronik Frage zur „eigenen“ delay-Funktion


von Sven (Gast)


Lesenswert?

Ich finde hier im Forum immer wieder eigens gebaute delay-Funktionen. 
Die Idee finde ich eigentlich richtig gut. Ich würde so etwas auch gerne 
bei mir einbauen.
Jetzt ist meine Frage wie ich denn so etwas genau messen kann.

Wenn ich jetzt z.B. diese Funktion nehme, wie errechnet sich der GENAU 
delay-Wert?

/**/
void delay(unsigned int time) {
  unsigned long j;

  for (j=0; j<time*10; j++)
    asm volatile ("nop");
}
/**/

------

Funktionsaufruf:

Delay(10);

------

Es ist mir schon klar das es erst mal auf den verwendete Quarz an kommt 
aber ich weiß nicht wie viele Zyklen die obige Funktion jetzt genau 
benötigt!

Gibt es da eine Art Formel?

Ich wäre über eine Antwort sehr dankbar!!

Grüße, Sven

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du kannst das aus dem Disassemblerlisting herausfinden, indem du die 
Taktzyklenzahl für die einzelnen Befehle aufaddierst. Du wirst 
entdecken, dass es eine Grundlaufzeit gibt (quasi der Fall time = 0) und 
einen Teil, der proportional zur Anzahl der Schleifendurchläufe (time) 
ist.

Statt dem Abzählen "von hand zu Fuss" kannst du auch den Zyklenzähler 
oder die Stopuhr im Simulator von AVR Studio benutzen, um die Laufzeit 
deiner Delay-Funktion bei verschiedenen Parametern zu ermitteln. Wenn du 
eine Auftragung Laufzeit gegen Wert von time machst, wird keine Gerade 
herauskommen, allerdings nähert sich die Messkurve der Gerade umso mehr, 
je grösser time ist.

von Daniel F. (df311)


Lesenswert?

jag den code mit option "-S" durch den gcc, schau dir den assembler-code 
für die funktion an und rechne die ausführungsdauer der einzelnen 
befehle zusammen (-> befehlssatz).
mit der anzahl der nötigen zyklen für die abarbeitung der funktion und 
der taktfrequenz des uC kannst du dann die ausführungszeit für dein 
delay berechnen.

die vorgehensweise ist auch im avr-asm-tutorial, abschnitt lcd 
beschrieben.

EDIT - zu spät ;-(

von Peter D. (peda)


Lesenswert?

Sven wrote:
> Ich finde hier im Forum immer wieder eigens gebaute delay-Funktionen.
> Die Idee finde ich eigentlich richtig gut.

Und ich finde die Idee sehr schlecht.

Wenn der Compiler fertige Funktionen hat, dann sollte man denen 
unbedingt den Vorzug geben.
Wenn nicht, dann sollte man den Timer nehmen, um sich sowas zu basteln, 
das ist dann weitgehend compilerunabhängig.


> Jetzt ist meine Frage wie ich denn so etwas genau messen kann.

Ja, genau das ist der Punkt, nämlich garnicht.
Du begibst Dich immer in Abhängigkeiten vom Compiler (Versionen, 
Optionen usw.).


> Es ist mir schon klar das es erst mal auf den verwendete Quarz an kommt
> aber ich weiß nicht wie viele Zyklen die obige Funktion jetzt genau
> benötigt!
>
> Gibt es da eine Art Formel?

Nein, die gibt es nicht.
Daher nimm die Bibliothek und laß das hacken sein.
Es sei denn, Du willst Dich ständig damit rumärgern.


Es soll ja Leute geben, die machen derartiges Trial&Error mit nem 
Portpin und Oszi zum Zeit messen.
Diese haben die Bezeichnung Programmierer nicht verdient, das sind nur 
Hacker.


Peter

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.