mikrocontroller.net

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


Autor: Sven (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Daniel F. (df311)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.