Forum: Mikrocontroller und Digitale Elektronik Problem: Attiny45 mit 16MHz PLL Takt


von Uwe (de0508)


Lesenswert?

Hallo,

ich nutze einen Attiny45 mit 16MHz PLL µC Takt.

Die zugehörigen Fusebits in Avrdude-Schreibweise sind:
-U lfuse:w:0xf1:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m

Wenn der Attiny45 seine "Arbeit" getan hat, setze ich
a) den µC Clockvorteiler auf 1/16 also 1MHz µC Takt und
b) versetze ihn dann in den Sleep Mode "ADC Noise Reduction".

Will ich dann per ISP eine neuen Programmcode aufspielen und testen, so 
kann ich den Attiny45 nicht mit 2MHz ISP-Takt beschreiben.

Die Frage ist: /warum ist das so ?/

Ich muss den ISP-Takt auf 1MHz/4, also kleiner als 250kHz setzen !
Sehr eigenartig.

Also suche ich Erfahrungen mit diesem Phänomen und evtl. auch eine 
Referenz/ Verweis im Datenblatt.

#Vielen Dank#


Der Aufruf im Hauptprogramm (LunaAVR) ist:
1
' more code ..
2
avr.Interrupts.disable
3
AVRClock.Prescaler = 16
4
Powerdown.Now = adcdenoise
5
halt()

Hier sehr ihr den Inhalt, der von mir geschriebenen 
Bibliotheksfunktionen.

Der Aufruf Bibliotheksfunktion |AVRClock.Prescaler = 16| wird wie folgt 
codiert:
1
.set AVR_CLOCK_PRESCALER = ((0<<CLKPS3) or (1<<CLKPS2) or (0<<CLKPS1) or (0<<CLKPS0))
2
3
ldi  _HA0,AVR_CLOCK_PRESCALER
4
call  _AVRClock_Change_Prescaler

Die Implementierung der Bibliotheksfunktion 
|_AVRClock_Change_Prescaler|:
1
.set AVR_CLOCK_PRESCALER_MASK = ((1<<CLKPS3) or (1<<CLKPS2) or (1<<CLKPS1) or (1<<CLKPS0))
2
3
_AVRClock_Change_Prescaler:
4
; _HA0: clock prescaler mask
5
; save and clear global interrupt flag
6
xIn  _TMP0,SREG
7
cli
8
9
andi  _HA0,AVR_CLOCK_PRESCALER_MASK
10
ldi  _HA1,(1<<CLKPCE)
11
12
xOut  CLKPR,_HA1
13
xOut  CLKPR,_HA0
14
xOut  CLKPR,_HA0
15
16
; restore global interrupt flag
17
xOut  SREG,_TMP0
18
ret

Der Aufruf Bibliotheksfunktion |Powerdown.Now = adcdenoise| wird wie 
folgt codiert:
1
.set SLEEP_MODE = ((0<<SM1) or (1<<SM0))
2
3
ldi  _HA0,SLEEP_MODE
4
call  _AVR_Powerdown_Now

Die Implementierung der Bibliothekfunktion |_AVR_Powerdown_Now|:
1
.set SLEEP_MODE_MASK = ((1<<SM1) or (1<<SM0))
2
3
_AVR_Powerdown_Now:
4
; save and clear global interrupt flag
5
xIn  _TMP0,SREG
6
cli
7
8
; mask out only sleep mode bits
9
andi  _HA0,SLEEP_MODE_MASK
10
11
; sleep: enable, disable Pullup
12
ori  _HA0,((1<<SE) or (1<<PUD))
13
xOut  MCUCR,_HA0
14
15
; disable BOD Level
16
ldi  _HA1,(1<<BODS) or (1<<BODSE)
17
ldi  _HA2,(1<<BODS)
18
or  _HA1,_HA0
19
or  _HA2,_HA0
20
xOut  MCUCR,_HA1
21
xOut  MCUCR,_HA2
22
23
; restore global interrupt flag
24
xOut  SREG,_TMP0
25
26
sleep
27
28
; disable sleep
29
ldi  _HA0,0
30
xOut  MCUCR, _HA0
31
32
ret

xOut und xIn sind systemweite Macros.
1
.macro xIn
2
.if @1<64
3
  in  @0,@1
4
.else
5
  lds  @0,@1
