Forum: Mikrocontroller und Digitale Elektronik Timer beim Tiny 25 CKDIV Fuse


von Steffen B. (Gast)


Lesenswert?

Hallo zusammen,

ich beschäftige mich gerade erstmalig mit der Timerprogrammierung und 
habe gewissse Verständnisschwierigkeiten. Ich habe schon das AVR-GCC 
gelesen und auch das datenblatt, komme aber nicht zum richtigen 
Verständnis.

Ich benutze einen AVR ATtiny 25 und möchte erst mal gerne wissen mit 
welcher Frequenz der interne Oszillator im Auslieferungszustand läuft. 
Im Datenblatt steht 2,7 - 5,5 V 0-8 MHz und 4,5 - 5,5 V 16 MHz.

1. Ich möchte den Tiny bei 5 Volt betreiben. Wie ist die Frequenz? 
Stellt er automatisch bei höherer Spannung auf die Größere Frequenz, 
oder muss ich ihm das noch sagen, wenn ja wo.

2. Die Fuses: Ich möchte nichts an den Fuses verändern, aber wie ist die 
CKDIV8 im Auslieferungsszustand eingestellt? Im Datenblatt steht etwas 
widersprüchliches:

... Note that the fuses are read as logical zero, “0”, if they are 
programmed...

weiter unten in der Tabelle:
... Fuse Low Byte | Bit No | Description Default | Value
... ---------------------------------------------------------------
... CKDIV8        |  7       Divide clock by 8   | 0 (unprogrammed)

Da steht 0 (unprogrammed), obwohl im Text was anderes steht. Außerdem 
ist der Rest der tabelle, wie im Text beschrieben, d.h. 0 (programmed) 
und 1 (unprogrammed)

Ich gehe davon aus, das der Klammerausdruck in der Tabelle falsch ist 
und (programmed) heißen soll!

In der Beschreibung der Default Werte steht: "The device is shipped with 
CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed."

Programmed heißt also 0 -> CKDIV8 = 0 bedeutet also CLKPS wird resetet 
zu "0011" - > bedeutet im Auslieferungszustand wird die CLK durch 8 
geteilt.

Betrieben mit 5 Volt bedeutet 16 MHz / 8 = 2MHz Taktfrequenz???

Im Forum habe ich auch keine ähnliche Frage gefunden mit 8/16 MHz! Stehe 
ich etwa auf dem Schlauch, weil alles so klar ist?

von Johannes M. (johnny-m)


Lesenswert?

In Abschnitt 7.3 im Datenblatt steht ganz eindeutig:
"The default clock source setting is therefore the Internal RC 
Oscillator running at 8 MHz with longest start-up time and an initial 
system clock prescaling of 8, resulting in 1.0 MHz system clock."
                              ^^^^^^^^^^^^^^^^^^^^

Das in der Tabelle im Datenblatt dürfte ein Fehler sein, der allerdings 
in meiner Version (12/06, ist wahrscheinlich nicht mehr ganz aktuell) 
nicht enthalten ist. Bei mir steht hinter CKDIV8 "0 (programmed)"...

Und nein, die Frequenz ist im Prinzip nicht von der Betriebsspannung 
abhängig, wenn man von der spannungsabhängigen Drift des internen 
RC-Oszillators absieht, die den entsprechenden Kennlinien im Datenblatt 
unter "Typical Characteristics" zu entnehmen ist.

EDIT:
Im aktuellen Datenblatt (1/08) ist es in Abschnitt 6.2.7 auf Seite 31. 
AUf Seite 153 bei den Fusebits steht aber auch korrekt "0 (programmed)" 
bei CKDIV8...

von Steffen B. (Gast)


Lesenswert?

In meinem Datenblatt (Version 11/07) steht es leider nicht mehr so 
eindeutig:

"The default clock source setting is therefore the Internal RC 
Oscillator running at 8 MHz with longest start-up time and an initial 
system clock prescaling of 8. This default setting ensures that all 
users can
make their desired clock source setting using an In-System or 
High-voltage Programmer."

Und auf Seite 1:
ATtiny25/45/85: 0 - 8 MHz @ 2.7 - 5.5V, 0 - 16 MHz @ 4.5 - 5.5V

Daher bin ich mir auch nicht so sicher.

Aber vielen Dank für Dein bemühen in Dein Datenblatt zu schauen. Jetzt 
weiß ich wenigstens das in der tabelle ein Fehler ist.

von Michael U. (amiga)


Lesenswert?

Hallo,

>Und auf Seite 1:
>ATtiny25/45/85: 0 - 8 MHz @ 2.7 - 5.5V, 0 - 16 MHz @ 4.5 - 5.5V

das sagt nur aus, das Atmel im Spannungsbereich 2,7V...5,5V garantiert, 
daß der AVR mit 0...8MHz getaktet werden kann und im BEreich 4,5V...5,5V 
eben von 0...16MHz.

