Hallo, ich will einen ATTiny45 z.B.mit 3,3V betreiben. Im Programm möchte ich gern _delay_ms(..) verwenden. Nun stelle ich mir die Frage, ob das _delay_ms() relativ/nahezu unabhängig von der Taktung ist, also ob bei 128kHZ genauso wie bei 8Mhz die Verzögerung entsteht (muss nicht extrem genau sein z.B. +-5%), oder muss ich da umrechnen? Über einen Tipp wäre ich sehr dankbar. Gruß Markus
klar ist es abhänig von der Taktung. Aus dem Grund musst auch auch F_CPU auf die Taktfrequenz setzen.
Warum denkst Du wird ein F_CPU benötigt wenn Du die delay.h einbindest ? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
mgolbs schrieb: > Nun stelle ich mir die Frage, ob das > _delay_ms() relativ/nahezu unabhängig von der Taktung ist, also ob bei > 128kHZ genauso wie bei 8Mhz die Verzögerung entsteht (muss nicht extrem > genau sein z.B. +-5%), oder muss ich da umrechnen? Das macht der Compiler für dich. Die Funktion _delay_ms() heißt "_delay_ms", weil sie als Argument die Zeit in Einheiten von ms erwartet und den Prozessor entsprechend lange durch Ausführung einer Programmschleife beschäftigt.
Aber nur wenn wie oben geschrieben F_CPU vor include delay.h angegeben wurde (idealerweise im Makefile / Projektoptionen) und Optimierung aktiviert wurde.
troll schrieb: > Aber nur wenn wie oben geschrieben F_CPU vor include delay.h angegeben > wurde ... und mit der tatsächlich verwendeten Taktfrequenz überein stimmt.
Hallo, danke für die vielen Antworten. Ich habe eigentlich alles so im Code wie beschrieben.
1 | // #define F_CPU 8000000UL
|
2 | #define F_CPU 128000UL // 128 kHz
|
3 | // http://www.mikrocontroller.net/topic/292629#new
|
4 | |
5 | // http://www.engbedded.com/fusecalc
|
6 | |
7 | /* fuer ATTiny 45*/
|
8 | #include <avr/io.h> |
9 | #include <util/delay.h> |
10 | #include <avr/interrupt.h> |
11 | #include <avr/sleep.h> |
Fuse sind gesetzt, 62 df ff. Irgend wie läuft das Programm etwa 4xschneller als erwartet. Lib ist die 1.7.1. Gilt _delay_ms(6000) für 6 Sekunden auch bei 128kHz? Gruß und Dank Markus
mgolbs schrieb: > // #define F_CPU 8000000UL > #define F_CPU 128000UL // 128 kHz 128kHz? > Fuse sind gesetzt, 62 df ff. http://www.engbedded.com/fusecalc Das ist aber die Standardkonfiguration ab Werk. Damit ist gesetzt 8Mhz interner Oszillator, CKDIV8 ist gesetzt. d.h. effektiv hat dein Tiny eine Taktfrequenz von 1Mhz und lass die 18kHz bleiben. Gerade für einen Neuling ist eine derart niedrige Taktfrequenz nicht sinnvoll und macht dir nur Probleme. Zb beim ISP Flashen.
Hallo, da sind mir die Fuse doch irgend wie wieder auf Standard gerutscht, warum auch immer (Schusslichkeit..). Hatte schon mal die 44 DF FF herausgesucht. Werde es damit noch einmal probieren. Das würde auch den Effekt erklären. Ich brauch die niedrigen Frequenzen (geringer Energieverbrauch) bei einer anderen Anwendung, und will es jetzt mit dieser schon mal zum laufen bekommen. Gruß und Dank Markus
mgolbs schrieb: > Ich brauch die niedrigen Frequenzen (geringer > Energieverbrauch) bei einer anderen Anwendung, und will es jetzt mit > dieser schon mal zum laufen bekommen. Ok, Das heißt wir werden demnächst wieder von dir hören. Dann mit der Frage: warum kann ich meinen µC nicht mehr flashen?
mgolbs schrieb: > Irgend wie läuft das Programm etwa 4xschneller als erwartet. Lib ist die > 1.7.1. Zitat aus dem AVR-GCC-Tutorial: Die _delay_ms() und die _delay_us aus avr-libc 1.7.0 sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei... Sicher dass deine 1.7.1er Version schon gefixt ist?
Hallo, danke für die Hinweise. Das mit den 4x schneller liegt wohl wirklich an der nicht wie gewollt gestellten Fuse. Ich bin damit nicht mit 128kHz unterwegs, sondern wie von Karl Heinz Buchegger geschrieben wohl noch mit 1MHz. An den delay.h Fehler hatte ich anfänglich auch gedacht. Wobei zwischen 128kHz und 1MHz mehr als Faktor 4 liegt.? Ich werde erst einmal die Fuse wie gewünscht setzen nicht wie aktuell 62 df ff sondern dann 44 DF FF Das Problem mit dem Flashen ist mir bewusst, habe schon in dieser Richtung im Netz gelesen. Machbar sollten die 128kHz zum Flashen doch sein? Ich habe neben dem STK500 noch zwei weitere Programmer. Derzeit nutze ich arvdude an ttyS0, nativ. Mit avrdude, dem Atmel Studio 4 oder 5 bzw. Ponyprog oder einem anderen Tool muss das doch irgend wie gehen, ob nun unter Linux oder Windows? Kann man beim avrdude nicht was mit -b bzw. -B einstellen, um die Übertragungsgeschwindigkeit zu reduzieren? Wie weit runter kommt man damit? Gruß und Dank Markus
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.