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?
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...
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.
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
Ok! Vielen Dank für Eure Klarstellung! Ihr habt mir sehr geholfen.
da fällt mir noch was ein, wie stelle ich den jetzt die F_CPU ein? Auf 8 MHz oder schon auf 1 MHz?
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.
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...
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
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
|
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.