[solved] Watchdog wieder disablen

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

Wenn du den Watchdog nicht per Fuse aktivierst, sondern per Software, dann kannst du ihn auch per Software wieder abschalten.

Gute Antwort - und genau dabei hatte ich auf Hilfe gehofft.

Wobei?

Wie muss ich welches Register setzen bzw zurücksetzen, um den WD zu disablen?

Seite 43f:

Wie auf dem AVR muss man da eine bestimmte Sequenz an Befehlen einhalten. Auf Seite 44 ist Beispiel-Code

erni-berni:
Wie muss ich welches Register setzen bzw zurücksetzen, um den WD zu disablen?

Och.....

 #include <avr/wdt.h>

 #include <avr/wdt.h>

void setup()
{
  wdt_enable(WDTO_8S);
  WDTCR=(1<<WDIE);
}


void loop()
{
  wdt_reset(); 
  if(batterieLeer())wdt_disable();
}


ISR(WDT_vect) 
{

}

Scheint noch einfacher zu sein:
In der wdt.h gibt es ein

 wdt_disable();

Das aufgerufen vor

 system_sleep();

scheint auszureichen