Étape 8: dormir
Une des premières choses à faire est gérée le micro à l’horloge plus lente, vous pouvez tout en gardant le code fait son travail, l’autre chose est de mettre le micro en veille lorsque vous n’avez pas besoin.
Si vous enregistrez un capteur lent ou si vous avez seulement besoin de prélever des échantillons de temps en temps, vous pourriez être en mesure de dormir pendant de longues périodes de temps et d’économiser beaucoup d’énergie.
Quand vous mettez votre micro pour dormir vous besoin d’un moyen de réveiller, ou vous ne serez pas en mesure de faire quoi que ce soit.
Vous avez deux options.
On doit définir un temporisateur, et l’autre est aux interruptions de programme d’installation.
Un temporisateur est une horloge distincte qui s’exécute indépendamment de code de la micro.
Lorsqu’elle déborde elle peut déclencher une interruption ou réinitialiser le micro.
Vous pouvez utiliser ce soit réveiller quelque temps dans le futur, ou vous pouvez l’utiliser pour vous sortir de code qui se trouve dans une boucle infinie.
Nous allons seulement se concentrer sur la puce ici se réveiller.
L’autre option, une interruption de la goupille est la possibilité d’avoir la suite micro vers le haut quand quelque chose arrive sur les broches d’e/s d’interrupt.
Au pouvoir, le mode, l’interruption ne se déclenche que lorsque la broche est faible (comme quand un bouton est pressé par exemple), mais en mode veille, vous pouvez interrompre sur un changement d’état de la broche (par exemple, allant de faible à élevé, ou vice versa).
Donc, nous savons maintenant sur les moyens de sortir du sommeil, Comment obtenons-nous dedans ?
Voici un exemple de code ci-joint :
set_sleep_mode(SLEEP_MODE_PWR_DOWN) ;
sleep_enable() ;
sleep_cpu() ;
Réveil
sleep_disable() ;
MCUSR = 0 ;
Nous avons mis le mode tout d’abord et puis définissez sommeil activé, suivie d’un appel à sleep_cpu.
Le processus est divisé en étapes comme cela pour empêcher l’entrée accidentellement sommeil de mauvais code.
C’est à ce moment que le micro sera endormi.
Quand il est réveillé par une des sources mentionnées ci-dessus, il continue, où vous devez désactiver l’option de dormir immédiatement (encore une fois, pour se protéger contre le mauvais code).
La ligne finale efface la cause de la remise à zéro (par exemple le temporisateur).
Alors, comment nous configurons le temporisateur ?
WDTCSR | = (1 << WDP2) | (1 << WDP1) | (1 << WDP0) | (1 << WDIE) ;
Les 3 premières valeurs allumer le laps de temps jusqu'à ce que le chien de garde (page 43 sur la feuille de données), dans cet exemple, c’est 2 secondes (encore une fois, environ).
Le dernier d'entre eux permet l’interruption de chien de garde.
Cela devrait être fait avant d’entrer dans le mode "veille" comme dans l’exemple de code.
Vous aurez besoin de fournir un gestionnaire d’interruption pour le chien de garde comme suit :
ISR(WDT_OVERFLOW_vect)
{
LED_TOGGLE ;
}
Vous pouvez laisser vide si tout ce que vous voulez est de réveiller le microcontrôleur.
Une dernière étape consiste à activer les interruptions au niveau mondial en appelant sei() ; au début de votre code.
En ce qui concerne les interruptions de NIP, nous allons couvrir que dans une étape ultérieure.
Si vous générez le circuit dans l’image et utilisez le code ci-joint, toutes les 2 secondes, la LED va basculer, et en attendant le micro mettra en veille pour économiser l’énergie.