Hallo zusammen,
folgendes Problem:
Ich baue gerade einen Sketch, der auf einem ATtiny85 läuft, möglichst wenig Leistung braucht und von einer LiIon Zelle betrieben wird. Der ATTiny geht immer für 4s in sleepmode und wird durch den Watchdog wieder geweckt. Wenn er aufwacht wird die Betriebsspannung gemessen.
Wenn die Betriebsspannung unter 3V sinkt, soll der ATTiny in einen sleepmode gehen, aus dem er nur durch einen Reset wieder aufwacht.
Die Programmierung des Watchdog ist auf vielen Seiten zu finden z.B. hier, die meisten Beispiele gehen auf KHM 2008 / Lab3/ Martin Nawrath nawrath@khm.de zurück.
Hier die Routine, die den watchdog enabled:
void setup_watchdog(int ii) {
// ii: 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms,6=1s,7=2s,8=4s,9=8s
byte bb;
if (ii > 9 ) ii=9; // 1001
bb=ii & 7; // xxxx & 0111 = 0aaa
if (ii > 7) bb|= (1<<5); // xx1xxaaa
bb|= (1<<WDCE); // WDCE is BIT4 xx11xaaa
MCUSR &= ~(1<<WDRF); // Watchdog Reset Flag wird gelöscht
// start timed sequence
WDTCR |= (1<<WDCE) | (1<<WDE); // WDE Watchdog enable, WDCE Watchdog Change Enable (must be set by prescaler use)
// set new watchdog timeout value
WDTCR = bb; // ??
WDTCR |= (1<<WDIE); // Watchdog Timeout INT enable
}
und die Routine, die den ATTiny schlafen schickt:
void system_sleep() {
ADCSRA &= ~(1<<ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System sleeps here
// continue from here
sleep_disable(); // System continues execution here when watchdog timed out
ADCSRA |= (1<<ADEN); // switch Analog to Digitalconverter ON
}
Wenn die Akkuspannung zu niederig wird, will ich den ATTiny schlafen schicken, ohne dass der Watchdog ihn wieder aufweckt. Ich bräuchte also die Registeränderungen, die notwendig sind, den Watchdog zu deaktivieren.
Gruß
Reinhard