WDT interrupt, sleep mode
- Войдите на сайт для отправки комментариев
Сб, 24/02/2018 - 12:22
Добрый день!
Вопрос такой:
Имеется код:
void loop()
{
switch(currentState)
{
case state_interrupt:
{
for(int i =0;i< 10;i++)
{
dht.readHumidity();
dht.readTemperature();
delay(100);
}
delay(1000);
sendingData[0] = dht.readHumidity();
delay(1000);
sendingData[1] = dht.readTemperature();
delay(1000);
readDataSendResponse();
canUseWDT = true;
currentState = state_wait;
t1 = millis();
break;
}
case state_wait:
{
if(millis() - t1 > 8000)
{
currentState = state_sleep;
}
else
{
delay(500);
}
break;
}
case state_sleep:
{
goSleep();
}
}
}
void goSleep()
{
delay(1000);
if (canUseWDT)
{
radio.stopListening();
radio.powerDown();
WDTCSR |= bit(WDCE) | bit(WDE); //enable WDTCSR change
WDTCSR = bit(WDIE) | bit(WDP3) | bit(WDP0); //~8 sec
}
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
cli();
sleep_enable();
sleep_bod_disable();
power_adc_disable(); // ADC converter
power_spi_disable(); // SPI
power_usart0_disable();// Serial (USART)
power_timer0_disable();// Timer 0
power_timer1_disable();// Timer 1
power_timer2_disable();// Timer 2
power_twi_disable(); // TWI (I2C)
sei();
sleep_cpu();
}
void interruptGo()
{
sleep_disable();
power_all_enable();
power_twi_disable(); // TWI (I2C)
power_usart0_disable();// Serial (USART)
currentState = state_interrupt;
}
ISR(WDT_vect)
{
wdtInCount++;
if (wdtInCount >= 21) //22 * 8 = 176 sec = 3 min
{
wdt_disable();
power_all_enable();
power_twi_disable(); // TWI (I2C)
power_usart0_disable();// Serial (USART)
radio.powerUp();
radio.startListening();
wdtInCount = 0;
canUseWDT = false;
}
else
{
wdt_reset();
}
}
После того, как система уснула, включился wdt, система потребляет условно 4,2 мА.
После того, как сработал wdt первый раз, зашли в ISR(WDT_vect), потребление стало 10 мА.
Из-за чего это может быть? в какую сторону смотреть? Что включается в этот момент?