Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Watchdog PIC18F2520



  1. #1
    Bastoss

    Watchdog PIC18F2520


    ------

    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 :
    #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
    }
    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...
    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

    -----

  2. #2
    RISC

    Re : Watchdog PIC18F2520

    Salut,

    Ce que tu fais es un peu ...acrobatique.
    Peux-tu expliquer ce que tu souhaites au niveau fonctionnel pour voir s'il y a une alternative à un RESET violent....

    N'oublie pas plusieurs points très importants...
    1/ Avant que ton programme ne s'exécute (fonction main()), le startup code généré par le compilateur C18 s'exécute. Dans ce startup code tout un tas de choses sont initialisées. (voir fichier C018.c) dans le répertoire c:\MCC18\src\traditional\start up\
    2/ Si tu génères un RESET logiciel, les flags de détection du type de RESET sont repositionnés.

    Donc dans le cas ou tu génères ou tu attends plusieurs types de RESET, il faut écrire un RESET handler MAIS....n'oublie pas que le startup code sera exécuté avant...

    a+

  3. #3
    Bastoss

    Re : Watchdog PIC18F2520

    Salut,

    Merci Risc pour ta réponse! C'est vrai que ce n'est pas la manière la plus simple pour tester un watchdog ; mais ayant un GBF directement sous la main!

    Ce que je souhaite au niveau fonctionnel? En faite j'ai réalisé à l'aide du module CCP, un programme qui viens mettre une sortie à 1 si on ne travail pas dans la bonne plage de fréquence, le GBF me permet ainsi de tester directement le bon fonctionnement du programme.... J'aimerais y installer un watchdog pour ajouter une sécurité... quand je viens remettre le timer du watchdog à 0 dans les différente boucle sa fonctionne encore nickel, j'enlève ces derniers pour valider le fonctionnement lorsqu'un débordement apparait et le programme semble se planter à ce moment là. Plus rien ne se passe à moins de venir débrancher et rebrancher le PIC.

    Je n'ai jamais entendu parler d'un RESET handler avant .
    Comment dois-je procéder ??

Sur le même thème :

Discussions similaires

  1. Contrôle de servomoteur par PIC18F2520
    Par Madje55 dans le forum Électronique
    Réponses: 6
    Dernier message: 23/04/2009, 10h10
  2. Pic18f2520
    Par bym dans le forum Électronique
    Réponses: 0
    Dernier message: 01/06/2007, 12h58
  3. convertion analogique-numerique pic18F2520
    Par cortex59 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/02/2007, 23h48
  4. diference PIC18F252 et PIC18F2520 ?
    Par dannydan dans le forum Électronique
    Réponses: 2
    Dernier message: 02/08/2006, 23h28
  5. Pile sur Pic18f2520
    Par Nithael dans le forum Électronique
    Réponses: 0
    Dernier message: 17/07/2006, 10h31
Découvrez nos comparatifs produits sur l'informatique et les technologies.