Die <util/delay.h>| ?????

OP #363658
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
Angehängte Dateien:
Gast #363659
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
#363660
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>
Gast #363661
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.

Antwort schreiben

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.

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.