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
Die fuse Bits greifen schon vor dem Code. Sie ändern quasi die interne Hardware-konfiguration
:
Bearbeitet durch User
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.
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.