Hallo M1.R.
da hast du dir ja wieder was lustiges, und sinnvolles ausgedacht.
Zu Stromsparen kannst die Kiste mit:
void set_sleep_mode (uint8 t mode)
void sleep_mode (void)
in einen Sleep-Mode setzen.
Die mode-Möglichkeiten sind folgende:
#define SLEEP_MODE_ADC BV(SM0)
ADC Noise Reduction Mode.
#define SLEEP_MODE_EXT_STANDBY ( BV(SM0) | BV(SM1) | -
Extended Standby Mode.
#define SLEEP_MODE_IDLE 0
Idle mode.
#define SLEEP_MODE_PWR_DOWN BV(SM1)
Power Down Mode.
#define SLEEP_MODE_PWR_SAVE ( BV(SM0) | BV(SM1))
Power Save Mode.
#define SLEEP_MODE_STANDBY ( BV(SM1) | BV(SM2))
Standby Mode.
Am sinnvollsten erscheint mir der Mode "Power Save Mode", da hier alles außer Timer 2 abgeschaltet wird. Mit hoher Wahrscheinlichkeit muss noch das Bit AS2 im ASSR-Register gesetzt werden. Sonst ist auch Timer 2 ausgeschaltete!
Dann sollte folgendes Prinzip funktionieren:
// ISR muss nichts tun. Soll nur vorhanden sein.
ISR (TIMER-2)
{
;
}
// Initialisiere Timer 2 möglichst auf 1 ms
// Hier die Bits setzen, die den Timer 2 veranlassen, nach einer ms einen
// Interrupt auszulösen.
Tu dies;
Setze das;
schalte den Interrupt scharf;
// Initialisiere einen eigenen ms-Zähler
ms_zeit = 0;
// Sleepmode setzen
set_sleep_mode (SLEEP_MODE_PWR_SAVE);
while (ms_zeit < zeit)
{
ms_zeit++;
sleep_mode ();
}
Das Ganze ist in den Dokumenten "AVRInstructionSet.pdf" und "ATmega8.pdf" auf der Asuro-CD zu finden.
Im ATmega8.pdf sind auf Seite 33 die Sleep-Modes
Im AVRInstructionSet.pdf in Kapitel "5.5 Power Management and Sleep Modes" geht es um die Sleep-Befehle.
So, und jetzt werfe ich das Einschlafprogramm an.
Gruß Sterntahler
P.S.: Das Ganze ist rein theoretisch, da ich das selber noch nie gemacht habe.
Lesezeichen