www.mikrocontroller.net

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


Autor: Philipp K. (trace-bug)
Datum:
Angehängte Dateien:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Möglicherweise hat derjenige, der das
> geschrieben hat, einfach nicht daran gedacht

Ich würde mal sagen: Das ist die wahrscheinlichste
Begründung.

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.