6
.endif
7
.endmacro
8
9
.macro xOut
10
.if @0<64
11
 out  @0,@1
12
.else
13
 sts  @0,@1
14
.endif
15
.endmacro

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Ich beobachte das Gleiche, auch bei ATmegas, hatte bislang den Effekt 
aber auf mein Eigenbau-Programmiergerät geschoben und mich nicht weiter 
darum gekümmert.

von user (Gast)


Lesenswert?

Der ISP Takt darf maximal 1/2 oder 1/4 des internen Takts sein.

von Uwe (de0508)


Lesenswert?

user schrieb:
> Der ISP Takt darf maximal 1/2 oder 1/4 des internen Takts sein.

Ja das ist uns Programmierern bekannt: der Takt ist auf 16MHz gesetzt, 
siehe oben im Test - nur scheinbar gilt das nicht bei der 
ISP-Programmierung.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

>  der Takt ist auf 16MHz gesetzt
Zu dem Zeitpunkt, an welchem das Reset für das ISP kommt, eben nicht, da 
ist der Takt 1 MHz.

von Uwe (de0508)


Lesenswert?

Hallo S. Landolt schrieb:
>>  der Takt ist auf 16MHz gesetzt
> Zu dem Zeitpunkt, an welchem das Reset für das ISP kommt, eben nicht, da
> ist der Takt 1 MHz.

Ich dachte eher an: CPU-Takt=0,5MHz * 16 = 8MHz RC-Oszillator, da 
CKDIV8=1 ist.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>ich nutze einen Attiny45 mit 16MHz PLL µC Takt.

Was soll das sein? PLL funktioniert nur mit internem Oszillator.

MfG Spess

von S. Landolt (Gast)


Lesenswert?

> Ich dachte eher an: CPU-Takt=0,5MHz * 16 = 8MHz RC-Oszillator
Verstehe ich nicht ganz, Sie schreiben doch
> a) den µC Clockvorteiler auf 1/16 also 1MHz µC Takt

von Uwe (de0508)


Lesenswert?

Lbr Spess,

nichts anders steht da, im Datenblatt:

8MHz RC Oszillator x8 PLL = 64MHz;
der CPU Takt wird durch einen weiteren Vorteiler von /4 auf 16MHz 
festgelegt.

Die Frage ist, welche Taktfrequenz liegt bei einem Soft-Reset (ISP 
Programmer) an der CPU an, wenn die obigen Einstellungen vorgenommen 
wurden und der Clock-Prescaler auf  1/16 steht ?

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Die Frage ist, welche Taktfrequenz liegt bei einem Soft-Reset (ISP
>Programmer) an der CPU an, wenn die obigen Einstellungen vorgenommen
>wurden und der Clock-Prescaler auf  1/16 steht ?

Der Takt der über die Fuses eingestellt ist.
Was in deinem Programm passiert interessiert da nicht.

von S. Landolt (Gast)


Lesenswert?

Holger schrieb:
> Der Takt der über die Fuses eingestellt ist.
> Was in deinem Programm passiert interessiert da nicht.

Welches Programmiergerät verwenden Sie? Und können Sie etwas über dessen 
Programmierablauf sagen?

von Uwe (de0508)


Lesenswert?

Hallo Holger,

die Logik zeigt mit, dass das so leider nicht ist, da der ISP-Takt auf 
<250kHz gestellt werden musste, mit aktivierten Clock-Prescaler auf 1/16 
im Sleep-Mode.

Lasse ich den Clock-Prescaler auf 1, so kann ich mit 2MHz ISP-Takt 
weiter arbeiten.

Aber wo ist das Dokumentiert ?

von Uwe (de0508)


Lesenswert?

S. Landolt schrieb:
> Holger schrieb:
>> Der Takt der über die Fuses eingestellt ist.
>> Was in deinem Programm passiert interessiert da nicht.
>
> Welches Programmiergerät verwenden Sie? Und können Sie etwas über dessen
> Programmierablauf sagen?

Einen USBTinyISP Programmer auf Basis eine Attiny85 der wird von Avrdude 
5.11 unter Linux angesteuert.

Beitrag "AVR USBtinyISP Programmer mit atTiny85"

von S. Landolt (Gast)


Lesenswert?

