Frage zur „eigenen“ delay-Funktion

Gast #929136
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
Persönliche Seite
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.
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 ;-(
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.