You are on page 1of 18

Le watchdog

Si le paramètre « _WDT_OFF » est précisé. le watchdog sera actif.Le watchdog. le watchdog ne sera pas en service. . à l’aide de la directive _CONFIG. Le rôle du Watchdog est de "réseter" le micro contrôleur si l'on ne remet pas à zéro périodiquement un registre interne grâce à l 'instruction clrwdt (clear watchdog). Si au contraire vous précisez « _WDT_ON ». si le programme tourne par exemple dans une boucle sans fin. ou chien de garde est un mécanisme de protection de votre programme. IL N’EST DONC PAS POSSIBLE DE METTRE EN OU HORS SERVICE LE WATCHDOG DURANT L’EXECUTION DE VOTRE PROGRAMME. il ne peut remettre à 0 le chien de garde et ainsi le micro contrôleur se reset afin de relancer le programme Le principe de fonctionnement La mise en service ou l’arrêt du watchdog se décide au moment de la programmation de PIC.

. La valeur minimale de 7ms est celle que vous devrez utiliser dans la pratique. ni à un événement extérieur. qui n’est pas synchronisé au programme.Le fonctionnement du watchdog est lié à un timer interne spécifique. Chaque fois que l’instruction clrwdt est envoyé à la PIC. Cette valeur varie en fonction de différents paramètres comme la tension d’alimentation ou la température. le timer du watchdog est remis à 0. La durée spécifique de débordement de ce timer est approximativement de 18ms.

Si nous décidons de mettre le prédiviseur sur le watchdog (PSA = 1).Si par accident cette instruction n’est pas reçue dans le délai prévu. vous avez donc la possibilité de détecter si la PIC vient d’être mise sous tension. via le bit PSA du registre OPTION. . ou si ce démarrage est du à un « plantage » de programme. le tableau (vu précédemment) nous donnera les valeurs du prédiviseur obtenues suivant les bits PS0/PS2. TO: Time-out bit 1 = après la mise sous tension 0 = WDT time-out En lisant ce bit au démarrage. Le prédiviseur et le watchdog Nous avons vu que le prédiviseur pouvait être affecté au tmr0 ou au watchdog. la PIC est redémarrée à l’adresse 0x00 et le bit TO du registre STATUS est mis à 0.

Par exemple. Dans la plupart des cas. le reset s’effectuera en réalité après 18ms*2 = 36ms. Il sert également à réveiller une PIC placée en mode « sleep ». vous obtenez un temps minimal de 7ms*2 = 14ms. . soit 36.000 cycles d’instructions.000 cycles d’instructions. avec un quartz de 4MHz. avec un prédiviseur de 2. ou s’il n’est pas bloqué dans une boucle sans fin. ce que nous verrons plus tard. Les rôles du watchdog Le watchdog est destiné à vérifier que votre programme ne s’est pas « égaré » dans une zone non valide de votre programme (parasite sur l’alimentation par exemple).Ce prédiviseur multiplie le temps de débordement du timer du watchdog. Donc. cela vous oblige à envoyer l’instruction clrwdt au moins une fois tous les 14.

Utilisation correcte du watchdog La première chose à faire. c’est que si vous indiquez « _WDT_ON » pour un programme qui ne gère pas le watchdog. et donc ne fonctionnera pas. si vous désirez profiter de cette protection intégrée. car il ne contiendra aucune instruction « clrwdt ». La première chose à constater. est de paramètrer la _CONFIG pour la mise en service du watchdog. celui-ci redémarrera sans arrêt. .

vous êtes certain que votre programme fonctionnera dans toutes les conditions. vous devez placer une ou plusieurs instructions « clrwdt » dans votre programme en vous arrangeant pour qu’une instruction « clrwdt » soit reçue dans les délais requis par votre PIC. En prenant ce temps comme temps maximum autorisé. Ce qu’il ne faut pas faire Souvenez-vous qu’une interruption interrompt le programme et branche à l’adresse 0x04. Une fois l’interruption terminée. mais plutôt du temps de la situation la plus défavorable. Ce temps est de minimum 7ms. le programme est reconnecté à l’endroit où il se trouvait. ne tenez pas compte du temps nominal de 18ms. A ce propos. même si c’est hors de votre zone normale de programme.Ensuite. .

C’est donc le contraire du but recherché. préscaler Wdt = 128 . En conséquence : IL NE FAUT JAMAIS UTILISER L’INSTRUCTION CLRWDT DANS UNE ROUTINE D’INTERRUPTION. ne touchez pas à la _CONFIG Modifiez la valeur du registres OPTION OPTIONVAL EQU B'10001111' . Mesure du temps réel du watchdog Dans un premier temps. si vous placez une instruction « clrwdt » dans une routine d’interruption. Résistance pull-up OFF . cette instruction risque de s’exécuter même si votre programme est planté. Valeur registre option .Donc.

effacer compteur1 boucle1 nop . perdre 1 cycle decfsz cmpt1 . . Elle ne reçoit aucun paramètre et n'en retourne aucun tempo clrf cmpt2 . effacer compteur2 boucle2 clrf cmpt1 . f . boucler decfsz cmpt2 . f . Cette sous-routine introduit un retard de 250ms. SOUS-ROUTINE DE TEMPORISATION . recommencer boucle1 return . si 0. décrémenter compteur 2 goto boucle2 . si pas 0.Ensuite. . décrémenter compteur1 goto boucle1 . si cmpt2 pas 0. supprimez la variable cmpt3 et modifiez la routine tempo pour enlever la boucle extérieure. retour de la sous-routine .