> die Logik zeigt mit, dass das so leider nicht ist
Bei mir auch; als ich einmal einen Stromspartest mit einem ATmega1284 
machte, 128 kHz RC mit Vorteiler /256, musste ich anschließend mein 
Programmiergerät um eine untere Stufe von 100 Hz erweitern.

von S. Landolt (Gast)


Lesenswert?

Tja, Uwe, offenbar hat Holger etwas Besseres als wir beide.

Bei Gelegenheit werde ich an meinem mal Verschiedenes ausprobieren.

von holger (Gast)


Lesenswert?

>Tja, Uwe, offenbar hat Holger etwas Besseres als wir beide.

Nein, habe ich nicht;)

Vieleicht ist das hier ja das Problem:

The contents of the Register File and SRAM are unaltered when the device 
wakes up from
sleep. If a reset occurs during sleep mode, the MCU wakes up and 
executes from the Reset Vector.

Wenn man sich das auf der Zunge zergehen lässt könnte man folgendes 
interpretieren:

1. Wenn die CPU aus dem Sleep kommt werden keine Register verändert.
2. Bei einem Reset während Sleep wacht die CPU auf und springt an den 
Reset Vector.

Von einem echten Hardware Reset ist hier nicht die Rede.
Alle Register bleiben unverändert weil aus Sleep aufgewacht,
und damit auch die letzte Takteinstellung.

Ein bisschen weit hergeholt, ich weiss.

von Uwe (de0508)


Lesenswert?

Danke Holger,

genau dass ist die Erklärung, ich hatte bisher Tomaten auf den Augen..

Steht auch im Abschnitt "Power Management and Sleep Modes".

Damit sind unsere Beobachtungen geklärt.

Perfekt. Schönen Abend noch.

-closed-

von S. Landolt (Gast)


Lesenswert?

Ein Test mit einem ATmega48 zeigt, dass der beschriebene Effekt nichts 
mit 'sleep' zu tun hat. Es scheint, als käme man nur daran vorbei, wenn 
bei gesetztem /reset Spannung an den Controller gelegt wird.
So die Beobachtung mit meinem Eigenbau-Programmiergerät. Für 
gegenteilige Hinweise und Lösungsvorschläge wäre ich dankbar; zumal 
holger ja schrieb:
> Der Takt der über die Fuses eingestellt ist.
> Was in deinem Programm passiert interessiert da nicht.

von Axel S. (a-za-z0-9)


Lesenswert?

S. Landolt schrieb:
> Ein Test mit einem ATmega48 zeigt, dass der beschriebene Effekt nichts
> mit 'sleep' zu tun hat. Es scheint, als käme man nur daran vorbei, wenn
> bei gesetztem /reset Spannung an den Controller gelegt wird.

Richtig. Das hat nichts mit Sleep zu tun. Und natürlich kriegt der µC 
über den ISP einen "echten Hardware Reset".

Der beobachtete Unterschied ist der zwischen einem external reset und 
einem power-on reset. Der letztere setzt alle Register auf ihre 
Defaultwerte, der erstere anscheinend nur ein paar; insbesondere scheint 
er den Prescaler für den Systemtakt nicht zurückzusetzen, so daß der µC 
mit reduziertem Takt weiterläuft.

Das Datenblatt erwähnt davon nichts, sondern sagt im Gegenteil ganz 
eindeutig: "During reset, all I/O Registers are set to their initial 
values" (in 8.1 Resetting the AVR) und "The CKDIV8 Fuse determines the 
initial value of the CLKPS bits. If CKDIV8 is unprogrammed, the CLKPS 
bits will be reset to 0000. If CKDIV8 is programmed, CLKPS bits are 
reset to 0011, giving a division factor of eight at start up." (in 6.5.2 
CLKPR - Clock Prescale Register).

Ich würde das daher für mindestens einen Dokumentations-Bug halten, wenn 
nicht gar für einen echten Hardware-Bug.

von Thomas E. (thomase)


Lesenswert?

Axel S. schrieb:
> Ich würde das daher für mindestens einen Dokumentations-Bug halten, wenn
> nicht gar für einen echten Hardware-Bug.

Weder das eine noch das andere.

