lundi 21 mai 2012

utilisation du WDT

Ajourd'hui je vais présenter le Watch Dog Timer (minuterie chien de garde), abrégé WDT dans la suite. Tous les micro-controlleurs même le plus simple possède un périphérique WDT. Ce nom peut paraître curieux pour un périphérique de micro-controlleur mais à l'orgine cette minuterie a été conçu pour contrôler le bon fonctionnement du MCU. Dans ce rôle le logiciel remet le compteur du WDT à zéro à intervalle régulier avant qu'il n'expire. Si il y a une malfonction du système et que la minuterie n'est pas réinitilisé à l'expiration du délais le WDT déclenche un RESET et la routine POST1 au redémarrage du MCU peut vérifier si la réinitialisation a été causé par le WDT et agir en conséquence par exemple en signalant une alarme, d'où le nom du périphérique.
A moins d'être désactivé le WDT fonctionne continuellement même lorsque le MCU est en mode inactif car il possède son propre oscillateur RC. Dans l'exemple que je vais donné il s'agit d'un MCU PIC10F202. Dans tous les projets que j'ai présenté jusqu'ici le WDT était désactivé par la directive de configuration:
__config  _WDTE_OFF
Pour l'activer la directive est:
__config  _WDTE_ON
Lorsque le WDT est actif sa minuterie roule continuellement et lorsque le compteur passe de 0xFF à 0x00 un événement est déclenché. Dans le cas du MCU PIC10F202 si le MCU est en mode exécution il sera réinitialisé par contre s'il est en mode inactif (standby) il est réininitialisé et mis en mode exécution. Dans le registre STATUS il y a 2 bits d'état reliés au WDT le bit /TO pour Time Out et le bit /PD pour Power Down. Lors de la mise sous tension les 2 bits sont mis à 1. Lorsque la minuterie du WDT expire le bit /TO est mis à zéro. Lorque le MCU est en mode exécution et que l'instruction sleep est exécuté, le bit /PD est mis à zéro et le MCU passe en mode inactif. Ces 2 bits sont utilisés pour déterminer quel événement a déclenché une réinitialisation du MCU.

A part sa fonction de chien de garde le WDT peut-être aussi utilisé pour économiser l'énergie. Dans l'exemple très simple que je vais présenté ici c'est ce à quoi il est utilisé. Il y a 2 instructions qui réinitialisent le compteur du WDT, CLRWDT et SLEEP. la première est utilisée lorqu'on veut éviter que le WDT déclenche une réinitialisation du MCU et la deuxième lorsqu'on veut faire passé le MCU en mode inactif. Dans ce dernier cas lorsque la minuterie du WDT expire le MCU réinitialise et repasse en mode normal.

L'utilisation est la suivante, on met le MCU en mode inactif avec l'instruction sleep. Dans ce mode l'oscillateur principal est arrêté et l'exécution est suspendu mais le WDT fonctionne toujours. En mode inactif le MCU dépense environ 150nA ce qui évite de drainer même la plus petite pile. Lorsque la minuterie du WDT expire le MCU réinitialise et exécute à nouveau les instructions à partir de l'adresse 0x00. Dans cet exemple d'un vérificateur de continuité quelques instructions sont utilisées pour vérifier l'état de l'entrée GP3. Si elle est à zéro c'est que les sondes sont en court-circuit et donc que l'appareil est utilisé. Alors le logiciel boucle avec une instruction clrwdt à chaque tour pour éviter que le MCU ne soit réinitialisé par le WDT. Dans cette boucle on vérifie continuellement l'état de l'entrée GP3 et on fait entendre le son qui signale la continuité. Tant que GP3 demeure à zéro la boucle s'exécute sinon ont sort de la boucle et on remet le MCU en mode inactif.

Ce détecteur de continuité peut fonctionner avec une pile au lithium CR2032 et tant que les sondes sont ouvertes il ne dépense qu'une quantité insignifante de courant, la pile peut donc demeurée branchée en permanance. Lorsqu'il n'y pas de diviseur affecté au WDT celui-ci expire à tous les 18 millisecondes. Dans cet exemple j'ai affecté le diviseur au WDT avec un diviseur de 1:16. de sorte que la minuterie du WDT expire à tous les 288 millisecondes. Donc à cet intervalle le MCU repart et l'état sur GP3 est vérifié et si c'est à 1 le MCU est remis en mode inactif. Donc le MCU ne fonctionne que quelques micro-secondes à toutes les 288 millisecondes. Mais pour l'utilisateur c'est comme si l'appareil était toujours en fonction car au moment ou il met les sondes en court-circuit la DEL s'allume et il entend la tonalité. En réalité il y a un délais maximal de 288 millisecondes entre le moment ou il court-circuite les sondes et le moment ou la DEL et la tonalité sont activé. Lorsque les sondes sont en court-circuit, avec une alimentaion de 3 volt le courant est de 12 milli-ampères.

code source

  include <P10F202.INC>
   __config _WDTE_ON & _MCLRE_OFF & _CP_OFF

;;; constantes ;;;;;;;;;;;;;;

#define AUDIO GPIO, GP2
#define PROBE GPIO, GP3
#define LED GPIO, GP0
#define OPTION_INI 0x9C
#define TRIS_INI 0x0A

FREQUENCY EQU .4000 ;
HALF_PERIOD EQU .2000000/FREQUENCY

;;;;;;;;;; macros ;;;;;;;;;;;

delay_us macro delay
   movlw ~(delay/3)
   movwf delay_cntr
   incfsz delay_cntr
   goto $-1
   endm

audio_pulse macro
   bsf AUDIO
   delay_us HALF_PERIOD
   bcf AUDIO
   delay_us HALF_PERIOD
   endm

;;;; variables ;;;;;;;;;;;;;

delay_cntr EQU 8

;;;;; code ;;;;;;;;;;;;;;;;;

   org 0
   btfsc STATUS, NOT_TO ; on initialise OSCCAL
   movwf OSCCAL ; seulement à la mise sous-tension.
   bcf OSCCAL, 0
   movlw OPTION_INI
   option
   movlw TRIS_INI
   tris GPIO
   clrf GPIO

;;;;; procedure principale ;;;;;;
main
   bsf LED
   btfsc PROBE
   goto sleep_mode
   clrwdt
   audio_pulse
   goto main
sleep_mode
   bcf LED
   sleep

   end


Aucun commentaire:

Enregistrer un commentaire