Vous êtes sur la page 1sur 18

Le watchdog

Le watchdog, ou chien de garde est un mcanisme de protection de votre programme. Le rle du Watchdog est de "rseter" le micro contrleur si l'on ne remet pas zro priodiquement un registre interne grce l 'instruction clrwdt (clear watchdog), si le programme tourne par exemple dans une boucle sans fin, il ne peut remettre 0 le chien de garde et ainsi le micro contrleur se reset afin de relancer le programme
Le principe de fonctionnement La mise en service ou larrt du watchdog se dcide au moment de la programmation de PIC, laide de la directive _CONFIG. Si le paramtre _WDT_OFF est prcis, le watchdog ne sera pas en service. Si au contraire vous prcisez _WDT_ON , le watchdog sera actif. IL NEST DONC PAS POSSIBLE DE METTRE EN OU HORS SERVICE LE WATCHDOG DURANT LEXECUTION DE VOTRE PROGRAMME.

Le fonctionnement du watchdog est li un timer interne spcifique, qui nest pas synchronis au programme, ni un vnement extrieur.

La dure spcifique de dbordement de ce timer est approximativement de 18ms.


Cette valeur varie en fonction de diffrents paramtres comme la tension dalimentation ou la temprature. La valeur minimale de 7ms est celle que vous devrez utiliser dans la pratique. Chaque fois que linstruction clrwdt est envoy la PIC, le timer du watchdog est remis 0.

Si par accident cette instruction nest pas reue dans le dlai prvu, la PIC est redmarre ladresse 0x00 et le bit TO du registre STATUS est mis 0.
TO: Time-out bit 1 = aprs la mise sous tension 0 = WDT time-out

En lisant ce bit au dmarrage, vous avez donc la possibilit de dtecter si la PIC vient dtre mise sous tension, ou si ce dmarrage est du un plantage de programme. Le prdiviseur et le watchdog Nous avons vu que le prdiviseur pouvait tre affect au tmr0 ou au watchdog, via le bit PSA du registre OPTION. Si nous dcidons de mettre le prdiviseur sur le watchdog (PSA = 1), le tableau (vu prcdemment) nous donnera les valeurs du prdiviseur obtenues suivant les bits PS0/PS2.

Ce prdiviseur multiplie le temps de dbordement du timer du watchdog.


Par exemple, avec un prdiviseur de 2, vous obtenez un temps minimal de 7ms*2 = 14ms. Donc, avec un quartz de 4MHz, cela vous oblige envoyer linstruction clrwdt au moins une fois tous les 14.000 cycles dinstructions. Dans la plupart des cas, le reset seffectuera en ralit aprs 18ms*2 = 36ms, soit 36.000 cycles dinstructions. Les rles du watchdog Le watchdog est destin vrifier que votre programme ne sest pas gar dans une zone non valide de votre programme (parasite sur lalimentation par exemple), ou sil nest pas bloqu dans une boucle sans fin.

Il sert galement rveiller une PIC place en mode sleep , ce que nous verrons plus tard.

Utilisation correcte du watchdog La premire chose faire, si vous dsirez profiter de cette protection intgre,

est de paramtrer la _CONFIG pour la mise en service du watchdog.

La premire chose constater,


cest que si vous indiquez _WDT_ON pour un programme qui ne gre pas le watchdog, celui-ci redmarrera sans arrt, et donc ne fonctionnera pas, car il ne contiendra aucune instruction clrwdt .

Ensuite, vous devez placer une ou plusieurs instructions clrwdt dans votre programme en vous arrangeant pour quune instruction clrwdt soit reue dans les dlais requis par votre PIC.
A ce propos, ne tenez pas compte du temps nominal de 18ms, mais plutt du temps de la situation la plus dfavorable. Ce temps est de minimum 7ms. En prenant ce temps comme temps maximum autoris, vous tes certain que votre programme fonctionnera dans toutes les conditions. Ce quil ne faut pas faire Souvenez-vous quune interruption interrompt le programme et branche ladresse 0x04. Une fois linterruption termine, le programme est reconnect lendroit o il se trouvait, mme si cest hors de votre zone normale de programme.

Donc, si vous placez une instruction clrwdt dans une routine dinterruption, cette instruction risque de sexcuter mme si votre programme est plant.

Cest donc le contraire du but recherch. En consquence :


IL NE FAUT JAMAIS UTILISER LINSTRUCTION CLRWDT DANS UNE ROUTINE DINTERRUPTION.

Mesure du temps rel du watchdog


Dans un premier temps, ne touchez pas la _CONFIG Modifiez la valeur du registres OPTION OPTIONVAL EQU B'10001111'

; Valeur registre option ; Rsistance pull-up OFF ; prscaler Wdt = 128

Ensuite, supprimez la variable cmpt3 et modifiez la routine tempo pour enlever la boucle extrieure.
; SOUS-ROUTINE DE TEMPORISATION ; Cette sous-routine introduit un retard de 250ms. ; Elle ne reoit aucun paramtre et n'en retourne aucun tempo clrf cmpt2 ; effacer compteur2 boucle2 clrf cmpt1 ; effacer compteur1 boucle1 nop ; perdre 1 cycle decfsz cmpt1 , f ; dcrmenter compteur1 goto boucle1 ; si pas 0, boucler decfsz cmpt2 , f ; si 0, dcrmenter compteur 2 goto boucle2 ; si cmpt2 pas 0, recommencer boucle1 return ; retour de la sous-routine

Modifions pour finir le programme principal pour quil allume la LED aprs 250ms :
; start call bsf loop goto END PROGRAMME PRINCIPAL tempo LED loop ; on attends 250ms ; allumer la LED ; on reste ici ; directive fin de programme

