Hi, kann man -einfach so- vom externen Takt auf den internen umschalten? Ich möchte in den Progammpausen in den Idle-Mode schalten und den Takt herunternehmen, um Strom zu sparen. Die anderen Powerdown-Modi kann ich leider im laufenden Betrieb nicht einsetzen, da ich verschiedene Interrupts weiterhin benötige, diese aber nur im Idle-Mode erreichbar sind. Beim Hitachi H8S2357(Bsp.) kann man die CPU-Clock 'runterteilen. Geht hier wohl nur über einen Reset in den Bootloadersektor und von dort über die Verstellung der fusebits? Liege ich da richtig, oder gibt es eine andere Möglichkeit? Einen Bootloader verwende ich sowieso, dem müsste ich dann (über ein Byte im EEProm) sagen, dass er die fusebits auf int.1Mhz stellen soll. Hat jemand so was krummes schon mal gemacht? Danke und Gruß AxelR.
Ich vermute, Du sprichst von einem AVR. Da gehts in der Tat nur über die Fusebits. Bei den msp430 gehts "online" - zu jeder Zeit!
Ich kann mal nur als Bsp. für den ATmega 162 sprechen. Bei dem kann man im laufenden Betrieb den Taktvorteiler setzen. Das nennt sich da "System Clock Prescaler", Teiler von 1 bis 256 sind möglich (in 2^n Schritten) und wird über das Register CLKPR gemacht. Zur Sicherheit ist auch hier, wie beim Watchdog-Timer, ein bestimmte Befehlsfolge einzuhalten. Ich habe das für Testzwecke auch schon probiert, mit 8 MHz internem RC-Oszillator durch 256 runtergeteilt, das gibt dann in etwa einen Takt wie mit einem 32 kHz Uhrenquarz (weil den hab ich im Monent nicht da) In wieweit das die anderen AVRs können, kann ich nicht sagen. Gruß Ingo
Hab mal schnell die Datenblätter der Megas durchgeklickt, Mega8 und 16 können das nicht, aber der 169 und die neuen 48/68/168. Bei den großen Mega64 und 128 gibt es sowas wohl auch, heißt dort aber "XTAL Devide Control Register" XDIV und geht von 2 bis 129.
Danke, erstmal.- ich verwende den MegaLoad von MICROSYL. Da werd' ich mal den Quelltext entsprechend, wie oben gepostet, ändern. Gruß AxelR.
Das Problem ist aber, das Du vom Bootloader aus die Fuses gar nicht setzen kannst, das geht nur mit den Boot Lock Bits! Gruß, Maddin
SCH.. echt? wäre ja blöd. Bin leider gerade mit Arbeit zu bis obenhin, sehe aber nachher oder heut abend mal im Datenblatt nach. Danke, trotz der "schlechten" nachricht... AxelR.
Ich will dich ja nicht demotivieren, aber es bringt gar nix den Takt runterzusetzen wenn du immer brav in den sleep gehst. Grund: Wenn du z.B. mit 8 statt 1 MHz taktest, verbraucht der Prozessor das 8-fache an Strom. Aber er ist auch 8 mal so schnell mit seinen Rechnungen fertig und daher schneller wieder im Sleep mode, die Stromaufnahme bleibt im Mittel also gleich. Sobald die CPU im Idle ist, wird der Prozessortakt ja abgeschaltet, also hat der CPU-Takt da auch keine Auswirkungen. Die beste Methode in deinem Fall ist den Controller so schnell wie möglich wieder in den sleep zu schicken, also wenn du periodisch was machst, diese Teile zu optimieren.
Solche Überlegungen machen natürlich Sinn. habe ich aber auch schon hinter mir. Der Controller ist die mesite Zeit im Sleep (Idle). lt. Datenblatt Seie 32 ist aber genau in diesem Mode die Mainclock aktiv,nur die IO-clock und die CPU_Clock ist aus, daher mein Gedankengang.
Hi... Läuft nicht im IDLE-Mode der Takt (und damit der Stromverbrauch) weiter? Wie sollten denn sonst Timer-Interrupts während IDLE möglich sein? IDLE ist doch noch kein "Tiefschaf"... Oder irre ich mich da? Gruß... ...HanneS...
Hallo Holzstück-Hannes! Ja, es ist nur die Frage wieviel der Takt ausmacht. Wenn er am Stromverbrauch einen grossen Anteil hat, dann macht es wieder Sinn. Ich hab meine Messungen auch mit Power_Save gemacht da läuft nur mehr der externe Quarz an Timer2. Und da war die interne Taktfrequenz egal.
Um nochmal auf meinen Mega162 zurückzukommen :-) Denn will ich mit einem externen 32 kHz Uhrenquarz betreiben. Wenn ich dann noch, bevor ich ihn in den Idle-Mode schicke, den Systemtakt durch 256 teile, läuft er nur noch mit 128 Hz. Das sollte noch einiges an Stromeinsparung bringem. Im Gegensatz zum Power-Down/Save Modus kann ich ihn dann wieder mit einem Timer aufwecken. Gruß Ingo
"Im Gegensatz zum Power-Down/Save Modus kann ich ihn dann wieder mit einem Timer aufwecken." Das stimmt nicht. Auch aus Powersave kommst du über Timer Interrupt raus. Power_save macht man so: CPU-Takt möglichst hoch (z.B. interner 8MHz Takt). Uhrenquartz an TOSC1 und TOSC2 anschliessen. AS2 in ASSR setzen. Dann wird der Timer2 Interrupt durch den Uhrenquarz ausgelöst, und man kann das Programm bis zum nächsten Sleep mit Full-Speed abarbeiten. Der Rest der Zeit wird praktisch kein Strom verbraucht. Allerdings funktionieren dann halt bis auf Level Int0 und Int1 keine anderen Interrupts.
Ja Ingo, soo dacht' ich auch... wie komme ich denn anders an die Fusebits heran?? Ich muss wohl doch nochmal nachschlagen (eigentlich keine zeit) AxelR.
Na gut, vielleicht sollte ich mich doch nochmal etwas genauer mit den Takt- und Spromsparmöglichkeiten befassen. Andererseits find ich das mit dem runtergeteilten Systemtakt eine interessante Sache, und es wird im Datenblatt extra als Möglichkeit zum Stromsparen genannt: "The ATmega162 system clock can be divided by setting the Clock Prescale Register CLKPR. This feature can be used to decrease power consumption when the requirement for processing power is low." Dann wäre noch die Frage, wann es denn nun die Mega48/88/168 endlich zu kaufen gibt... Scheinen mir ganz nette Teile zu sein :-) Gruß Ingo
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.