ATMEGA 328 power down mode

Hi

I try to put ATMEGA 328 (8Mhz, 3.3V) in power down sleep mode... and I can't. I always have a supply current of about 150uA when the datasheet says less than 10.

I made a careful calibration of the voltmeter (10^12 Ohm) and made the test with 3 different chips.

I guess that there is a mistake in the code, but I dont see what...

thx for help

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

#define LED  13 // 4 DETS
#define REED 5  // 3 DETS


ISR(WDT_vect)                      // ISR interrupt service for MPU INT WDT vector
{
}

void blk(uint8_t nbblk)
{
  pinMode(LED,OUTPUT);
  for(int i=0;i<nbblk;i++){digitalWrite(LED,HIGH);delay(1);digitalWrite(LED,LOW);delay(150);}
  pinMode(LED,INPUT); 
}


void wdtSetup(uint8_t durat)  // (0-9) durat>9 for external wdt on INT0 (à traiter)
{
// datasheet page 54, Watchdog Timer.

    noInterrupts();

/*  MCUSR MCU status register (reset sources)(every bit cleared by writing 0 in it)
 *   WDRF reset effectué par WDT
 *   BORF ------------------ brown out detector
 *   EXTRF ----------------- pin reset
 *   PORF ------------------ power ON
*/
  MCUSR &= ~(1<<WDRF);  // pour autoriser WDE=0

/*  WDTCSR watchdog timer control
 *   WDIF watchdog interrupt flag (set when int occurs with wdt configured for) (reset byu writing 1 or executing ISR(WDT_vect))
 *   WDIE watchdog interrupt enable
 *   WDE  watchdog reset enable
 *        WDE  WDIE   Mode
 *         0    0     stop
 *         0    1     interrupt
 *         1    0     reset
 *         1    1     interrupt then reset (WDIE->0 lors de l'interruption, retour au mode reset)
 *       !!!! fuse WDTON forces reset mode if 0 !!!!
 *   WDCE watchdog change enable (write enable 0 to WDE and prescaler update ; auto cleared after 4 cycles)
 *   WDP[3:0] prescaler 2^(0-9)*2048 divide WDT oscillator (f=128KHz p*2048=16mS)
 *
 *   wdr instruction resets timer (wdt_reset();)
 *   
 *   power down supply current for ATMEGA 328P page 594 : typically 4,5 uA at 3,3V 25°C with watchdog enabled (about 6,5 at 5V)
 *   
 *   idle supply current for ATMEGA 328P page 591 : typically labout 0,7mA at 3,3V 8MHz 
 *   
 *   
 */

// WDT prescaler - WDP3-0 bits (msec)

#define T16   0b00000000
#define T32   0b00000001
#define T64   0b00000010
#define T125  0b00000011
#define T250  0b00000100
#define T500  0b00000101
#define T1000 0b00000110
#define T2000 0b00000111
#define T4000 0b00100000
#define T8000 0b00100001

    WDTCSR = (1<<WDCE) | (1<<WDE);    // WDCE ET WDE must be 1
                                      // to write WDP[0-3] and WDE in the following 4 cycles
    WDTCSR = (1<<WDIE) | durat;       // WDCE must be 0 ; WDE=0, WDIE=1 interrupt mode, TXXX 

  interrupts();
}

void sleepPwrDown(uint8_t durat)
{
    wdtSetup(durat);                      // setup register for sleep with int end
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
    power_adc_disable();                  // low power
    sleep_enable();

    sleep_mode();                         // sleep begin

    sleep_disable();
    power_all_enable();
}

void setup() {
    
    Serial.begin(115200);
    Serial.println("test sleep ready");
    
    blk(3);                       // 3 blinks -> setup ok
    delay(1000);
}

void loop() {

  blk(1);                         // 1 blink

  pinMode(REED,INPUT_PULLUP); 
  if(digitalRead(REED)){          // if reed off (pullup high) 8s sleep before next blink
    pinMode(REED,INPUT);          // low power
    sleepPwrDown(T8000);}
  else delay(1000);               // else 1 sec delay before next blink

}

I dont know why the above link on the pdf file doesnt works...

power test ATMEGA.pdf (72.6 KB)

power test ATMEGA.pdf (72.6 KB)

thx to jremington for the link to this tuto on atmega power saving

subject is close