Baseline test with current sleep mode on my RF transmitter is 1.09mA, with highest current seen on my multimeter of 14.25mA during virtualwire transmission of 1 commanded byte (and however many bytes virtualwire adds to it for).Now to add the other power down methods & see what happens:

Well, that sorta worked.At initial power on, & first time entering sleep mode, current dropped to 0.99mA.However, after the first key press/transmission, it jumped to 10.49mA after the send and stayed there.Don't have the receiver with me so I can't tell if its still transmitting - the LED on D13 just stays on vs turning off after the transmission.

Did I get the code in the right place? And do I need to re-enable some part of it when I want to wake up for the next transmission?

// *********************************************************************** // Initialise the IO and ISR for VirtualWire vw_setup(4000); // Bits per sec - had to double from 2000 with 8MHz 3.3V Pro-Mini

} // end of void Setup()

// ***********************************************************************// Main loop for reading the keypad and sending the button pushed out// (with a unique address to be added eventually by reading 0-F from currently unused pins)

void loop(){ if (sleep_count>1000){ // check if we should go to sleep because of "time" --> Try shorter versions of this sleep_count=0; // turn it off for when we wake up// Serial.println("Sleep"); // for debug only // set the columns low before sleeping, otherwise Keypad leaves them high and Rows have nothing to pull low. digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); delay(100); // need this? enterSleep(); // call Sleep function to put us out

// THE PROGRAM CONTINUEs FROM HERE after waking up in enterSleep() } // end of checking to go to sleep

// go read the keypad char key = keypad.getKey(); // reading the keypad if(key) // same as if(key != NO_KEY)- did something change? { msg[0]=key; // load the array with the key character // msg[1]=NULL; // Rx side seems to work without this

2. Be more selective in what you power-down. The timers, for example, will not consume power while the processor is in SLEEP_MODE_PWR_DOWN simply because the processor clock will be stopped. At a minimum, DON'T power-down the three timers.

okay, read the Power Reduction Register part of the datasheet. Not really clear to me which part is keeping it from operating normally, so I just reset all of them on the interrupt and that seems to have it working normally.

Sleeping now comsumes 0.99mA. 1000mAH LiPo battery should go quite a while between charges now!

For my sleepy applications I modify the core so the ADC is never enabled and only Timer 0 is started. This seems to give about the same results as mucking with the PRR register with the benefit of not having to muck with the PRR register.

Bit 7 - PRTWI: Power Reduction TWI -> power_twi_disable(); power_twi_enable();Writing a logic one to this bit shuts down the TWI by stopping the clock to the module. Whenwaking up the TWI again, the TWI should be re initialized to ensure proper operation.

• Bit 6 - PRTIM2: Power Reduction Timer/Counter2 -> Not Listed!Writing a logic one to this bit shuts down the Timer/Counter2 module in synchronous mode (AS2is 0). When the Timer/Counter2 is enabled, operation will continue like before the shutdown.

• Bit 5 - PRTIM0: Power Reduction Timer/Counter0 -> Not Listed!Writing a logic one to this bit shuts down the Timer/Counter0 module. When the Timer/Counter0is enabled, operation will continue like before the shutdown.

• Bit 3 - PRTIM1: Power Reduction Timer/Counter1 -> Not Listed!Writing a logic one to this bit shuts down the Timer/Counter1 module. When the Timer/Counter1is enabled, operation will continue like before the shutdown.

• Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface -> power_spi_disable(); power_spi_enable();If using debugWIRE On-chip Debug System, this bit should not be written to one.Writing a logic one to this bit shuts down the Serial Peripheral Interface by stopping the clock tothe module. When waking up the SPI again, the SPI should be re initialized to ensure properoperation.

• Bit 1 - PRUSART0: Power Reduction USART0 -> power_usart0_disable(); power_usart0_enable();Writing a logic one to this bit shuts down the USART by stopping the clock to the module. Whenwaking up the USART again, the USART should be re initialized to ensure proper operation.

• Bit 0 - PRADC: Power Reduction ADC -> power_adc_disable(); power_adc_enable();Writing a logic one to this bit shuts down the ADC. The ADC must be disabled before shut down.The analog comparator cannot use the ADC input MUX when the ADC is shut down.

CrossRoads, 0.99 mA seems a bit too much for the power-down mode. Are you powering your RF interface down too?

My board, RF circuitry included (CC1101), consumes less than 6 uA in Power-Down state. Watchdog enabled. If I wanted to wake up the atmega from an external INTX pin instead of the watchdog, I should be able to reduce the consumption down to 0.2 uA.

I don't think I have a way to do that without adding more hardware to cut power to the transmitter.I have a promini.The power-LED draws a little.The Max1811 might draw some too.Power goes from the battery to the VCC pins.