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)