Ich bin im Forum beim Suchen auf einen Beitrag gestoßen, der ein ganzes Projekt als Anhang beinhaltete. Davon erhoffte ich mir eigentlich zu lernen wie man die delay.h richtig einbindet. Allerdings taten sich da eher noch mehr fragen auf. Ich habe die c-Source Datei als Anhang eingefügt. Der Code ist Kommentiert, vom Autor . . . und von mir. Meine Frage und Rückschlüsse sind als Kommentar plus --> eingefügt. Vielleicht kann ja jemand mal reinschauen und die Antworten hinzufügen oder sie hier Posten. Grüße und Vielen Dank
Hallo 1. t_max = 262.14ms/F_CPU in MHz, heißt für 1 MHz 262,14ms, für 4,9512MHz 52,94ms, für 10MHz 26,214ms...! 2. Vorsicht mit dem Komma (31,25)! Der Dezimalstellentrennoperator ist der Punkt (also 31.25)! Im Kommentar ist es zwar egal, aber nicht, dass Du irgendwann auf die Idee kommst, so was an eine Funktion zu übergeben und Dich wunderst, warum es Fehlermeldungen hagelt. 3. Um eine Sekunde zu bekommen muss _delay_ms mehrfach ausgeführt werden. Deshalb wird hier t mit 32 multipliziert, um zu gewährleisten, dass auch bei höheren Taktfrequenzen (in diesem Falle ist das wohl für 8 MHz gemacht, t_max = 32,766ms) der Max.-Wert (siehe 1.) nicht überschritten wird. 4. Warum 1000/32 und nicht 31.25 übergeben wird, kann ich jetzt aus dem Stegreif nicht nachvollziehen. 1000/32 ist eine Integer-Division und ergibt als Wert 31 und nicht 31.25. Es müsste eigentlich heißen (1000/32.0) um dem Compiler mitzuteilen, dass hier nach float bzw. double gecastet werden soll. Vielleicht hat da jemand anderes eine Idee... Gruß Johnny
Wo kommen die 1000 her? Na ganz einfach: Eine Sekunde hat 1000 Millisekunden Und die 32? Fuer eine Sekunde wird durch den Klapperatismus davor ja dafür gesorgt, dass bei 1 Sekunde Wartezeit, die Schleife insgesammt 32 mal durchlaufen wird. Ein Schleifendurchlauf soll daher 1 Sekunde / 32 dauern oder aber in Millisekunden: 1000 / 32.0 Der Grund warum beim Bruch auf die Nachkommastellen verzichtet wird koennte sein: <Spekulation ein> Das Drumherum, also die Schleifensteuerung braucht ja auch etwas Zeit. Es koennte also sein, dass experimentell ermittelt wurde, dass eine Wartezeit von 31 mSek ausreicht um in Summe bei 32 Durchläufen auf 1 Sekunde Wartezeit zu kommen. </Spekulation ein>
Hatte ich zuerst auch vermutet. Kommen dann nur 992ms für 32 Zyklen raus. Kann mir aber nicht vorstellen, dass für die Schleifensteuerung 8ms vorgesehen sein sollen. Möglicherweise hat derjenige, der das geschrieben hat, einfach nicht daran gedacht?!? Kann ja jedem mal passieren... Daran, dass die float-Berechnung länger ist als die int-Berechnung kanns ja wohl nicht liegen, da bei richtig eingestellter Optimierung die Berechnung zur Laufzeit des Compilers durchgeführt wird und das Programm dadurch nicht größer werden sollte.
> Möglicherweise hat derjenige, der das > geschrieben hat, einfach nicht daran gedacht Ich würde mal sagen: Das ist die wahrscheinlichste Begründung.
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.