Hi,
I am new to this forum, and quite rather new to atmel world (I started few months ago before I was playing with pic)
Actually, I would like to test some sleep mode. And am trying very interesting Nick Gammon sketches.
I am facing a problem. Here the little story :
- I removed regulator and led from arduino mini pro
- I changed optiboot config v6.2 : InternalRc 8Mhz, BOD=1.8V, compiled with arduino v1.0. Fuses settings by usbasp and avrdudess. upload bootloader with Arduino ide 1.6.0 It is working ok. Upload sketch by ftdi. Ok.
- Now I would like to test sketch J from Nick Gammon, to wake up from a pin. It wakes up ok and go to sleep like it should do.
Here my problem, I noticed that after going into sleep mode, I cannot reupload a sketch by ftdi : error recv!!! If I try to reset with reset button of arduino. Same thing! So I have to reconnect usbasp and reprogram bootloader as the fuses have not changed (checked with avrdudess).
If i comment the lines about MCUCR, I have no problem. Uploading sketches works ok, but power consumption is not same (with bod:18uA, without BOD: 140nA).
So, I think these 2 lines are scraping my bootloader config, registers or RST interrupt... so I cannot reupload by ftdi...I am not sure what happens.
I will check in datasheet if I can find my answer, but in case someone knows it, could you explain me what I am doing wrong (maybe I must restore some params, int ???, when is RST int detected???).
Here example code :
#include <avr/sleep.h>
// MOSFETS
// A1 : POWER RF
// D4 : POWER SENSORS, VCC3.3
// D3 : Supervisor Interrupt for wake up chip
// D5 : Output -> DC Booster 3V Enable (true=enable, false=disable)
// A0 : sense storage capacitor voltage on vcc3
// A2 : sense VIN voltage
#define SUPERVISOR_IRQ_PIN 3
#define SUPERVISOR_IRQ SUPERVISOR_IRQ_PIN-2
#define POWER_RF A1
#define POWER_SENSORS 4
#define ENABLE_BOOSTER3 5
#define CAPAVCC_ADC A0
#define VIN_ADC A2
volatile unsigned long wakeUpCounter=0;
//*************************************************************************************
void wakefromPinInt()
{
// cancel sleep as a precaution
sleep_disable();
// must do this as the pin will probably stay low for a while
detachInterrupt (SUPERVISOR_IRQ);
wakeUpCounter++;
}
void setup()
{
// D3 : Supervisor Interrupt for wake up chip
// A1 : POWER RF
// D4 : POWER SENSORS, VCC3.3
// A0 : sense storage capacitor voltage on vcc3
// A2 : sense VIN voltage
pinMode(SUPERVISOR_IRQ_PIN, INPUT_PULLUP);
pinMode(POWER_RF, OUTPUT);
digitalWrite(POWER_RF, 1);
pinMode(ENABLE_BOOSTER3, OUTPUT);
digitalWrite(ENABLE_BOOSTER3, 1);
pinMode(POWER_SENSORS, OUTPUT);
digitalWrite(POWER_SENSORS, 1);
Serial.begin(115200);
//Serial.println("Setup end");
}
void loop()
{
Serial.println("Go To Sleep");
UlpPowerDown();
Serial.begin(115200);
Serial.println("Im wake up.");
ADCSRA = 135;
delay(100);
int vinValue = analogRead(VIN_ADC);
// print out the value you read:
Serial.println(vinValue);
// delay, so I can test power consumption on wake up
delay(10000) ;
}
void UlpPowerDown() {
Serial.flush();
Serial.end();
delay(100);
// disable ADC
ADCSRA = 0;
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
// Do not interrupt before we go to sleep, or the
// ISR will detach interrupts and we won't wake.
noInterrupts ();
// will be called when pin D2 or D3 goes low
attachInterrupt (SUPERVISOR_IRQ, wakefromPinInt, LOW);
// turn off brown-out enable in software
// BODS must be set to one and BODSE must be set to zero within four clock cycles
MCUCR = bit (BODS) | bit (BODSE);
// The BODS bit is automatically cleared after three clock cycles
MCUCR = bit (BODS);
// We are guaranteed that the sleep_cpu call will be done
// as the processor executes the next instruction after
// interrupts are turned on.
interrupts (); // one cycle
sleep_cpu (); // one cycle
}
See you soon