Que se passe-t-il ? Et bien, aprs approximativement seconde, la LED sallume, et cest tout. Cest bien ce que nous avions prvu. Modifiez maintenant la ligne _CONFIG pour mettre le watchdog en service : __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC

Que se passe-t-il ? Et bien maintenant la LED clignote. et le temps sparant deux allumages est approximativement 2.2 secondes. Explication

Et bien, notre watchdog na pas t remis zro depuis le dmarrage de la PIC.


Donc, une fois le temps : dure de base * prdiviseur atteint, un reset est provoqu qui entrane une extinction de la LED et un redmarrage. Pour connatre la base de temps de notre watchdog dans les circonstances actuelles de tension et de temprature, nous devons donc diviser le temps entre 2 allumages par le prdiviseur, cest dire 128. 2,2 secondes. Donc, notre watchdog travaille avec un temps de base de : 2200ms / 128 = 17,2 ms. On est donc bien dans les environs des 18ms typiques annonces.

Simulation du plantage dun programme Watchdog off Changez la ligne de configuration :


OPTIONVAL EQU H'000F' ; Valeur registre option ; Rsistance pull-up ON, Prscaler wdt 128

et le DEFINE
#DEFINE BOUTON PORTB,0 ; bouton-poussoir

Modifiez ensuite votre programme principal :


start

bsf call bcf call btfsc goto


plante goto ; arriver ici END

LED tempo LED tempo BOUTON start

; allumer la LED ; appeler la tempo de 0.5s ; teindre LED (LEDOFF) ; appeler la tempo de 0.5s ; tester bouton-poussoir ; pas press, boucler

plante ; le programme n'est pas sens ; simulation de plantage ; directive fin de programme

De cette manire, une pression du bouton-poussoir envoie le programme dans une zone que nous avons cre et qui simule un plantage du programme sous forme dune boucle sans fin.
la LED clignote. Maintenez un instant le bouton-poussoir enfonc, la LED sarrte de clignoter, le programme est dans une boucle sans fin qui simule dans notre cas le plantage suite, par exemple, un parasite qui a ject notre programme hors de sa zone de fonctionnement normal. Correction avec utilisation du watchdog Modifions maintenant notre programme. Tout dabord, nous mettons le watchdog en service, comme vu prcdemment dans la _CONFIG. Nous allons ensuite nous arranger pour remettre notre watchdog 0 intervalles rguliers.

Voici donc notre programme principal modifi :

start bsf clrwdt call bcf clrwdt call btfsc goto plante goto plante ; le programme n'est pas sens ; arriver ici ; simulation de plantage ; directive fin de programme LED tempo LED tempo BOUTON start ; allumer la LED ; effacer watchdog ; appeler la tempo de 0.5s ; teindre LED (LEDOFF) ; effacer watchdog ; appeler la tempo de 0.5s ; tester bouton-poussoir ; pas press, boucler

END

Nous avions programm notre watchdog avec un prdiviseur de 128, ce qui nous impose denvoyer une commande clrwdt toutes les 7*128 ms, soit toutes les 896ms. Comme lappel notre tempo prend 500ms, nous devrons donc envoyer clrwdt avant ou aprs chaque appel de tempo, pour ne pas dpasser ce temps.

Nous aurions pu, au lieu de ces 2 instructions, utiliser un seul clrwdt dans la sous-routine tempo . La LED clignote toujours.

Pressez le bouton quelques instants, la LED sarrte de clignoter un instant, puis recommence de nouveau. Le watchdog a rcupr le plantage de votre programme. Choix de la valeur du prdiviseur
En gnral, il faut essayer de calculer le prdiviseur de faon ne pas devoir placer de commande clrwdt en de trop nombreux endroits.

Il faut galement tenir compte du temps de raction obtenu en augmentant le prdiviseur.

Vous naurez cependant pas toujours le choix. Si votre prdiviseur est dj occup pour le timer0, par exemple, il ne vous restera pas dautres choix que denvoyer une commande clrwdt toutes les 7ms.
Dans le cas prsent, vous auriez du placer une instruction de ce type au cur de la routine de temporisation, car celle-ci dure plus de 7ms. Rappelez-vous de ne pas utiliser cette instruction dans une routine dinterruption, car cela est contraire au principe mme du watchdog.

Vous pouvez par contre utiliser clrwdt dans une sous-routine sans aucun problme.
Temps typique, minimal, et maximum

Nous avons vu apparatre plusieurs notions de temps de watchdog.


Il est important de bien effectuer la distinction entre les diffrentes valeurs :

Le temps typique (18ms) est le temps que met EN GENERAL le watchdog pour provoquer le reset de votre programme en cas de plantage. Cest donc le temps de raction normal (ou typique) du watchdog Le temps minimal (7ms), cest le dlai maximum dont vous disposez entre 2 instructions clrwdt pour viter un reset de votre programme non dsir. Le temps maximum (33ms), cest le temps de raction du watchdog dans le cas le plus dfavorable en fonction du composant et des conditions dutilisation. Microchip vous garantit ici que le reset seffectuera au maximum en 33 ms.
Conclusion Vous tes maintenant en mesure de crer des programmes rsistants aux plantages classiques, pour peu que vous utilisiez judicieusement le watchdog.

ATTENTION : Le watchdog utilis en protection dans le cas dune programmation correcte ne devrait jamais entrer en fonctionnement.
Il nagira donc en gnral que dans de trs rares occasions (parasites, orage). Il ne doit pas servir masquer une erreur de conception de votre programme. Celui-ci doit pouvoir fonctionner sans le secours du watchdog (vrifiez en le mettant hors-service durant vos essais).