Forum: Mikrocontroller und Digitale Elektronik ATTiny85 maximalen internen Clock setzen?


von Squizzy (Gast)


Lesenswert?

Ich habe mal eine Verständnisfrage zu den Fuses beim ATTiny85. Laut 
diverser Internettutorials kann man diesen auf einem internen Takt von 
16,5 MHz laufen lassen, wenn man diese Fuses verwendet:

http://eleccelerator.com/fusecalc/fusecalc.php?chip=attiny85&LOW=E1&HIGH=DD&EXTENDED=FE&LOCKBIT=2C

Meine Frage: wie geht das? Ich sehe da zwar was von einem PLL-Clock, 
aber keinen zugehörigen Wert. Und bei den "LOW Fuse Presets" kann ich 
ansonsten nur interne 8 MHz auswählen, von 16,5 MHz weit und breit keine 
Spur. Also wo soll diese Frequenz herkommen, wenn kein externer Quarz 
vorhanden ist?

von S. Landolt (Gast)


Lesenswert?

> diverser Internettutorials

Die erste Quelle sollte das Datenblatt sein, und dort findet sich unter 
'Clock Sources' der Unterpunkt 'High Frequency PLL Clock'. Damit müsste 
alles klar sein.
  Ergänzen ließe sich allenfalls, dass man durch Verändern von OSCCAL 
noch höher als die 16.0 MHz (8.0 * 8 / 4) kommt, dies ist allerdings 
'not recommended'.

von spess53 (Gast)


Lesenswert?


von Andreas B. (bitverdreher)


Lesenswert?

Datenblatt lesen hilft.
Unter "6.1.5 Internal PLL for Fast Peripheral Clock Generation - clk 
PCK":
steht da z.B.
The internal PLL is enabled when:
• The PLLE bit in the register PLLCSR is set.
• The CKSEL fuse is programmed to ‘0001’.
• The CKSEL fuse is programmed to ‘0011’.

von HildeK (Gast)


Lesenswert?

Squizzy schrieb:
> Also wo soll diese Frequenz herkommen, wenn kein externer Quarz
> vorhanden ist?

Vom internen Oszillator, der mit 8MHz läuft und dann durch Zuschalten 
der PLL verdoppelt wird.
Die richtigen Fuses habe ich jetzt nicht parat, aber es müssten CLKSEL 
und SUT sein. E1 für die LowFuse passt jedenfalls auch für den Tiny861, 
den ich gerade im STK500 stecken habe.

