MA platine de pilotage des stores bannes est presque finie . Pour le moment je l'alimente en direct avec une alim classique branchée sur le secteur. Par la suite tout se petit monde sera branché dans un boiter, hors de portée de tous ( escabeau).
Mon but est donc de consommé le moins possible. Surtout que par le suite le module volet piscine risque d'être sur pile !!!. Pour ce faire j'ai choisi d'endormir le module radio ET le PIC pendant 2 secondes et de le réveiller pendant 500ms. ceci pour faire des tests dans un premier temps; j'affinerai les valeurs des temps par la suite ( veille profonde et somnambule).
Je voudrais vous montrer ma procédure ( qui fonctionne) de mise et en veille et du réveil de mon pic en utilisant le watchdog. Peut être pourriez partager une procédure plus "fonctionnelle", car je ne suis vraiment pas accoutumé de cette procédure
J'ai le timer 0 qui toutes les 5 secondes lève le flag F_Seep . cela signifie que c'est l'heure de s'endormir. je vous met que la partie intéressante du programme mais s'il faut je vous mettrais tous!
Code : Tout sélectionner
while (1){
// je met le module en veille
// SWDTEN_bit = 1; // j'active le watchdog
// asm sleep ; // j'endors le PIC pour 2 secondes et il se reveilera grace au watchdog
// je reveil le module radio
// je lance de timer de reveil environ
if (F_Sleep == 1){ // C'est l'heure de dormir
F_Sleep = LED = 0;
Sleep_mode_on(); // je met le module radio en veille avanbt d'eteidnre les INT
GIE_bit = 0; // j'eteins les int
SWDTEN_bit = 1; // j'active le watchdog configurer sur 2s
asm CLRWDT ;
asm sleep ; // j'endors le PIC pour 2 secondes et il se reveilera grace au watchdog pour uneb durer determiner par le timer 0
asm nop ;
SWDTEN_bit = 0; // J'éteins le watchdog
Sleep_mode_off(); // Je réveil le module radio
TMR0 = 61; // TMR0 Preload = 61
CPT_100ms = Valeur = 0;
GIE_bit = 1;
LED=1;
}
asm CLRWDT ;
// reception d'une donnée
if (F_DATA_OK == 1){
F_DATA_OK =0; // raz flag
// je dois effacer le compteur de sommeil
switch (DATA){
case STOP_Ban : Montee_D = Montee_G = Descend_D = Descend_G = 0; break;// j'éteins les moteurs
case Monte_Ban_G : Montee_G = 1; /*allume un compteur de seconde*/ break;
case Descend_Ban_G : Descend_G = 1; /*allume un compteur de seconde*/ break;
case Monte_Ban_D : Montee_D = 1; /*allume un compteur de seconde*/ break;
case Descend_Ban_D : Descend_D = 1; /*allume un compteur de seconde*/ break;
case Monte_Ban_GD : Montee_G = Montee_D = 1; /*allume un compteur de seconde*/ break;
case Descend_Ban_GD : Montee_G = Montee_D = 0; /*allume un compteur de seconde*/ break;
case Reveil : asm nop; break;// compteur de sleep;break;
default: Montee_D = Montee_G = Descend_D = Descend_G = 0;
}
}
}
} LE truc qui me chiffonne, c'est que j’enlève l'instruction asm CLRWDT ; dans la boucle principale, le module ne passe plus en veille ! pourtant au réveil je pense que j'ignore le bit du watchdog avec SWDTEN_bit = 0; . Car il n'ai pas possible je crois d’éteindre le watchdog en cours de programme car le registre se trouve dans le CONFIG1
Toutes lumières est la bienvenue pour éclairer ma chandelle ;
Merci

