Chien de garde et configuration

Transcription

Chien de garde et configuration
http://www.didel.com/
[email protected]
http://www.bricobot.ch/
[email protected]
www.didel.com/pic/Wdog.pdf
Chien de garde et configuration
Il y a toujours un risque qu'un programme déraille suite à un parasite électrique ou le
passage dans une partie de programme qui plante. Le principe pour se protéger est d'avoir
un compteur qui tourne dans le processeur et qui est remis à zéro par une instruction dans la
boucle principale du programme (ClrWdt); si le compteur déborde, un reset force une
réinitialisation.
Watchdog timer sur un PIC
La logique de chien de garde du PIC, la même sur tous les PICs 10F 12F 16F, comporte un
oscillateur séparé à environ 55 Hz, qui commande un prescaler (division par 1 à 256) avant
d'activer la bascule qui crée le reset. Le délai maximum est donc de 4.6secondes.
A noter que le prescaler est partagé avec le timer: il faut décider avec le bit PSA si on utilise
le prescaler avec le timer ou avec le watchdog. Si PSA = 0, l’instruction ClrWdt doit être
activée toutes les 16 millisecondes si on veut éviter le reset. C’est-à dire toutes les 12 à
16'000 instructions. C’est facile de glisser l’instruction ClrWdt dans toutes les boucles du
programme.
Le chien de garde est activé par un bit du "configuration word" chargé à la fin de la
programmation. Le mot de configuration pour un 16F877A est 16'3F3D au lieu de 16'3F39
pour le mode sans Wdt (WdtEn = 0).
Le logiciel doit initialiser les bits PSA et
PS2..0. L'instruction ClrWDT remet à zéro le
compteur 8 bits de timeout.
Pour vérifier, charger le programme
T877Wdog.asm avec le bit de configuration
WDTEN actif.
En mettant un ; (point-virgule de commentaire) devant l’instruction ClrWdt on voit que le
compteur sur le PortB repart à zéro toutes les 4.6 secondes. Il y a reset et on voit que le
portC augmente à chaque reset. Les ports ne sont pas remis à zéro par un reset, c’est bon à
savoir.
Si on active l’instruction ClrWdt le compteur tourne rond.
Endormir le processeur
Pour réduire le courant, on peut endormir le processeur. Toutes ses sorties sont alors
flottantes et le réveil dépends de l'une de quelques conditions à vérifier selon le processeur:
1) Activer la broche reset, si la configuration a mis en service cette entrée.
2) Le Watchdog timer active WDT; un rest est généré avec dans Status les bits #GPWUF
et #CWUF à zéro
3) Une broche du processeur a changé; un rest est généré avec Status:#GPWUF actif
4) Une interruption a eu lieu
Le même programme T877Wdog.asm permet de tester cette instruction. Si on enlève le ;
devant l’instruction Sleep, on voit que le comptage s’arrête et reprend après 4.6s, quand le
processeur redémarre. On peut modifier l’instruction qui suit, elle n’est jamais exécutée.
Autres bits de configuration
Le mot de configuration contient en plus du bit pour le watchdog 2 bits pour choisir le type
d’oscillateurs. CP (code protect) empêche une relecture de la mémoire. N’expliquons que 2
autres bits.
SmileNG documente le mot binaire à utiliser. Microchip liste les bits, par exemple
#config xt_osc, wdt_off, pwrte_off, boden_off, lvp_off, cpd_off, wrt_enable_on
Power-Up timer PWRTEN
Un retard de 30 à 130 ms est mis en route si le bit 3 du mot de configuration est à zéro. Ce
retard vient en plus d'une retard qui attends que l'oscillateur soit stabilisé. Il est utile si
l'alimentation monte lentement, si des interfaces ont une gamme de tension plus faible que le
PIC et si le logiciel tente rapidement d'initialiser des périphériques qui ne sont pas encore
prêts.
Brown-out reset BOREN
Sur les 16F87x, un comparateur détecte si la tension est inférieure à 4V pendant 0.1 ms au
moins, et force un reset. Quand la tension est remontée à 4.5V, le power-up timer maintien
le reset pendant 72 ms. Le bit 6 du configuration word, appele BODEN active cette fonction
et force le bit WDTE.
A noter que si BODEN n'est pas activé (mode normal dans les Pics), le 16F87x tourne
encore (apparemment correctement) jusqu'à sa tension minimum de 2,5 à 3V.
jdn090823