von Squizzy (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> http://ww1.microchip.com/downloads/en/DeviceDoc/At...
>
> Kapitel 6 ab S.23
>
> MfG Spess

Genau da komme ich aber nicht weiter. Die Beschreibung vom Link sagt:

"The internal PLL is enabled when:
• The PLLE bit in the register PLLCSR is set.
• The CKSEL fuse is programmed to ‘0001’.
• The CKSEL fuse is programmed to ‘0011’. "

Wenn ich CKSEL0 und CKSEL1 in dem Fuse-Calculator aber auf 1 setze, 
steht dort was von "Ext. Crystal Osc" - also genau das Gegenteil von 
einem internen Clock!?

von HildeK (Gast)


Lesenswert?

Squizzy schrieb:
> Wenn ich CKSEL0 und CKSEL1 in dem Fuse-Calculator aber auf 1 setze,
> steht dort was von "Ext. Crystal Osc" - also genau das Gegenteil von
> einem internen Clock!?

Du weißt schon, dass eine Fuse mit '0' als programmiert gilt?

von Andreas B. (bitverdreher)


Lesenswert?

Ein gesetztes Fuse ist 0. Dieser Fuse calculator macht eine 0 aus diesem 
Häkchen

: Bearbeitet durch User
von Squizzy (Gast)


Lesenswert?

Andreas B. schrieb:
> Ein gesetztes Fuse ist 0. Dieser Fuse calculator macht ein Häkchen aus
> dieser 0

OK, das macht es jetzt nicht einfacher: Das Manual schreibt was von 
CKSEL=0001 - muss ich statt dessen tatsächlich 1110 setzen? Warum zum 
Geier werden die Bits nicht so beschrieben, wie sie gesetzt werden 
müssen sondern gerade umgekehrt?

von Andreas B. (bitverdreher)


Lesenswert?

Wenn im DB steht, da gehört eine 1 rein, dann ist das auch so gemeint.

0 heißt: Diese Option ist gesetzt. Im Fuse calculator steht dafür ein 
Häkchen. Schau Dir doch mal an, welche Bits im Fuse calculator gesetzt 
werden wenn Du ein Häkchen setzt.

von HildeK (Gast)


Lesenswert?

Squizzy schrieb:
> Warum zum
> Geier werden die Bits nicht so beschrieben, wie sie gesetzt werden
> müssen sondern gerade umgekehrt?

Naja, weil eine gelöschte EE-Zelle halt 0xFF enthält. Dass man das 
Programmieren eines Bits als 'Setzen' bezeichnet und es dabei zu '0' 
wird, ist vermutlich dieser Tatsache geschuldet - und hat möglicherweise 
sogar historische Gründe.

von Squizzy (Gast)


Lesenswert?

OK, ich fürchte ich bin maximal verwirrt. Wenn ich LFuse auf 0xE1 setze, 
dann sind CKSEL1, CKSEL1 und CKSEL2 gesetzt - richtig?

Weiterhin habe ich dann den internen Taktgenerator gesetzt, richtig?

Wenn beides stimmt: welche Clock-Frequenz nutzt der ATTiny85 dann genau?

von Squizzy (Gast)


Lesenswert?

...ich meinte natürlich CKSEL1, CKSEL2 und CKSEL3 sind gesetzt...

von Andreas B. (bitverdreher)


Lesenswert?

DB Seite 25, Table 6-1. : High Frequency PLL Clock (see page 26)
mit Verweis auf Seite 26: external clock.

Sprich, wenn Du den PLL clock mit internen Takt verwenden willst, geht 
das nicht (nur) über die Fuses. Du mußt das PLLE Bit setzen.

: Bearbeitet durch User
von Squizzy (Gast)


Lesenswert?

Ähm ja, ich habe eben KEINEN externen Clock!

von S. Landolt (Gast)


Lesenswert?

> Sprich, wenn Du den PLL clock mit internen Takt verwenden willst,
> geht das nicht (nur) über die Fuses. Du mußt das PLLE Bit setzen.

Das PLLE-Bit wird automatisch gesetzt bei entsprechendem Fuse-Low-Byte: 
"If
PLL is selected as a system clock source the value for this bit is 
always 1"

von Andreas B. (bitverdreher)


Lesenswert?

S. Landolt schrieb:
>> Sprich, wenn Du den PLL clock mit internen Takt verwenden willst,
>> geht das nicht (nur) über die Fuses. Du mußt das PLLE Bit setzen.
>
> Das PLLE-Bit wird automatisch gesetzt bei entsprechendem Fuse-Low-Byte:
> "If
> PLL is selected as a system clock source the value for this bit is
> always 1"

PLL über die fuses zu setzen, geht aber nur mit externen Takt. Deshalb 
hat er sich den Tiny jetzt zerschossen. Siehe 
Beitrag "ATTiny85 - Fuses zurücksetzen?"

von S. Landolt (Gast)


Lesenswert?

> PLL über die fuses zu setzen, geht aber nur mit externen Takt.

Das kann ich nicht bestätigen!

von GustavG (Gast)


Lesenswert?

Squizzy schrieb:
> OK, ich fürchte ich bin maximal verwirrt. Wenn ich LFuse auf 0xE1 setze,
> dann sind CKSEL1, CKSEL1 und CKSEL2 gesetzt - richtig?

Nein. Gesetzt ohne Angabe auf welchen Wert heißt im Allgemeinen auf 1 
gesetzt. Mit 0xE1 wird CKSEL1, CKSEL2 und CKSEL3 auf 0 gebracht und 
CKSEL0 auf 1 gesetzt.

Das entspricht der Datenblatt Einstellung für 16MHz System clock der 
über PLL aus dem internen 8MHz Oszillator abgeleitet wird. Mit 0xE1 wird 
auch die CKDIV8 Fuse auf 1 gesetzt. Also auf unprogrammed gesetzt und 
damit werden die  16MHz nicht nochmal durch 8 geteilt. Es bleibt bei den 
16MHz.

Datenblatt:
6.2.2 High Frequency PLL Clock
There is an internal PLL that provides nominally 64 MHz clock rate 
locked to the RC Oscillator for the use of the
Peripheral Timer/Counter1 and for the system clock source. When selected 
as a system clock source, by programming the CKSEL fuses to ‘0001’, it 
is divided by four like shown in Table 6-4.


> Weiterhin habe ich dann den internen Taktgenerator gesetzt, richtig?

Richtig!

> Wenn beides stimmt: welche Clock-Frequenz nutzt der ATTiny85 dann genau?

16MHz

von Andreas B. (bitverdreher)


Lesenswert?

S. Landolt schrieb:
>> PLL über die fuses zu setzen, geht aber nur mit externen Takt.
>
> Das kann ich nicht bestätigen!

Stimmt, da habe ich mich verguckt. Siehe auch den Beitrag von GustavG, 
dem ich zustimme.

Da muß der TO wohl etwas anderes vergeigt haben.

von M. K. (sylaina)


Lesenswert?

Datenblatt lesen ist anscheinend sowas von aus der Mode wenn nicht mal 
klar ist, dass ein Fuse-Bit, dass den Wert 0 enthält, als gesetzt 
gilt...

von GustavG (Gast)


Lesenswert?

M. K. schrieb:
> Datenblatt lesen ist anscheinend sowas von aus der Mode wenn nicht mal
> klar ist, dass ein Fuse-Bit, dass den Wert 0 enthält, als gesetzt
> gilt...

Dann zitiere mal die Stelle aus dem ATTiny25/45/85 Datenblatt aus dem 
hervorgeht, daß ein Fuse Bit mit Wert 0 als gesetzt gilt. Ich finde da 
immer nur, daß es als "programmed" gilt.

von M. K. (sylaina)


Lesenswert?

GustavG schrieb:
> Ich finde da
> immer nur, daß es als "programmed" gilt.

Ja, aber damit hast du ja die Stelle schon gefunden, was soll ich dir 
denn dazu noch raus suchen?

von GustavG (Gast)


Lesenswert?

GustavG schrieb:
> M. K. schrieb:
>> Datenblatt lesen ist anscheinend sowas von aus der Mode wenn nicht mal
>> klar ist, dass ein Fuse-Bit, dass den Wert 0 enthält, als gesetzt
>> gilt...
>
> Dann zitiere mal die Stelle aus dem ATTiny25/45/85 Datenblatt aus dem
> hervorgeht, daß ein Fuse Bit mit Wert 0 als gesetzt gilt. Ich finde da
> immer nur, daß es als "programmed" gilt.


M. K. schrieb:
> GustavG schrieb:
>> Ich finde da
>> immer nur, daß es als "programmed" gilt.
>
> Ja, aber damit hast du ja die Stelle schon gefunden, was soll ich dir
> denn dazu noch raus suchen?

Wenn du nicht zwischen Bit gesetzt und Bit programmed unterscheiden 
kannst, hat es keinen Sinn sich mit dir auszutauschen.

von M. K. (sylaina)


Lesenswert?

GustavG schrieb:
> Wenn du nicht zwischen Bit gesetzt und Bit programmed unterscheiden
> kannst, hat es keinen Sinn sich mit dir auszutauschen.

Wenn du mit "Bit gesetzt" implizierst, dass der Wert des Bits dann 1 
ist, hat es keinen Sinn sich mit dir auszutauschen ;)

