Configurar modo sleep en attiny85 sin librerías y usando Arduino IDE

 Configurar modo sleep en attiny85 sin librerías y usando Arduino IDE.

El modo Sleep está pensado para mantener inactivo el microcontrolador por un tiempo o evento concreto sin que consuma energía. Viene a ser como un apagado por software y en éste post te voy a enseñar como configurarlo usando los registros y un par de comandos de ensamblador en línea sin tener que instalar ninguna librería adicional.

Hay varios modos de Sleep, yo te enseñaré el que he usado que es el de mas bajo consumo, en el que se detiene el reloj del sistema y todos los periféricos sincrónicos quedando solo activas las interrupciones externas para despertarlo.

Durante el tiempo que esté dormido no se perderá el contenido de las variables ni la configuración de registros, y seguirá funcionando el pull-up interno del pin de interrupciones (pin digital 2) si lo tenemos configurado.

Está todo explicado en la hoja de datos.

//////////////////////////////////////////////////////////////////////////////////////////////////

bitWrite(ADCSRA,ADEN,0); // Deshabilitar el ADC 

PRR= B00001111; //apaga timers,adc y detector de baja tención 

MCUCR=B00110000;//Habilita la durmia y define el tipo

attachInterrupt(digitalPinToInterrupt(2),interrupcion,LOW);//Habilita interrupción externa

/*

Con estas líneas quedaría preparado para recibir el comando sleep en ensamblador, en este punto el fabricante recomienda también ejecutar un comando para habilitar todas las interrupciones.

la sintaxis para ejecutar un comando en ensamblador es asm("comando");

*/

   asm( "sei" );//habilita interrupciones

   asm("sleep");//pone a dormir

/* Justo después de ejecutar este ultimo comando el micro queda dormido y solo despertará con una interrupción externa, o retirando la alimentación y volviendo a conectarla.

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

Una vez  despierta hay que dejar la configuración como estaba

*/

     PRR=0;///enciende timers,adc y detector de baja tención

     MCUCR=0;                            //Deshabilita la durmia

     //interrupts();                            //Habilita interrupciones

    bitWrite(ADCSRA,ADEN,1);//Habilita el ADC

    detachInterrupt(digitalPinToInterrupt(boton)); //Deshabilita la interrupción externa

/*

Haí ya estaría, aunque el fabricante advierte que la primera conversión del ADC después de reactivarlo saldrá mal así que conviene hacerla cuanto antes.

*/

    analogRead(pin);//Lectura fallida


Comentarios