WDT interrupt, sleep mode

Нет ответов
ORLENOK
Offline
Зарегистрирован: 24.02.2018

Добрый день!



Вопрос такой:

Имеется код:

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 мА. 

Из-за чего это может быть? в какую сторону смотреть? Что включается в этот момент?