interruption IO pic18f2520
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

interruption IO pic18f2520



  1. #1
    invite46936add

    interruption IO pic18f2520


    ------

    Bonjour...
    Je voudrais simplement gérer correctement les interruptions sur le RB0.
    J'ai donc un pic18F2520 avec un bouton poussoir qui relie RB0 à la masse lorsqu'il est appuyé. Le problème est que l'interruption est toujours exécutée (bouton appuyé ou non) , la boucle infinie du main reprend si je reste longtemps appuyé sur le bouton (je le sais car une led permet de signaler quelle boucle tourne).
    J'ai réglé l'interruption sur le front descendant mais je ne comprends pas comment cela peut il réagir si l'on laisse RB0 "en l'air". Faut il forcer par le hardware RB0 à 5V puis mettre à la masse lors de l'appui?
    J'ai essayé de mettre une résistance entre 5V et RB0 pour forcer le niveau 5V avant la mise à 0 mais cela ne laisse pas la boucle main fonctionner.

    Quel est le principe d'utilisation générale (surtout hard) d'une interruption sur IO?


    Merci pour vos éclaircicements

    Voila les quelques paramètres de mon code qui sont utiles pour ce problème (les prototypes sont dans le .h , le script se build sans problèmes, j'ai probablement oublié quelques détails du script mais sans rapport avec le problème):



    #pragma config OSC = HSPLL
    #pragma config WDT = OFF
    #pragma config PWRT = ON
    #pragma config LVP = OFF
    #pragma config BOREN = ON
    #pragma config BORV = 1
    #pragma config XINST = OFF
    #pragma config DEBUG = OFF
    #pragma config PBADEN = OFF

    #pragma code high_vector=0x08
    void interrupt_at_high_vector(void)
    {
    _asm GOTO ISRgest _endasm
    }

    #pragma code // ritorna al codice C
    #pragma interrupt ISRgest



    void main()
    {
    TRISB = 0b11111111;
    LATB = 0b11110000;


    RCONbits.IPEN=1;
    INTCON = 0;
    INTCONbits.GIE = 1;
    INTCONbits.INT0IE = 0; /* mise à 0 avant de le mettre à 1 */
    INTCONbits.INT0IE = 1 ; //activation de l'interruption de la patte RB0
    INTCON2bits.INTEDG0=0; //evennement du falling edge
    INTCONbits.PEIE = 0;
    INTCONbits.INT0IF = 0;

    while(1)
    {
    led1=0;
    }
    }

    void ISRgest(void) .
    {


    if(INTCONbits.INT0IF && INTCONbits.INT0IE)
    {
    /* sauvegarder des registres avant l'interruption */
    unsigned char sauv1;
    unsigned char sauv2;
    sauv1 = PRODL;
    sauv2 = PRODH;


    //si bouton alors réaction
    Led1=1;

    tempo_ms(5000); //fonction d'attente

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

    -----

  2. #2
    RISC

    Re : interruption IO pic18f2520

    Salut,

    Tout d'abord n'oublie pas que si tu connectes un bouton poussoir, il faut gérer les rebonds par un anti-rebond logiciel ou matériel.
    Un très bon document là-dessus : http://www.ganssle.com/debouncing.htm

    Je te conseille de réordonner un peu ton programme :

    Code:
    RCONbits.IPEN=1;
    
    INTCON2bits.INTEDG0=0; // évènnement sur falling edge
    INTCONbits.INT0IF = 0;
    INTCONbits.INT0IE = 1 ; //activation de l'interruption de la patte RB0
    INTCONbits.GIE = 1;
    Attention à ne pas confondre && et &... :
    Code:
    if (INTCONbits.INT0IF & INTCONbits.INT0IE)
    a+

  3. #3
    invite46936add

    Re : interruption IO pic18f2520

    Le problème est résolu
    J'avais simplement pas activé le pull up interne du pic.

    INTCON2bits.RBPU=0; //activation du pull up

    Dés lors, RB0 est à 5v au repos puis fait bien un front descendant lors de la mise à la masse par le bouton poussoir.


    Merci pour le conseils...

  4. #4
    invite46936add

    Re : interruption IO pic18f2520

    Par contre pour le &&, quel est le problème?
    Je veux bien vérifier que les 2 conditions soient vraies donc ET logique &&.
    & seul (et bit à bit ) fonctionne aussi car les deux doivent être à 1 pour obtenir 1.
    Est ce juste plus académique d'utiliser que un & ou il y a une raison plus profonde?

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Uart PIC18F2520
    Par inviteea3c59b3 dans le forum Électronique
    Réponses: 1
    Dernier message: 08/05/2010, 20h19
  2. Watchdog PIC18F2520
    Par invite758c3b6c dans le forum Électronique
    Réponses: 2
    Dernier message: 04/05/2010, 09h39
  3. Pic18f2520
    Par invite4f6ab89a dans le forum Électronique
    Réponses: 0
    Dernier message: 01/06/2007, 11h58
  4. diference PIC18F252 et PIC18F2520 ?
    Par invite89557533 dans le forum Électronique
    Réponses: 2
    Dernier message: 02/08/2006, 22h28
  5. Pile sur Pic18f2520
    Par invite74b73858 dans le forum Électronique
    Réponses: 0
    Dernier message: 17/07/2006, 09h31
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...