Bonjour!
Après moultes recherches sur les watchdog et ayant compris(du moin je le pense) son fonctionnement, je me retrouve dans une impasse quand à son utilisation dans un certain type de cas de figure, je suis pas un pro en PIC et j'ai déjà lu les cours de bigonoff à ce sujet, j'espère que quelqu'un pourra venir trouver le source de mon problème, trêve de bavardage, je vous expose mon problème:
J'utilise un PIC18F2520 avec le compilateur C18 de microchip.
Quand il s'agit de mettre un place le watchdog dans un programme très simple (faire clignoter une led à l'aide d'un delay dans la boucle infinie), il fait très bien son travail, c'est à dire que si je ne met pas de CLRWDT dans la boucle infinie, un débordement est créé sur le watchdog, créant donc un reset faisant repartir mon programme du tout début, jusque là pas de problèmes! Vous me suivez?
Mon problème est que dès lors je veux l'appliquer dans un programme plus complexe avec des interruptions, le programme fonctionne mais dès qu'il y a présence d'un débordement de mon watchdog, il ne se relance pas et semble rester bloquer!
Voici mon programme :
Voilà, désolé du pavé, en gros je branche un GBF sur une fréquence basse sur RB1, à chaque front montant, la LED change d'état, on la voit ainsi clignoter, le delay au début est pour bien voir que mon programme se relance du début grâce au watchdog, mais non il reste bloquer dès le premier débordement du watchdog...#include <p18f2520.h>
#include <stdlib.h>
#include <delays.h>
#include <adc.h>
//Déclaration des PORTXbits.RXX utilisés
#define LED LATBbits.LATB3
#define BP1 PORTBbits.RB0
//Configuration Bits
#pragma config OSC = INTIO7 //OSCILLATOR
#pragma const config FCMENB = OFF //Fail Safe Clock Monitor Disabled
#pragma const config IESOB = OFF //Internal External Osc. Switch Disabled
#pragma config PWRT = OFF //Power Up Timer Disabled
#pragma const config BOR = BOHW //Brown Out Reset Enabled in HW, SBOREN disabled
#pragma const config BORV = 20 //Brown Out Voltage : 2.0V
#pragma config WDT = ON //WATCHDOG HW Disabled - SW Controlled$
#pragma config WDTPS = 512 //Watchdog Prescaler
#pragma config DEBUG = ON //DEBUG Disabled
#pragma config LVP = OFF //Low Voltage Programming Disabled
#pragma config XINST = ON
//Déclarations des sous programmes
void init_uc(void);
void config_uc(void);
void config_fd(void);
void DELAY_MS(int ms);
void restart_WDT (void);
//Déclaration variables
int L1;
int ms;
// **************** Routine IT *********************
#pragma interrupt LED_IT
void LED_IT(void)
{
if (RCONbits.TO == 0) // Test du drapeau d'IT du WDT
{
_asm
RESET
_endasm
}
if(INTCON3bits.INT1IF==1) // Si j'ai interruption sur INTO
{
LED=!LED;
}
INTCON3bits.INT1IF=0;
}
}
#pragma code high_vector=0x08
void APPUI_BP(void)
{
_asm
goto LED_IT
_endasm
}
#pragma code
//************ Programme principale ******************
void main (void)
{
init_uc(); // Initialisation du PIC 18F2520
config_uc();
config_fd();
LED=1;
DELAY_MS(1000);
while(1)
{
}
}
/****************************** ****************************** ***************
Sous programmes
****************************** ****************************** *****************/
void init_uc(void)
{
ADCON1=0x0F;
TRISB=0x02; //Port RB1 en entré
PORTB=0x00; // Initialisation à 0 des Ports
}
void config_uc(void)
{
INTCON3bits.INT1IE=1; //Autorisation des interruptions sur INT1
INTCONbits.GIE=1; //Autorisation des interruptions globales
INTCONbits.PEIE=1; //Autorisation des interruptions globales
}
void config_fd(void)
{
INTCON2bits.INTEDG1=1; //Autorisation des interruptions sur front descendant de RB1
}
void DELAY_MS(int ms)
{
int a=0, b=0;
do
{
b++;
for(a=0; a<=18; a++);
}
while(b<ms);
}
void restart_WDT (void)
{
_asm
CLRWDT
_endasm
}
Le problème survient dès lors que j'autorise n'importe quelle interruption.
Espérant que quelqu'un voudra bien prendre le temps de jeter un oeil à mon problème, je vous remercie d'avance.
Bastoss
-----