Wo dieser Takt herkommt 8int. RC, ext. Clock, ext. Crystal, Ceramic 
Resonator) und wie hoch dieser tatsächlich ist, daß entscheidet der 
Anwender ja mit den Fuse-Einstellungen und damit, was er an den AVR 
anschließt.

Der Lieferzustand ist doch im ersten Abschnitt eindeutig angegeben:
internal RC, 8MHz, CLDIV programmiert, also :8 = 1MHz.

Damit funktioniert er in gesamten zulässigen Spannungsbereich erstmal 
und der User kann ihn dann per Fuse/ext. Beschaltung passend 
umprogrammieren.

Gruß aus Berlin
Michael

von Steffen B. (Gast)


Lesenswert?

Ok! Vielen Dank für Eure Klarstellung!

Ihr habt mir sehr geholfen.

von Steffen B. (Gast)


Lesenswert?

da fällt mir noch was ein, wie stelle ich den jetzt die F_CPU ein? Auf 8 
MHz oder schon auf 1 MHz?

von Karl H. (kbuchegg)


Lesenswert?

Steffen B. wrote:
> da fällt mir noch was ein, wie stelle ich den jetzt die F_CPU ein? Auf 8
> MHz oder schon auf 1 MHz?

1Mhz
Denn das ist ja die Taktrate mit der der µC wirklich arbeitet.
Wie diese Taktrate zustande kommt, ob da jetzt 8Mhz durch 8 geteilt
werden oder 100Mhz durch 100, interessiert den Programmierer
nicht weiter. Für den ist nur interessant: 1 Mio Prozessortakte
in der Sekunde.

von Steffen B. (Gast)


Lesenswert?

Ich habe jetzt die F_CPU eingestellt:
1
#define F_CPU 1000000   // 1 MHz

und bekomme ein warning: F_CPU redefined.

Ist das nur nice to know, ich weiß ja, dass ich sie geändert habe; oder 
sollte ich mir sorgen machen...

von Michael U. (amiga)


Lesenswert?

Hallo,

falls Du AVR-Studio mit WinAVR benutzt: schau mal unter Project -> 
Configuration Options -> general welcher Takt dort eingetragen ist.
Das scheint die erste F_CPU Zuweisung zu sein, wenn dort was drinsteht.

Man möge mich korrigieren, immernoch ASM-Programmierer aber im Moment 
mit dem Webserver von Ulrich Radig beschäftigt und der ist in C und hat 
meine Umbauten bisher irgendwie ohne Fehler und Warnings überstanden... 
;-)

Gruß aus Berlin
Michael

von Johannes M. (johnny-m)


Lesenswert?

Steffen B. wrote:
> Ich habe jetzt die F_CPU eingestellt:
>
>
1
#define F_CPU 1000000   // 1 MHz
>
> und bekomme ein warning: F_CPU redefined.
>
> Ist das nur nice to know, ich weiß ja, dass ich sie geändert habe; oder
> sollte ich mir sorgen machen...
Falls das nicht bekannt sein sollte: Du änderst damit sowieso nur das 
Makro F_CPU und nicht die CPU-Frequenz selber!

Wenn im Makefile nicht derselbe Wert wie oben steht, dann kann es 
passieren, dass unterschiedliche Funktionen mit unterschiedlichen Werten 
für F_CPU arbeiten. Mach die Einstellung von F_CPU also besser nur 
einmal (nämlich im Makefile bzw. den Configuration Options im 
AVRStudio) und mach sie v.a. korrekt , also so, dass die Einstellung 
auch mit dem übereinstimmt, was Du bei den Fuse Settings eingestellt 
hast. Sonst nützt das Ganze reichlich wenig.

Abgesehen davon sollte man, wenn überhaupt, schreiben
1
#define F_CPU 1000000UL

von Steffen B. (Gast)


Lesenswert?

>Falls das nicht bekannt sein sollte: Du änderst damit sowieso nur das
>Makro F_CPU und nicht die CPU-Frequenz selber!

Ja, das weiss ich.


>Wenn im Makefile nicht derselbe Wert wie oben steht, dann kann es
>passieren, dass unterschiedliche Funktionen mit unterschiedlichen Werten
>für F_CPU arbeiten.

Im Makefile ist der selbe Wert eingestellt

>[...] und mach sie v.a. korrekt , [...]
>Abgesehen davon sollte man, wenn überhaupt, schreiben
>
1
#define F_CPU 1000000UL
>

Das wars!!! Ich habe das "UL" vergessen hinzuschreiben. Nachdem ich das 
abgeändert habe, war der Fehler weg!

Ich bin so dankbar, dass es dieses Forum gibt. Als Anfänger ist und wird 
man immer gut beraten. Vor allem sieht man als Anfänger schon mal den 
Wald vor lauter Bäumen nicht mehr...

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.