directive fin de programme Que se passe-t-il ? Et bien. on attends 250ms . Modifiez maintenant la ligne _CONFIG pour mettre le watchdog en service : __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC . on reste ici . la LED s’allume.Modifions pour finir le programme principal pour qu’il allume la LED après 250ms : . C’est bien ce que nous avions prévu. et c’est tout. allumer la LED . start call bsf loop goto END PROGRAMME PRINCIPAL tempo LED loop . après approximativement ¼ seconde.

On est donc bien dans les environs des 18ms typiques annoncées. notre watchdog travaille avec un temps de base de : 2200ms / 128 = 17.2 secondes. une fois le temps : « durée de base * prédiviseur » atteint. Pour connaître la base de temps de notre watchdog dans les circonstances actuelles de tension et de température. . un reset est provoqué qui entraîne une extinction de la LED et un redémarrage. 2. Donc.2 ms. notre watchdog n’a pas été remis à zéro depuis le démarrage de la PIC.2 secondes. et le temps séparant deux allumages est approximativement 2. Explication Et bien. Donc.Que se passe-t-il ? Et bien maintenant la LED clignote. nous devons donc diviser le temps entre 2 allumages par le prédiviseur. c’est à dire 128.

directive fin de programme . arriver ici END LED tempo LED tempo BOUTON start .Simulation du plantage d’un programme Watchdog off Changez la ligne de configuration : OPTIONVAL EQU H'000F' . pas pressé. Valeur registre option . appeler la tempo de 0. boucler plante . appeler la tempo de 0. bouton-poussoir Modifiez ensuite votre programme principal : start bsf call bcf call btfsc goto plante goto .5s . Résistance pull-up ON. Préscaler wdt à 128 et le DEFINE #DEFINE BOUTON PORTB. allumer la LED .0 . éteindre LED (LEDOFF) . tester bouton-poussoir . le programme n'est pas sensé . simulation de plantage .5s .

nous mettons le watchdog en service. le programme est dans une boucle sans fin qui simule dans notre cas le plantage suite.De cette manière. comme vu précédemment dans la _CONFIG. par exemple. Nous allons ensuite nous arranger pour remettre notre watchdog à 0 à intervalles réguliers. Correction avec utilisation du watchdog Modifions maintenant notre programme.  la LED clignote. à un parasite qui a éjecté notre programme hors de sa zone de fonctionnement normal. la LED s’arrête de clignoter. Maintenez un instant le bouton-poussoir enfoncé. Voici donc notre programme principal modifié : . Tout d’abord. une pression du bouton-poussoir envoie le programme dans une zone que nous avons créée et qui simule un plantage du programme sous forme d’une boucle sans fin.

5s . allumer la LED . appeler la tempo de 0. directive fin de programme LED tempo LED tempo BOUTON start . soit toutes les 896ms. le programme n'est pas sensé . boucler END Nous avions programmé notre watchdog avec un prédiviseur de 128. simulation de plantage . tester bouton-poussoir . arriver ici . nous devrons donc envoyer clrwdt avant ou après chaque appel de tempo. pas pressé.5s . pour ne pas dépasser ce temps. éteindre LED (LEDOFF) . . appeler la tempo de 0. ce qui nous impose d’envoyer une commande clrwdt toutes les 7*128 ms. effacer watchdog .start bsf clrwdt call bcf clrwdt call btfsc goto plante goto plante . effacer watchdog . Comme l’appel à notre tempo prend 500ms.

utiliser un seul « clrwdt » dans la sous-routine « tempo ». au lieu de ces 2 instructions.  La LED clignote toujours. Le watchdog a récupéré le plantage de votre programme. Choix de la valeur du prédiviseur En général. puis recommence de nouveau. Pressez le bouton quelques instants. .Nous aurions pu. la LED s’arrête de clignoter un instant. Il faut également tenir compte du temps de réaction obtenu en augmentant le prédiviseur. il faut essayer de calculer le prédiviseur de façon à ne pas devoir placer de commande clrwdt en de trop nombreux endroits.

Vous pouvez par contre utiliser clrwdt dans une sous-routine sans aucun problème. par exemple. Si votre prédiviseur est déjà occupé pour le timer0. minimal. Dans le cas présent. car celle-ci dure plus de 7ms. Temps typique. vous auriez du placer une instruction de ce type au cœur de la routine de temporisation. Il est important de bien effectuer la distinction entre les différentes valeurs : . car cela est contraire au principe même du watchdog.Vous n’aurez cependant pas toujours le choix. Rappelez-vous de ne pas utiliser cette instruction dans une routine d’interruption. et maximum Nous avons vu apparaître plusieurs notions de temps de watchdog. il ne vous restera pas d’autres choix que d’envoyer une commande clrwdt toutes les 7ms.

Conclusion Vous êtes maintenant en mesure de créer des programmes résistants aux plantages classiques. pour peu que vous utilisiez judicieusement le watchdog. .Le temps typique (18ms) est le temps que met EN GENERAL le watchdog pour provoquer le reset de votre programme en cas de plantage. C’est donc le « temps de réaction » normal (ou typique) du watchdog Le temps minimal (7ms). c’est le temps de réaction du watchdog dans le cas le plus défavorable en fonction du composant et des conditions d’utilisation. Le temps maximum (33ms). Microchip vous garantit ici que le reset s’effectuera au maximum en 33 ms. c’est le délai maximum dont vous disposez entre 2 instructions « clrwdt » pour éviter un reset de votre programme non désiré.

.ATTENTION : Le watchdog utilisé en protection dans le cas d’une programmation correcte ne devrait jamais entrer en fonctionnement. Il n’agira donc en général que dans de très 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 (vérifiez en le mettant hors-service durant vos essais).