WDT, sleep mode

Тема в разделе "Arduino & Shields", создана пользователем ORLENOK, 23 фев 2018.

  1. ORLENOK

    ORLENOK Гик

    Добрый день!

    Вопрос такой:
    Имеется код:
    Код (C++):
    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 мА.
    Из-за чего это может быть? в какую сторону смотреть? Что включается в этот момент?
     
  2. ORLENOK

    ORLENOK Гик

    Всем спасибо.
    Проблема решена.