Das geschilderte Verhalten zeigt sich weder mit einem AVRISPMKII noch 
mit einem JTAGICEMKII. Wohl eher eine Unzulänglichkeit des verwendeten 
Programmers, der Entwicklungsumgebung oder sonst irgend etwas, was nur 
Kurt erklären kann.

Getestet mit Attiny45 und Atmega168 im Sleepmode PWR_DOWN mit AVR-Studio 
und den o.g. Programmern.

mfg.

von Axel S. (a-za-z0-9)


Lesenswert?

Thomas E. schrieb:
> Axel S. schrieb:
>> Ich würde das daher für mindestens einen Dokumentations-Bug halten, wenn
>> nicht gar für einen echten Hardware-Bug.
>
> Das geschilderte Verhalten zeigt sich weder mit einem AVRISPMKII noch
> mit einem JTAGICEMKII. Wohl eher eine Unzulänglichkeit des verwendeten
> Programmers, der Entwicklungsumgebung oder sonst irgend etwas, was nur
> Kurt erklären kann.

Mir ist jetzt nicht klar, was man dabei falsch machen kann, wenn man den 
Reset-Pin auf L zieht.

von S. Landolt (Gast)


Lesenswert?

Meine Beobachtung: Nach einem Reset wird der Vorteiler erst mit Ablauf 
der start-up-time zurückgesetzt. Bislang hatte ich in meinem 
Eigenbau-Programmiergerät eine Wartezeit von 2 ms, was mehr ist als das 
von Atmel vorgegebene "... /RESET must be given a positive pulse of at 
least two CPU clock cycles duration", aber eben auch nur dann ausreicht, 
wenn die Fuses im Controller auf eine kürzere Zeit eingestellt sind 
(gilt offenbar auch für den 'USBTinyISP Programmer' von Uwe S.). Bei 
längerer start-up-time bleibt die alte Einstellung des Vorteilers 
erhalten. Wähle ich 100 ms, so klappt es immer, aber natürlich kann man 
sich eine Anwendung vorstellen, in der dann bereits der Vorteiler 
umprogrammiert wurde. Außerdem wird das zur Anpassung automatische 
Herunterfahren des SPI-Taktes spürbar langsamer. Wie professionelle 
Programmiergeräte dieses Dilemma lösen, ist mir unklar.

von S. Landolt (Gast)


Lesenswert?

> Mir ist jetzt nicht klar, was man dabei falsch machen kann,
> wenn man den Reset-Pin auf L zieht.
Wohl etwas falsch interpretiert.

von Thomas E. (thomase)


Lesenswert?

Axel S. schrieb:
> Mir ist jetzt nicht klar, was man dabei falsch machen kann, wenn man den
> Reset-Pin auf L zieht.

Das Laden der Default-Werte in die Register geschieht nicht von jetzt 
auf gleich. Das hat S.Landolt auch so beobachtet:

S. Landolt schrieb:
> Meine Beobachtung: Nach einem Reset wird der Vorteiler erst mit Ablauf
> der start-up-time zurückgesetzt.

Das Fehlverhalten des Programmers zeigt sich dann eben darin, dass 
dieser nach dem Runterziehen von Reset offenbar sofort loslegt. Dass die 
Original-Atmel-Programmer das nicht machen und ein passendes Delay 
einfügen, kann man natürlich auch erwarten.

mfg.

von (prx) A. K. (prx)


Lesenswert?

S. Landolt schrieb:
> Eigenbau-Programmiergerät eine Wartezeit von 2 ms, was mehr ist als das
> von Atmel vorgegebene "... /RESET must be given a positive pulse of at
> least two CPU clock cycles duration",

In der ISP-Spezifikation steht aber nach dem Reset:

"Wait for at least 20 ms and then enable serial programming by sending 
the Programming Enable serial instruction to the MOSI pin"

Ich bin selber schon auf dem RasPi drüber gestolpert:
Beitrag "ATtiny841 per AVRDUDE auf Rasberry Pi programmieren"

: Bearbeitet durch User
von Paul B. (paul_baumann)


Lesenswert?

A. K. schrieb:
> "Wait for at least 20 ms and then enable serial programming by sending
> the Programming Enable serial instruction to the MOSI pin"

Na, da kann man ja noch schnell eine Tasse Kaffee trinken, bevor es 
losgeht.

MfG Paul

von Axel S. (a-za-z0-9)


Lesenswert?