von HildeK (Gast)


Lesenswert?

GustavG schrieb:
> Dann zitiere mal die Stelle aus dem ATTiny25/45/85 Datenblatt aus dem
> hervorgeht, daß ein Fuse Bit mit Wert 0 als gesetzt gilt. Ich finde da
> immer nur, daß es als "programmed" gilt.
Das hatte ich dir doch oben schon mal erklärt:

HildeK schrieb:
> Naja, weil eine gelöschte EE-Zelle halt 0xFF enthält. Dass man das
> Programmieren eines Bits als 'Setzen' bezeichnet und es dabei zu '0'
> wird, ist vermutlich dieser Tatsache geschuldet

Nimm es einfach zur Kenntnis für die Zukunft - ein einfacher 
Lernprozess. Oder glaube es einfach. Ist halt so.

von Andreas B. (bitverdreher)


Lesenswert?

GustavG schrieb:
> Wenn du nicht zwischen Bit gesetzt und Bit programmed unterscheiden
> kannst, hat es keinen Sinn sich mit dir auszutauschen.

Bei AVR Bit gesetzt: unprogrammed

M. K. schrieb:
> Wenn du mit "Bit gesetzt" implizierst, dass der Wert des Bits dann 1
> ist, hat es keinen Sinn sich mit dir auszutauschen ;)

Das ist überall auf der Welt so. Sogar bei AVR.
Nur ist bei den AVRs gesetzt bzw. 1 eben nicht programmed.

Hoffentlich ist das jetzt mal geklärt.

von M. K. (sylaina)


Lesenswert?

Andreas B. schrieb:
> Nur ist bei den AVRs gesetzt bzw. 1 eben nicht programmed.

Programmed und gesetzt ist gleichbedeutend. Das beste Beispiel ist das 
CLKDIV8-Fusebit. Wenn mal wieder hier im Forum sich jemand wundert, dass 
sein AVR um den Faktor 8 zu langsam läuft kommt jedem sofort in den Sinn 
"Ja klar, da ist das CLKDIV8-Fusebit gesetzt". Das Problem ist hier mal 
wieder das Übersetzen vom Englischen ins Deutsche und zurück.
Der Fusebit Calculater zeigt das im Prinzip sehr schön: Um ein Fusebit 
zu "programmieren" muss ein Häckchen gesetzt werden.

von Andreas B. (bitverdreher)


Lesenswert?

M. K. schrieb:
> Programmed und gesetzt ist gleichbedeutend.

Langsam wundert mich nicht mehr, daß der TO verwirrt wird.
Du passt Dich hier den (falschen) Sprachgebrauch an. Wenn im DB eines 
AVR die Rede von einem gesetzten Bit ist, dann ist immer Bit=1 gemeint. 
Wenn die Rede von einem programmed Bit bei den Fuses ist, dann ist immer 
Bit=0 gemeint.
Zeig mir irgendeine Stelle im DB wo das anders ist.

Es wurde zwar bereits erwähnt aber man kann es gar nicht oft genug 
wiederholen: Irgendwelche Tutorials oder Fuse calculatoren sind nicht 
die Referenz, sondern das DB.

: Bearbeitet durch User
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.