Hallo
Ich habe eine Frage zum Watchdog und den Sleep-Modi des AVR (ATMega8): wenn ich den Sleep-Modus verwende und den Watchdog zur Überwachung - fkt das?
Anbei ein Code-Schnipsel:
Würde der Watchdog nach den ca 30ms "zuschlagen", solange sich das Programm in der "while(event ==0)" - Schleife befindet (also kein Taster betätigt wird)?
mfg
Hero_123
Ich habe eine Frage zum Watchdog und den Sleep-Modi des AVR (ATMega8): wenn ich den Sleep-Modus verwende und den Watchdog zur Überwachung - fkt das?
Anbei ein Code-Schnipsel:
Code:
#include <avr/io.>
#include <avr/interrupt.h> /* fuer die Interrupts */
##include <avr/wdt.h> /* fuer den Watchdog */
#include <string.h>
#include <stdlib.h>
static volatile char event = 0;
/* initialisieren des INTERRUPTS INT0 */
static void init_INT0(void) {
DDRD &= ~(1 << DDD2); /* PD2 als Eingang => ISR INT0 */
PORTD |= (1 << PD2); /* PullUp Widerstand PD2 aktivieren */
MCUCR |= (1 << ISC01); /* ISC01 setzen */
MCUCR |= (1 << ISC00); /* ISC00 setzen */
GICR |= (1 << INT0); /* Interrupt INT0 aktivieren PD2 */
}
/* INT0 Funktion */
ISR(INT0_vect) {
if(event == 0) {
PORTD |= 0x80; /* LED AN wenn PD2 nicht betaetigt */
}
event = 1; /* gesetzt, wenn PD2 betaetigt */
}
void main(void){
unint8_t s_REG; /* Speicher fuer das SREG */
init_INT0();
set_sleep_mode(SLEEP_MODE_IDLE); /* IDLE Modus verwenden */
wdt_enable(WDTO_30MS); /*Start WDT 30ms-kein RESET in 30ms => RESET */
while(1){
s_REG = SREG; /* sicher das SREG */
cli(); /* sperre die Interrupts */
while(event == 0){ /* warte auf event */
sleep_enable(); /* aktiviere sleep Modus */
SREG = s_REG; /* = sei() */
sleep_cpu(); /* sleep Modus betreten */
sleep_disable();
s_REG = SREG; /* sicher das SREG */
cli(); /* sperre die Interrupts */
}
SREG = s_REG; /* = sei() restore I-Bit */
/* weiterer Code */
wdt_reset(); /* Reset des Watchdogtimers */
}
}
Würde der Watchdog nach den ca 30ms "zuschlagen", solange sich das Programm in der "while(event ==0)" - Schleife befindet (also kein Taster betätigt wird)?
mfg
Hero_123