Schlafmodus mit Wecken durch Watchdog Time-out Interrupt (WDT)

Das nachfolgende Programmbeispiel zeigt, wie ein schlafender Attiny zyklisch "von innen" mit einem Watchdog Time-out Interrupt (WDT), geweckt wird.


Funktion:

Nach Neuanlauf des Attiny wird dieser in den Schlafmodus gesetzt. Alle 4 Sekunden wird durch einen WDT der Attiny geweckt und für 2 Sekunden die LED einschaltet. Anschließend geht der Attiny wieder in den Schlafmodus, wo er bis zum nächsten WDT verharrt.


Wie man beim Attiny einen WDT programmiert, zeige ich hier!


Verwendete Libraries:

sleep und wdt: Die verwendeten Libraries sind Bestandteil der Arduino-IDE und müssen deshalb nicht installiert werden.


Hinweis:

Wer mit Registerprogrammierung nicht vertraut ist, sollte sich zum Verständnis des Programms folgende Seite ansehen: Bitmanipulation

//Sleep Mode mit WDT-Wecken
//Code fuer Attiny
//Author Retian
//Version 1.0


#include <avr/sleep.h>
#include <avr/wdt.h>


#define ledPin 4


//Prototypen:
void gotoSleep(void);


volatile bool statusLED = LOW;


void setup() {
  pinMode(ledPin, OUTPUT);


  //Setzen des Registers fuer Watchdog Time-out Interrupt
  cli();
  wdt_reset(); // Reset Watchdog Timer
  MCUSR &= ~(1 << WDRF); //Ruecksetzen des Watchdog System Reset Flag
  WDTCR = (1 << WDCE); //Watchdog Change Enable setzen
  WDTCR = (1 << WDP3); //Watchdog Zyklus = 4 s
  WDTCR |= (1 << WDIE); //Watchdog Timeout Interrupt Enable setzen
  sei();

  gotoSleep();
}


void loop() {
  if (statusLED)
  {
    statusLED = LOW;
    digitalWrite(ledPin, HIGH);
    delay(2000);
    digitalWrite(ledPin, LOW);
    gotoSleep();
  }
}


//Attiny in den Schlafmodus setzen
void gotoSleep()
{
  byte adcsra;

  adcsra = ADCSRA; //ADC Control and Status Register A sichern
  ADCSRA &= ~(1 << ADEN); //ADC ausschalten

  MCUCR |= (1 << SM1) & ~(1 << SM0); //Sleep-Modus = Power Down
  MCUCR |= (1 << SE); //Sleep Enable setzen
  sleep_cpu(); //Schlafe ....
  MCUCR &= ~(1 << SE); //Sleep Disable setzen

  ADCSRA = adcsra; //ADCSRA-Register rueckspeichern
}


ISR(WDT_vect)
{
  statusLED = HIGH;
}


Ergebnis:

Der Stromverbrauch des Testaufbaues beträgt ca. 17 mA bei leuchtender LED (ca. 7,5 mA ohne LED). Wie nachfolgendes Bild 1 zeigt, beträgt im Schlafmodus der Stromverbrauch ca. 7 µA.

Gegenüber dem ersten Beispiel, wo der Attiny mit einem Pin Change Interrupt aus dem Schlafmodus geweckt wird, ist der Stromverbrauch des Attiny ca. um den Faktor 20 höher. Das liegt daran, dass beim ersten Beispiel der Watchdog ausgeschaltet ist und der eingeschaltete Watchdog eben auch einige µA verbraucht.

 

Bild 1: Multimeter mit Anzeige des Stromverbrauchs im Schlafmodus von ca. 7 µA (Messbereichsvorwahl 200 µA)


Zurück zu Attiny im Schlafmodus