je viens de réaliser un petit système réalisé sur un 18F2520 avec comme compilateur le C18 de Microchip, mais je souhaiterai lui ajouté un watchdog, mais je me pose quelques questions sur sa mise en oeuvre:
Tout d'abord, je sais qu'il faut autoriser son fonctionnement avec la configuration des bits et régler son temps:
Code:
#pragma config WDT = ON
#pragma config WDTPS = ....
Par contre comment déterminer son temps(il peut varier entre 4ms et 131 sec d'après la doc), je souhaiterai avoir un watchdog de 300ms:
j'ai un quartz de 20MHz, donc FOSC= 20Mhz, TOSC=50ns, donc Tcycle = 200ns.Mais comment déterminer WDTPS en fonction de Tcycle??
Ensuite au point de vue du soft, je dois créer une petite fonction afin de remettre à 1 le watchdog. Je pense qu'il faut agir sur le bit 3 du registre RCON (/TO), et créer une petite routine d'interruption pour relancer le programme en cas de "plantage", je voyais ça comme cela, mais pourriez vous m'aider:
Code:
[...]
#pragma config WDT = ON
#pragma config WDTPS = //Valeur a déterminer
[...]
void restart_WDT (void);
[...]
#pragma interrupt TIMER
void TIMER(void)
{
if (RCONbits.TO) // Test du drapeau d'IT du WDT
{
_asm
RESET // Es ce que je peux faire ça pour faire le RESET par soft
_endasm
}
[...]
}
void main (void)
{
[...]
while (1)
{
restart_WDT();
[...]
}
}
void restart_WDT (void)
{
_asm
CLRWDT // Es ce que je peux faire ça pour le réinitialiser?
_endasm
}
Je pense que cela doit etre bon sur le principe...
Merci d'avance
mon sujet est assez vieux même si il n'a que 4 mois, mais il est toujours d'actualité..
Auriez vous quelques infos a me transmettre sur la manière de faire?
Merci d'avance et bonne journée a tous
23/06/2009 - 10h17
Seb.26
Date d'inscription
juin 2005
Âge
35
Messages
1 696
Re : [C/PIC18]-Mise en place d'un watchdog
Bah un WD, y'a pas grand chose à dire : tu dois montrer au CPU que ton soft est toujours OK via CLRWDT avant que le timer claque, sinon, le WD reset le CPU ...
C'est quoi ta question ?
... ça marche pas chez toi ??!?
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
23/06/2009 - 11h04
jorg1n
Date d'inscription
septembre 2007
Messages
1 833
Re : [C/PIC18]-Mise en place d'un watchdog
Merci Seb26,
je ne l'ai pas encore testé, mais je voulais savoir si ma manière de le mettre en oeuvre était bonne?
Et vu que mon application a un timer de 400ms, je peux réaliser ma fonction restart_WDT(); après chaque IT?
Et en ce qui concerne la valeur du WDTPS, je dois donc régler une valeur supérieure à 400ms je suppose?
Merci d'avance
23/06/2009 - 14h25
Seb.26
Date d'inscription
juin 2005
Âge
35
Messages
1 696
Re : [C/PIC18]-Mise en place d'un watchdog
En général, il est bon de mettre le reset du WD dans un "lieu critique" de ton application ... car une IT, tu peux penser qu'elle sera toujours OK, donc peut d'intérêt au WD ...
Mets le dans ta boucle principale, dans un endroit ou tu sais que tu dois passer ... et si ta boucle se plante, le WD fera son boulot !
... alors que si tu reset le WD dans une IT, même si ton prog plante, l'IT resetera probablement le WD ...
@+
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Je vais tester tout ça, et je te tiens au courant...
Par contre, peux tu me confirmer que me manière de faire est bonne...
Merci d'avance
23/06/2009 - 14h53
Seb.26
Date d'inscription
juin 2005
Âge
35
Messages
1 696
Re : [C/PIC18]-Mise en place d'un watchdog
Oui, tu dois utiliser CLRWDT pour reseter le WD ... d'autres moyens sont possibles, mais cette instruction est là pour ça ...
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
23/06/2009 - 15h15
jorg1n
Date d'inscription
septembre 2007
Messages
1 833
Re : [C/PIC18]-Mise en place d'un watchdog
Merci Seb26 pour toute ton aide...
23/06/2009 - 15h18
HULK28
Date d'inscription
janvier 2006
Localisation
dans le labo d'essais...
Âge
48
Messages
9 015
Re : [C/PIC18]-Mise en place d'un watchdog
Bonjour,
pour déterminer le temps du WD il faut évaluer le temps le plus long nécessaire à exécuter une tâche donnée (un calcul fait par une fonction, une boucle for, etc).
Comme l'a dit Seb.26 le WD doit être placé dans le main ou à l'intérieur de toute fonctions itératives dont la durée n'est pas fixe et/ou dépendante d'évènements attendu par le système (while, do..while).
A+
HULK
"Pour la carotte, le lapin est la parfaite incarnation du Mal."
Robert Scheckley.
j'ai réussi a mettre en place le watchdog, par contre, y a t'il un moyen de détecter au rallumage qu'il s'agit un reset du watchdog?
Je m'explique, lorsque mon système est mis sous tension, mon programme attend une interruption externe, et ce que je voudrais, c'est que si mon système se reset il redémarre completement et que je ne sois pas obligé de réaliser une interruption externe, je voudrais donc voir si il s'agit d'un démarrage classique ou si il s'agit d'un reset du watchdog...
J'espère que mon explication est assez claire...
Merci d'avance
24/06/2009 - 15h55
fignon
Date d'inscription
février 2009
Âge
29
Messages
50
Re : [C/PIC18]-Mise en place d'un watchdog
Il faut aller voire ce qu'il y a dans le registre RCON pour déterminer la source du reset (instruction reset, watchdog, POR, BOR).
24/06/2009 - 16h13
jorg1n
Date d'inscription
septembre 2007
Messages
1 833
Re : [C/PIC18]-Mise en place d'un watchdog
Merci fignon,
j'avais bien vu le bit /TO qui dit lorsque qu'il est à 0 qu'un reset a eu lieu a cause du watchdog, mais comment l'utiliser??
En fonctionnement "normal", il est a "1", mais quand il y a un reset du watchdog, est qu'au redémarrage le bit reste a 0?
24/06/2009 - 17h08
fignon
Date d'inscription
février 2009
Âge
29
Messages
50
Re : [C/PIC18]-Mise en place d'un watchdog
Il faut lire le registre au début du programme pour déterminer la source de reset.
Si /TO est nul, alors il y a eu un rest wdt.
Ensuite il faut réecrire 1 sur le bit qui a été mis à 0 lors du reset.