Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Watchdog et mode sleep
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 17 janv. 2021 11:00 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Watchdog et mode sleep
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 17 janv. 2021 16:28 lien vers la Data-Sheet : Cliquez ici

Bonjour Jérémy, et tout le forum,

Pour le réglage des temps pour le watchdog c'est le registre WDTCON qui peut aller de 1ms à 256s.

WDTCON-1.jpg


_WDTE_OFF watchdog et hors service
_WDTE_SWDTEN watchdog et contrôlé par le bit SWDTEN dans le registre WDTCON
_WDTE_NSLEEP watchdog activé pendant l'exécution et désactivé en mode veille
_WDTE_ON watchdog et en service

La mise en service ou l’arrêt du watchdog se décide au moment de la programmation du PIC

Donc, c'est vrai qu'il n'est pas possible d'éteindre le watchdog en cours du programme, mais tu peux rallonger les temps

Chaque fois que l’instruction clrwdt est envoyé au PIC, le timer du watchdog est remis à 0

Il ne faut jamais utiliser l’instruction clrwdt dans une routine d’interruption.

Je vais réfléchir si je vois une solution à ton problème, sinon il y les interruptions de réveille par Pin.

Ça c'est ce que j'ai appris avec notre maître ASM, à lire le cours 1 de monsieur Bigonoff, Dommage qu'il n'existe pas un Bigonoff en C :-D

Jérémy a écrit :Source du messagel'instruction asm CLRWDT ; dans la boucle principale


:bravo: Jérémy ce mets à ASM, c'est Gérard qui va être content..... dehors!!


==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités