Hallo. Ich habe mal eine Frage zum Delay. Habe mir die anderen Beiträge auch schon durchgeschaut aber keine Lösung auf mein Problem gefunden. ich habe die delay.h eingebunden (in ihr sind 2 Funktionen heissen irgendwie so _delay_loop_1 und _delay_loop_2. ). Allerdings wenn ich nun eine dieser Funktionen aufrufe (z.B. mit 10000), dann passiert überhaupt nix. Muss in in irgendwelchen Headern noch was setzen oder wie ist das zu erklären?
_delay_loop_1 ist nicht in der Lage, einen Wert von "10000" zu verarbeiten, maximal 255. _delay_loop_2 kann bis 65535. Die Doku der avr-libc enthält seit neuestem auch ein bißchen Text über diese beiden Funktionen (ja, sie sind auch in der neuen avr-libc implementiert und es gibt noch zwei zusätzliche).
Hmmm, ich sehe gerade, dass der Zeitraum des delays dort in "Zyklen" angegeben ist. Gibt es auch eine Möglichkeit, das ganze in ms anzugeben? Was mache ich denn ich z.B. 1000 ms, also 1 Sekunde, warten will?
Vorher ausrechnen, wieviele Zyklen eine Millisekunde sind. Das hängt vom Prozessortakt ab. Alternative: Timer verwenden.
Ich verweise ja nicht umsonst auf die Doku... Hättest Du die gelesen, könntest Du diese Frage selber beantworten! --8<-- zu _delay_loop_1: Delay loop using an 8-bit counter __count, so up to 256 iterations are possible. (The value 256 would have to be passed as 0.) The loop executes three CPU cycles per iteration, not including the overhead the compiler needs to setup the counter register. Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be achieved. -->8--
Außerdem: neueste Doku lesen. ;-) _inline_ void _delay_ms (double __ms) Perform a delay of __ms milliseconds, using _delay_loop_2(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). The maximal possible delay is 262.14 ms / F_CPU in MHz.
ja das habe ich mir auch schon durchgelesen.... aber erstens finde ich keine funktion _delay_ms, und zweitens will ich eventuell zumindest testweise delays von > 1000 ms erreichen. Gruß Sebastian
> aber erstens finde ich keine funktion _delay_ms Vielleicht ist deine Bibliotheksversion zu alt? Das ist neu in 1.2.x. Im GCC-Forum von http://www.avrfreaks.net/ gibt's ein Announcment für eine private Portierung von avr-libc 1.2.1 für WinAVR (zum Drüberinstallieren). > zweitens will ich eventuell zumindest testweise delays von > 1000 ms > erreichen Dann lies dir bitte zuerst mal die Kommentare dafür durch: spin-loop delays (also eine Schleife, die einfach nur die CPU beschäftigt) sind für sehr kurze Verzögerungen geeignet. Alles andere macht man mit einem Timer, dafür sind die da. Danach kannst du es ja immer noch mit Selbst-drüber-Nachdenken probieren ;-) und einfach noch eine äußere Schleife drumrumwickeln, wenn du's partout mit einem delay statt einem Timer machen willst.
Hallo, Bisher wurde ja immer SYSCLK für die Taktfrequenz verwendet. Ist auch noch so in dem TWI Beispiel von Jörg. Warum wird nun noch F_CPU eingeführt? Gruß Frank
SYSCLK war meine private Erfindung, F_CPU schien mir eher der Konsens vieler Leute zu sein. Aber du hast Recht, ich sollte das twidemo auch ändern. Da ich gerade nicht dazu komme, das sofort zu tun: kannst du bitte einen Bugreport aufmachen, damit es nicht in Vergessenheit gerät?
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.