Pages: [1]   Go Down
Author Topic: Sleep et Watchdog avec ATtiny85  (Read 504 times)
0 Members and 1 Guest are viewing this topic.
Strasbourg
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut les gens, j'ai un petit projet en cours et pour le moment j'essaye de comprendre un peu le fonctionnement de la mise en veille et du réveil d'un ATtiny85 pour éviter de pomper trop de jus durant les quelques seconde pendant lesquels mon projet ne va rien faire....
J'ai essayé de voir ça avec une simple LED qui clignote s'allume durant deux seconde puis s’éteint, lancant le mode dodo et chien de garde de l'ATtiny85, je penses plus ou moins avoir compris, mais j'aimerais avoir un avis externe sur ce que j'ai pas bien fait ou pas fait comme il fallait.
Donc voila le code
Code:
#include <avr/sleep.h>
#include <avr/wdt.h>

#define LED_Pin PORTB // Registre du PORTB Définit en Ecriture et Lecture
#define Led 0 // Définit le pin de la Led IR

int WDP_Set; // Réglage WDP (bit de réglage délais de veille)

void setup(){
Set_Time(7); // Réglage du délais de veille: 0=16ms, 1=32ms, 2=64ms, 3=125ms, 4=250ms, 5=500ms, 6=1 sec, 7=2 sec, 8=4 sec, 9= 8sec
DDRB |= _BV(Led); // Met le pin Led en OUTPUT
OSCCAL = 0x56; // Calibration Oscillateur Interne de l'ATtiny85, voir Tiny Tuner
ADCSRA = 0; // Désactive l'ADC (Analog to Digital Converter) pour économiser du courant en mode veille
}

void loop(){
     LED_Pin |= _BV(Led); // Met le Pin à l'état haut
     delay(2000);
     LED_Pin &= ~_BV(Led); // Met le Pin à l'état bas
DDRB &= ~_BV(Led); // Mets le port de la Led en INPUT pour économiser du courant
     Veille(); // Mise en veille de l'ATtiny
   DDRB |= _BV(Led); // Remet le port en OUTPUT
}

void Set_Time(int i){ // Conversion valeur du délais de veille en Décimal pour régler les bits WDP
if ( i > 7 ) WDP_Set = ( i * 4 ) ;
else WDP_Set = i;
}

void Veille() { // Met l'ATtiny en veille, l'ATtiny se réveille quand le délais de veille (watchdog) arrive à 0
MCUSR &= ~(1<<WDRF);  /* Met à 0 le bit "Watchdog Reset Flag" dans le Registre MCU (Registre de statut)
     qui est remis à 1 quand l'ATtiny sort de veille (indicateur sur la façon de sortir du reset)*/
WDTCR = _BV (WDCE) | _BV (WDE); // Régle les bits WDE et WDCE sur 1 du WDTCR (Watchdog Timer Control Register) pour pouvoir configurer les délais de mise en veille
WDTCR = _BV (WDIE) | WDP_Set; /* Met le bit WDIE sur 1, ce qui active l'interruption du watchdog et met le bit WDE à 0, les bits WDP sont réglé et à la fin du délais
configuré le Watchdog fait un reset */
wdt_reset(); // ???
set_sleep_mode (SLEEP_MODE_PWR_DOWN);  //ZZZzz..ZZzzz..Zzz
sleep_enable();
sleep_cpu ();  
sleep_disable();
}

ISR(WDT_vect){ // ??? Vecteur Watchdog lancé à la fin du délais configuré
wdt_disable();  // ???
}


Quelques questions:
-Les commentaires correspondent bien aux commandes?
-le wdt_reset et wdt_disable ont quel incidence sur les registres qu'on manipule pour régler le watchdog , j'ai pas bien saisie ces deux parties?
-si je désactive le ADCSRA dans le setup cela à une grande influence sur le reste du code si je ne me sert pas de conversion analogique vers digital?
-le bout de code que j'ai fait est t'il convenable ou c'est un peu branlant?
-Avec ce bout de code l'ATtiny85 consomme 26.5mA avec la LED allumé et 0.03mA en veille, c'est correct ou je peux encore descendre en veille?

Vala Merci à vous pour vos réponses.

A+
« Last Edit: March 08, 2013, 04:41:23 pm by Arioch » Logged

Pages: [1]   Go Up
Jump to: