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
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.
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?
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)
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.
Eine eigene Frage?
Dieser Thread ist über 11 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.