Paso 8: dormir
Una de las primeras cosas a hacer es ejecutar el micro en el reloj más lento usted puede mientras que mantener el código haciendo su trabajo, otra cosa es poner el micro a dormir cuando no lo necesitas.
Si grabas un sensor lento o basta con tomar muestras cada cierto tiempo, usted podría ser capaz de dormir por largos períodos de tiempo y ahorrar un montón de energía.
Cuando pones tu micro a dormir te necesita alguna manera de despertarla, o no podrás hacer nada.
Tienes un par de opciones.
Uno es establecer un temporizador de vigilancia, y la otra es configurar interrupciones.
Un temporizador de vigilancia es un reloj independiente que se ejecuta independientemente de código del micro.
Cuando desborda se puede provocar una interrupción o resetear el micro.
Usted puede usar esto con cualquiera despierta en el futuro, o se puede utilizar para sacarte de código en un bucle infinito.
Sólo vamos a centrar en despertar el chip de aquí.
La otra opción, una interrupción de pin es la capacidad de tener tras micro hasta cuando algo sucede en los pernos del IO de interrupción.
En el poder por el modo, la interrupción sólo se activa cuando el pin va bajo (como cuando se pulsa por ejemplo un botón), pero en modo de espera puede interrumpir en un cambio en estado del perno (como ir desde baja a alta o viceversa).
Por lo tanto, ahora sabemos acerca de maneras de salir del sueño, ¿cómo entrar en ella?
Aquí está un ejemplo de código adjunto:
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
Despierta
sleep_disable();
MCUSR = 0;
Establece el modo primero y luego set sueño activado, seguida de una llamada a sleep_cpu.
El proceso se divide en pasos como este para evitar que código malo accidentalmente en sueño.
Es en este punto que el micro estará dormido.
Cuando es despertado por una de las fuentes mencionadas, continúa, donde usted debe desactivar la opción de dormir inmediatamente (otra vez, para protegerse contra código malo).
La línea de final elimina la causa de la puesta a cero (como el temporizador de vigilancia).
Así que, ¿cómo configuramos el temporizador del vigilante?
WDTCSR | = (1 << WDP2) | (1 << WDP1) | (1 << WDP0) | (1 << WDIE);
Los 3 primeros valores la cantidad de tiempo hasta el vigilante de incendios (página 43 en la hoja de datos), en este ejemplo es 2 segundos (una vez más, aproximadamente).
El último que permite la interrupción de la vigilancia.
Esto debe hacerse antes de entrar en modo de espera como en el ejemplo de código.
Usted necesitará un controlador de interrupción para el guardián de la fuente así:
ISR(WDT_OVERFLOW_vect)
{
LED_TOGGLE;
}
Puede dejar vacío si todo lo que quieras es para el microcontrolador.
Un último paso es habilitar interrupciones globalmente llamando sei(); en el comienzo de su código.
En cuanto a interrupciones del pin, cubrimos en un paso posterior.
Si construir el circuito en la imagen y utiliza el código adjunto, cada 2 segundos el LED cambiará, y mientras tanto el micro irá a dormir para ahorrar energía.