A. K. schrieb:
> In der ISP-Spezifikation steht aber nach dem Reset:
>
> "Wait for at least 20 ms and then enable serial programming by sending
> the Programming Enable serial instruction to the MOSI pin"

Danke. Mein Vertrauen in Atmel (die Hardware genauso wie die Doku) ist 
damit wiederhergestellt :)

von S. Landolt (Gast)


Lesenswert?

Mir scheint, wir reden aneinander vorbei. Sie zitieren Punkt 2, ich 
bezog mich auf Punkt 1:

1. Power-up sequence:
Apply power between VCC and GND while RESET and SCK are set to “0”. In 
some systems, the programmer can not guarantee that SCK is held low 
during power-up. In this case, RESET must be given a positive pulse of 
at least two CPU clock cycles duration after SCK has been set to “0”.
2. Wait for at least 20ms and enable serial programming by sending the 
Programming Enable serial instruction to pin MOSI.


Könnte mal jemand mit einem Atmel-Programmer einen Controller 
ansprechen, der in den Fuses die kürzestmögliche start-up-time 
eingestellt und als Programm nur das Setzen des Vorteilers auf Maximum, 
also /256, mit anschließender Endlosschleife (rjmp pc) hat - mit welchem 
SPI-Takt geschieht das dann?
(auf eigene Gefahr, für 'abgeschossene' uCs hafte ich nicht)

von S. Landolt (Gast)


Lesenswert?

Ich vergaß: Spannungsversorgung ständig anliegend.

von holger (Gast)


Lesenswert?

>mit welchem SPI-Takt geschieht das dann?

Mit dem Takt den man im AVR Studio eingestellt hat.

von (prx) A. K. (prx)


Lesenswert?

Woraus willst du damit raus, was bringt dir das?

Beim ATtiny841 konnte ich jedenfalls feststellen, dass die Wartezeit des 
programmierten Oszillators beim ISP-Verfahren eine Rolle spielt. Der R/C 
Oszillator mit seiner kurzen Startzeit benötigt keine Wartezeit im ISP, 
der Quarzoszillator jedoch schon.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Den Auslieferungszustand von 8 MHz / 8 voraussetzend, müsste also nach 
der bisherigen Theorie ein SPI-Takt von 230 kHz reichen?

Was mir das bringt? - Erkenntnisgewinn, aber entscheidend wichtig ist es 
nicht. Es wäre trotzdem nett, wenn es jemand mal durchführte.

von (prx) A. K. (prx)


Lesenswert?

S. Landolt schrieb:
> Den Auslieferungszustand von 8 MHz / 8 voraussetzend, müsste also nach
> der bisherigen Theorie ein SPI-Takt von 230 kHz reichen?

Ja. Das gilt ziemlich durch die Bank für viele bis alle AVRs. Mit 
weniger als 1MHz effektiven Taktes kommt meiner Erinnerung nach keiner 
zu Welt.

Der exakte Ablauf könnte auch vom Typ abhängig sein. So ist bei fast 
allen ATmega/tiny Typen die Taktquelle ausschliesslich von den Fuses 
festgelegt, nur der Teiler ist variierbar. Erst der ATtiny841 erlaubt 
eine Konfiguration zur Laufzeit. Es würde mich nicht überraschen, wenn 
sich das auf das Startverhalten auswirkt.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

S. Landolt schrieb:
> Was mir das bringt? - Erkenntnisgewinn, aber entscheidend wichtig ist es
> nicht. Es wäre trotzdem nett, wenn es jemand mal durchführte.

Die Erkenntnis ist ernüchternd.

Mit 8Mhz geht es bis CLKPR = 16, mit 16MHz bis CLKPR = 32. Was beides 
jeweils 500KHz CPU-Clock ergibt. Darunter ist Schluss mit Lustig.
Delay ist egal. ISP-Clock 2 bzw. 4MHZ.

Attiny45. Ob mit JTAGICE oder AVRISP: gleiches Verhalten.


Hab jetzt keine Lust mehr, das weiter zu untersuchen.

mfg.

von S. Landolt (Gast)


Lesenswert?

Ein herzliches Dankeschön. Ich hätte nicht geglaubt, dass sich jemand 
noch um diese Zeit die Mühe macht.
An der Interpretation der Antwort muss ich noch etwas arbeiten.

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.