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

interruption PIC18F



  1. #1
    induc

    interruption PIC18F


    ------

    bonjour,

    j'ai réalisé une interuption sur front montant sur la patte RBO que je pense être bien configurée.

    Mon problème c'est que l'interruption n'a lieu qu'une fois : au premier front montant, le pic réalise les instructions de la boucle d'interruption, puis il retourne dans la boucle principale et y reste.
    voilà mon code :

    #include <p18f252.h>
    #include <adc.h>
    #include <timers.h>
    #include <delays.h>


    /****************************** ***********************/
    /* définitions des pins I/O */
    /****************************** ***********************/
    #define DEL1_TRIS TRISCbits.TRISC1
    #define DEL2_TRIS TRISCbits.TRISC2
    #define DEL3_TRIS TRISCbits.TRISC3
    #define DEL1 PORTCbits.RC1
    #define DEL2 PORTCbits.RC2
    #define DEL3 PORTCbits.RC3
    #define zero_de_courant_TRIS TRISBbits.TRISB0
    #define zero_de_courant PORTBbits.RB0


    void MyInterrupt (void);
    void delai (void);
    void main (void);


    /******************************/
    /* fonction interruption */
    /******************************/
    void MyInterrupt(void);

    #pragma code highVector=0x008
    void atInterrupthigh(void)
    {
    _asm GOTO MyInterrupt _endasm
    }
    #pragma code // retour la zone de code



    /*********************/
    /* Interruptions */
    /*********************/
    #pragma interrupt MyInterrupt
    void MyInterrupt(void)
    {
    /* sauvegarder des registres avant l'interruption */
    unsigned char sauv1;
    unsigned char sauv2;

    INTCONbits.INT0IF = 0;

    sauv1 = PRODL;
    sauv2 = PRODH;

    DEL1 = 0;
    DEL3 = 1;
    delai();
    DEL3 = 0;

    /* on restaure les registres sauvegardes avant l'interruption */
    PRODL = sauv1;
    PRODH = sauv2;
    INTCONbits.INT0IF = 0;
    }


    /*********************/
    /* Délai */
    /*********************/
    void delai (void)
    {
    int i;
    for (i = 0; i < 10000; i++)
    ;
    }



    /****************************** */
    /* fonction principale */
    /****************************** */

    void main (void)
    {
    /*tout digital sauf RA0-AN0 */
    ADCON1=0xE;

    /* on configure les pins en I/O */
    DEL1_TRIS = 0;
    DEL2_TRIS = 0;
    DEL3_TRIS = 0;
    zero_de_courant_TRIS = 1;


    /* On active toutes les interruptions */
    INTCON2bits.INTEDG0 = 1; /* interruption sur front montant */
    INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
    INTCONbits.INT0IE = 1; /* autorise interruption sur RB0 */
    INTCONbits.GIE = 1;
    INTCONbits.PEIE = 1;


    /*on demarre la boucle infinie */
    while (1)
    { DEL1 = 1;
    delai();
    delai();
    }
    }




    Comment remédier au problème?

    -----

  2. Publicité
  3. #2
    DavidDB

    Re : interruption PIC18F

    Salut,

    Elle est où l'interruption sur RB0???

    David.

  4. #3
    induc

    Re : interruption PIC18F

    oups.... j'avais mal selectionné mon code.
    le revoilà :

    #include <p18f252.h>
    #include <adc.h>
    #include <timers.h>
    #include <delays.h>

    #define DEL1_TRIS TRISCbits.TRISC1
    #define DEL2_TRIS TRISCbits.TRISC2
    #define DEL3_TRIS TRISCbits.TRISC3
    #define DEL1 PORTCbits.RC1
    #define DEL2 PORTCbits.RC2
    #define DEL3 PORTCbits.RC3
    #define zero_de_courant_TRIS TRISBbits.TRISB0
    #define zero_de_courant PORTBbits.RB0


    void MyInterrupt (void);
    void delai (void);
    void main (void);


    void MyInterrupt(void);

    #pragma code highVector=0x008
    void atInterrupthigh(void)
    {
    _asm GOTO MyInterrupt _endasm
    }
    #pragma code // retour la zone de code


    #pragma interrupt MyInterrupt
    void MyInterrupt(void)
    {
    unsigned char sauv1;
    unsigned char sauv2;

    INTCONbits.INT0IF = 0;

    sauv1 = PRODL;
    sauv2 = PRODH;

    DEL1 = 0;
    DEL3 = 1;
    delai();
    DEL3 = 0;

    PRODL = sauv1;
    PRODH = sauv2;
    INTCONbits.INT0IF = 0;
    }

    void delai (void)
    {
    int i;
    for (i = 0; i < 10000; i++)
    ;
    }


    void main (void)
    {
    ADCON1=0xE;

    DEL1_TRIS = 0;
    DEL2_TRIS = 0;
    DEL3_TRIS = 0;
    zero_de_courant_TRIS = 1;

    INTCON2bits.INTEDG0 = 1; /* interruption sur front montant */
    INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
    INTCONbits.INT0IE = 1; /* autorise interruption sur RB0 */
    INTCONbits.GIE = 1;
    INTCONbits.PEIE = 1;

    while (1)
    {
    DEL1 = 1;
    delai();
    delai();
    }
    }

  5. #4
    T-Bot

    Re : interruption PIC18F

    on met pas un delai dans une interruption ...
    c'est une interruption pas le code principal.
    fait plutot changer le contenu d'une variable globale (genre My_Int0_CPT ++ ; )
    et dans le main tu check cette variable...

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    DavidDB

    Re : interruption PIC18F

    Salut,

    Désolé, je ne vois toujours pas l'INT sur RB0.

    David.

  9. #6
    induc

    Re : interruption PIC18F

    qu'est-ce que vous vous attendiez à voir?

    et pourquoi je ne peux pas mettre de délai dans la boucle d'interruption?
    et puis je pense que je ne peux pas utiliser de variable que je check puisque je veux que la détection se fasse au front montant...

    ++

  10. Publicité
  11. #7
    DavidDB

    Re : interruption PIC18F

    Au minimum la déclaration d'accès à l'INT de RB0 -> INTE

    et au minimum l'effacement du flag INTF dans l'INT...

    David.

  12. #8
    induc

    Re : interruption PIC18F

    je croyais que ca "INTCONbits.INT0IF = 0;" c'était l'effacement du flag.

    et sinon, comment déclarer l'accès à l'interruption?

  13. #9
    DavidDB

    Re : interruption PIC18F

    INT0IF ce n'est pour le timer0???

    A vérifier car je ne connais pas ton compilo.

    David.

  14. #10
    T-Bot

    Re : interruption PIC18F

    Citation Envoyé par induc
    et pourquoi je ne peux pas mettre de délai dans la boucle d'interruption?
    et puis je pense que je ne peux pas utiliser de variable que je check puisque je veux que la détection se fasse au front montant...
    ++
    si tu as une interruption. Tu passes dans ton delai. Que se passe-t-il si pendant ce temps il y a un autre front montant ?

    Pour la variable... que veux-tu que la détection déclenche ? allumer une LED pendant 1s ?...

  15. #11
    induc

    Re : interruption PIC18F

    mon microcontroleur commande un driver d'IGBT. Si j'ai besoin d'ouvrir l'interrupteur, je dois le faire sur un front montant du signal arrivant sur RB0, signal qui m'indique le passage du courant (alternatif qui circule dans mon système) au zéro.

    Je dois donc remettre les sorties vers les drivers à 0, lorsque les conditions sont réunies et qu'alors je detecte un front montant. C'est à dire que l'interruption ne doit pas se faire à chaque front montant, mais seulement au premier front montant apparaissant une fois que l'on souhaite ouvrir les IGBT...
    J'espère que c'est claire. et c'est pour ça que ça ne me dérangeait pas de mettre un delai dans ma boucl d'interruption.
    ++

  16. #12
    DavidDB

    Re : interruption PIC18F

    Tu as vérifié que INT0IF concerne bien RB0???

    David.

  17. Publicité
  18. #13
    induc

    Re : interruption PIC18F

    oui. pour RB1 c'est INT1IF et pour RB2 c'est INT2IF.

Discussions similaires

  1. du test a la pratique... PIC18F
    Par cortex59 dans le forum Électronique
    Réponses: 5
    Dernier message: 22/02/2007, 20h30
  2. bug sur pic18f ???
    Par dam74 dans le forum Électronique
    Réponses: 1
    Dernier message: 30/09/2006, 08h47
  3. Pic18f Adc
    Par twistwind dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2006, 14h43
  4. comparaison de tensions par PIC18F
    Par induc dans le forum Électronique
    Réponses: 26
    Dernier message: 19/05/2006, 08h49
  5. programmation des pic18F
    Par rom_320 dans le forum Électronique
    Réponses: 1
    Dernier message: 04/05/2006, 17h42
Découvrez nos comparatifs produits sur l'informatique et les technologies.