Forum: Mikrocontroller und Digitale Elektronik ISP-Frequenz nach Änderung des Clock Prescalers


von Mike (Gast)


Lesenswert?

Hi Leute,

ich hatte auf meinem tiny45 den Clock Prescaler vom Standard 8 
(CKDIV8-Fuse) im Programm auf 256 geändert. Das Programm lief soweit 
wunderbar, nur nun konnte ich den µC nicht mehr programmieren. Erst als 
ich beim flashen mit avrdude eine Bit Clock Period von 1024 gesetzt 
hatte, ging es wieder.

Jetzt frage ich mich, wieso das nötig ist. Beim flashen ist der µC doch 
im Reset-Mode, und somit wird auch der Code, der den Prescaler 
verändert, gar nicht ausgeführt. Kann mir das jemand erklären?

Grüße,
Mike

von Timmo H. (masterfx)


Lesenswert?

Die fuse Bits greifen schon vor dem Code. Sie ändern quasi die interne 
Hardware-konfiguration

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Timmo H. schrieb:
> Die fuse Bits greifen schon vor dem Code. Sie ändern quasi die interne
> Hardware-konfiguration

Ja, das ist mir bewusst. Die Fuse-Bits hab' ich aber gar nicht geändert, 
sondern den Prescaler direkt im Code mit dem CLKPR-Register geändert. 
Der Hinweis auf CKDIV8 war nur als Begründung gedacht, warum ich 
schrieb, das ein Prescaling von 8 der Standard sei.

von Björn W. (60_40)


Angehängte Dateien:

Lesenswert?

Mike schrieb:
> Jetzt frage ich mich, wieso das nötig ist. Beim flashen ist der µC doch
> im Reset-Mode, und somit wird auch der Code, der den Prescaler
> verändert, gar nicht ausgeführt. Kann mir das jemand erklären?

Ich greife diese uralte Fage nochmal auf, weil es mich gerade selbst 
interessiert. Der Progger von AVR Studio warnt mich ja z.B. wenn ich 
ClockSource auf 128kHz beim Tiny13 stelle, siehe Bild.

Bei ISP wird der AVR doch im Reset gehalten was für mich bedeutet das 
CLKPR entweder 0x00 oder bei aktiver CLK/8 Fuse dann 0x03 sein sollte.

Oder ist es so das der letzte Zustand im CLKPR Register gehalten wird 
wenn man RESET macht?

Dann sollte man aus dieser Nummer doch rauskommen indem man im Code 
zuerst CLKPR auf 0x00 setzt und dann das ändern von CLKPR im Init Code 
von einer Bedingung abhängig macht wie z.B. irgendein Pin auf Low oder 
sowas.

So sollte man doch eigentlich Gewährleistet sein das Programmieren über 
ISP funktioniert wenn die "Bedingung" false ist..

Oder hab ich da was übersehen?

von c-hater (Gast)


Lesenswert?

Björn W. schrieb:

> Mike schrieb:
>> Jetzt frage ich mich, wieso das nötig ist. Beim flashen ist der µC doch
>> im Reset-Mode, und somit wird auch der Code, der den Prescaler
>> verändert, gar nicht ausgeführt. Kann mir das jemand erklären?
>
> Ich greife diese uralte Fage nochmal auf

Nein, das tust du nicht. Deine Frage ist eine eine ganz andere, eine, 
die schon im steinalten Thread vollkommen erschöpfend behandelt wurde.

> Der Progger von AVR Studio warnt mich ja z.B. wenn ich
> ClockSource auf 128kHz beim Tiny13 stelle, siehe Bild.
>
> Bei ISP wird der AVR doch im Reset gehalten was für mich bedeutet das
> CLKPR entweder 0x00 oder bei aktiver CLK/8 Fuse dann 0x03 sein sollte.

Ja, genauso ist das auch. Und wo ist jetzt deine Frage?

> Oder ist es so das der letzte Zustand im CLKPR Register gehalten wird
> wenn man RESET macht?

Nein. Das nimmt wieder exakt den Zustand an, den die Fuses vorgeben. (Es 
gibt übrigens auch Devices, die auch noch was anderes als 1:1 und 1:8 
per Fuses setzen können)

von Björn W. (60_40)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:

>> Mike schrieb:
>>> Jetzt frage ich mich, wieso das nötig ist. Beim flashen ist der µC doch
>>> im Reset-Mode, und somit wird auch der Code, der den Prescaler
>>> verändert, gar nicht ausgeführt. Kann mir das jemand erklären?
>>
>> Ich greife diese uralte Fage nochmal auf
>
> Nein, das tust du nicht. Deine Frage ist eine eine ganz andere, eine,
> die schon im steinalten Thread vollkommen erschöpfend behandelt wurde.

Ich habe das jetzt mal real Durchgetestet.
Im Code durch eine Bedingung den Takt auf 128Khz/256 gesetzt: Die CPU 
läuft dann auf ca 500Hz, danach ist in der Tat neuprogramieren nicht 
mehr Möglich. Auch nach RESET oder ISP RESET nicht solange die Bedingung 
true ist.

>> Oder ist es so das der letzte Zustand im CLKPR Register gehalten wird
>> wenn man RESET macht?
>
> Nein. Das nimmt wieder exakt den Zustand an, den die Fuses vorgeben. (Es
> gibt übrigens auch Devices, die auch noch was anderes als 1:1 und 1:8
> per Fuses setzen können)

Offenbar wird doch der letzte Zustand im CLKPR bei RESET hergenommen.
POWERCYCLE nehm ich hier mal explizit raus weil ich das nicht getestet 
habe.
Ein Testfall für Tiny13 habe ich im Anhang abgelegt.

Dort wird zuerst mal CLKPR auf Null gesetzt und hat zur Folge das sich 
der Controller per ISP noch erreichen lässt. Nur durch "Bedingung 
PB3=LOW" wird auf CLK/256 geschaltet. Danach ist der Controller nicht 
mehr per ISP erreichbar.
Wenn man die Bedingung nicht erfüllt, also PB3=HIGH dann kann erst nach 
einem zweiten RESET wieder per ISP zugreifen.

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.