Hallo liebe Leute! Mal eine Verständnisfrage zu der _delay_ms()-Funktion. Warum ist 44 % meines Speichers vom µC voll, wenn ich die Funktion verwende. Muss ich da noch was beachten, oder mache ich was falsch??? Danke!
Hallo. Das Argument muss zur Kompilierzeit vorliegen. Ein Aufruf von _delay_ms(2.5); wird zu einer Schleife optimiert. Rufst du die Funktion mit einer Variablen auf, z.B. float time=PINB/10.0; _delay_ms(time); werden dementsprechend float-Berechnungen durchgeführt. Aber das steht auch in der Doku dazu. Gruß Marco
ja, mag sein, aber warum ist dann der Speicher voll? Das kanns doch nicht sein, dass ich mit 3mal aufrufen von der Funktion meinen Speicher voll habe?!Es muss doch eine Platzsparende Alternative geben, um nicht umständlich die Timer zu setzen oder?!
Hast Du die Optimierung eingeschaltet? Wenn nicht, dann hol das bitte nach. Und wie von Marco schon angedeutet: Das ganze funktioniert nur dann, wenn das Argument konstant und zur Compilerlaufzeit bekannt ist. Die Funktion arbeitet ansonsten im Programm mit double-Werten und das zieht automatisch die Einbindung der float-Bibliothek nach sich. Und die braucht richtig viel Speicher.
Aber wie soll ich dann konkret vorgehen, wenn ich doch einfach nur eine Verzögerung von beispielsweise 50 ms in meinem Programm haben möchte.?!
> Aber wie soll ich dann konkret vorgehen...
Die Optimierung einschalten (sinnvollerweise -Os) und im Programm
_delay_ms(50) schreiben. Das geht allerdings so nur bei CPU-Frequenzen
unter ca. 5 MHz. Bei höheren Frequenzen musst Du Dir mit
mehrfach-Aufrufen behelfen, da die _delay_xx-Funktionen in Abhängigkeit
von der CPU-Frequenz begrenzt sind (also bei 8 MHz z.B. 2 mal
hintereinander _delay_ms(25) aufrufen). Die maximale Verzögerung mit
_delay_ms() ist
also z.B. ca. 32,76 ms bei 8 MHz
Ja vom speicher wird wohl der Timer am wenigsten brauchen, aber mir ist das zu umständlich mit dem Prescaler und daraus dann z.b. eine Sekunde zu errechnen, zumindest bei kleineren Programmen. Und diese Optimierung reduziert den Speicherbedarf? Was ist die Optimierung eigentlich?
M@cFreak wrote: > Ja vom speicher wird wohl der Timer am wenigsten brauchen, aber mir > ist das zu umständlich mit dem Prescaler und daraus dann z.b. eine > Sekunde zu errechnen, zumindest bei kleineren Programmen. Du solltest dir vermutlich einen anderen Job suchen, als Controller zu programmieren. Wenn dir schon die paar Befehle zum Anwerfen eines Timers zu viel sind, was willst du dann je mehr als einen LED-Blinker damit bauen können? Der gängige Weg für sowas ist übrigens eine Art `heartbeat'-Timer, der via Interrupt in regelmäßigen Intervallen zuschlägt (1 ms, 10 ms, was auch immer man braucht). An den hängt man dann alle seine zeitbezogenen Ereignisse dran: LED-Blinken, Tastenentprellung, ... Das schreibt man sich ein einziges Mal und benutzt es dann mehr oder weniger modifiziert in jedem seiner Projekte wieder. Hat ganz nebenbei den Effekt, dass man in den Pausen den Prozessor schlafen legen kann, statt dass der umständlich irgendwelche Register zählen darf, nur weil sein Programmierer ein bisschen denkfaul war. > Und diese Optimierung reduziert den Speicherbedarf? Ja. > Was ist die Optimierung eigentlich? Bitte frage Wikipedia oder ein gutes Lexikon, wenn du wirklich nicht weißt, was Optimierung bedeutet. [edit]Stefan war schneller...[/edit]
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.