Forum: Compiler & IDEs Die <util/delay.h>| ?????


von Philipp K. (trace-bug)


Angehängte Dateien:

Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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>

von johnny.m (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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