Estoy tratando de reducir el consumo de corriente de mi Atmega328 -Arduino- usando los modos de suspensión. En mi código, quiero activar cada 10ms
, leer el valor de ADC y volver al modo de suspensión nuevamente.
Hay algunas instrucciones útiles ( aquí y aquí ), pero la mayoría de ellas están basadas en Watch Dog Timre o interrupción externa de los pines.
Aquí está el código simplificado mío, pero no funciona (no va a la función del controlador de interrupciones):
En la configuración, me ocupo del temporizador y su controlador:
void setup() {
Serial.begin(19200);
Timer1.initialize(10000); //10ms sampling rate
Timer1.attachInterrupt(ReadMyADC,10000);
power_spi_disable(); // SPI
power_timer0_disable();// Timer 0
}
El resto del código que incluye loop()
es el siguiente:
void ReadMyADC(){
sleep_disable();
PRR = PRR & 0b00000000;
Serial.print("sth");
power_adc_enable(); // ebable ADC converter
//Read ADC
power_adc_disable();
}
void loop() {
// ----------------low power ---------------
PRR = PRR | 0b00100000;
sleep_enable();
set_sleep_mode(SLEEP_MODE_STANDBY);
EIMSK |= _BV(INT0); //enable INT0
ADCSRA = 0; //disable ADC
cli();
mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE); //turn off the brown-out detector
mcucr2 = mcucr1 & ~_BV(BODSE);
MCUCR = mcucr1;
MCUCR = mcucr2;
sei(); //ensure interrupts enabled so we can wake up again
sleep_cpu(); //go to sleep
sleep_disable(); //wake up here
Serial.print("Wake\n");
}
Aparentemente, el temporizador 1 no puede salir de la CPU desde el modo de suspensión. ¿Tiene alguna idea de cómo gestionar eso o dónde está el problema?