Forum: Compiler & IDEs _delay_ms(..) abhängig von ATTiny Taktung?


von mgolbs (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

klar ist es abhänig von der Taktung.  Aus dem Grund musst auch auch 
F_CPU auf die Taktfrequenz setzen.

von kopfkratzer (Gast)


Lesenswert?

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

von del (Gast)


Lesenswert?

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.

von troll (Gast)


Lesenswert?

Aber nur wenn wie oben geschrieben F_CPU vor include delay.h angegeben 
wurde (idealerweise im Makefile / Projektoptionen) und Optimierung 
aktiviert wurde.

von del (Gast)


Lesenswert?

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.

von mgolbs (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von mgolbs (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Εrnst B. (ernst)


Lesenswert?

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?

von mgolbs (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.