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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.