Question Interruption PIC 16F877
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Question Interruption PIC 16F877



  1. #1
    invite1cd8f19a

    Question Question Interruption PIC 16F877


    ------

    salut tout le monde
    je dois réaliser un programme qui prend en compte 2 interruption

    celle du INT/RB0 et celle du RB4>>>RB7

    je suis en C avec CCX5 comme compilateur avec MPLAB bien sur

    voila le code de l'interruption
    Code:
    #pragma origin 4
    
    interrupt RB0_RBI(void)
    { 
        int_save_registers 
        if (INTF) 
        
      { antirebond();
        navigation(); 
           INTF=0;}
        if (RBIF) {
        antirebond();
        reponse();
        RBIF=0;
                }
        int_restore_registers    
     }

    je me question juste est ce que on peut utiliser l'interruption RB0 avec le autres sources d'interruption ou bien elle doit être utiliser toute seule
    et est ce que mon programme d'interruption est correcte

    PS: le programme d'interruption des RB4>>>RB7 ca marche
    mais l'autre du RB0 ca fonction pas

    -----

  2. #2
    invite7a49d0d5

    Cool Re : Question Interruption PIC 16F877

    Bonjour,

    oui tu peux utiliser toutes les interruptions que tu veux...
    (après, avec CC5X, ça paraît "special")

    envoyes le code avec l'initialisation du pic (TRIS, ADCONS, INTCON)...
    afin que l'on puisse détecter toute erreur...

    moi je commencerais par supprimer tous ces appels
    à des "fonctions" (antirebond(); navigation(); reponse().)
    dans l'interruption...

    vede
    ;O]

  3. #3
    invite1cd8f19a

    Re : Question Interruption PIC 16F877

    j'ai deja teste d'eliminer les fonctions et de mettre le programme de la fonction dans l'interruption mais ca marche pas.
    pour l'antirebond ca deja marcher avec un simple programme d'interruption avec RB0

  4. #4
    invite1cd8f19a

    Re : Question Interruption PIC 16F877

    j'ai deja teste d'eliminer les fonctions et de mettre le programme de la fonction dans l'interruption mais ca marche pas.
    pour l'antirebond ca deja marcher avec un simple programme d'interruption avec RB0

  5. A voir en vidéo sur Futura
  6. #5
    freepicbasic

    Re : Question Interruption PIC 16F877

    Les interruptions ça doit être le plus court possible !
    Tu met 2 procédures dont on ne sait rien et à mon avis surement trop longue...
    A+, pat

  7. #6
    invite1cd8f19a

    Wink Re : Question Interruption PIC 16F877

    ok voila le code complet de mon interruption

    Code:
    //#pragma chip pic16f877
    #include "int16CXX.h"
    bit inter1 @PORTB.4; //Bp1
    bit inter2 @PORTB.5; //Bp2
    bit inter3 @PORTB.6; //Bp3
    bit inter4 @PORTB.7; //Bp4
    bit pred @PORTB.3; //precedant
    bit suiv @PORTB.1; //suivant
    bit led1 @PORTA.0; //Led1
    bit led2 @PORTA.1; //Led2
    bit led3 @PORTA.2; //Led3
    bit led4 @PORTA.3; //Led4
    bit l1,l2,l3,l4;       //variable tempo pour inverssement des etats des leds
    char affiche1,affiche2,a,b,c;          //afficheur 1 unites         afficheur 2  dizaines
    char afficheur @PORTD;// pour l'affichage sur le portD
    char sortie @PORTB;   //initialisation du portB dans le main par sortie=0
    unsigned tempo:16;
    void antirebond(void);       // antirebond
    void reponse(void);          //procedure reponse
    void navigation(void);       //procedure navigation
    ///////////////////////////////interuption
    #pragma origin 4
    
    interrupt RB0_RBI(void)
    { 
        int_save_registers 
       
    if (INTF) 
        
      { antirebond();
        navigation(); 
           INTF=0;}
        if (RBIF) {
        antirebond();
        reponse();
        RBIF=0;
                }
        int_restore_registers    
     }
    
    
    ////////////////////////fonction principale
    void main(void)
    {afficheur=1;sortie=0;a=0;b=0;c=0;  //initialisation de tout les variables utilisees
    
    //////////////////////////////les differents initalisations des registres
    ADCON0 =0b00000000; //                ADC OFF ici
    ADCON1 =0b00000110; //                desactivation des CAN,port A en entree numerique
        TRISB=0B11111111;             //  le port B en entree
        TRISA=0B11100000;             //  le port A en sortie
        TRISD=0b00000000;             //  le port D en sortie
            INTCON=0B11011000;        //  activation des interruptions
            OPTION=0B01000000;        //  RB0 avec front montant
        for(;;)
        {
    nop();
        }
    }
    
    void navigation(void)
    { 
    if (suiv)
        { //antirebond();while(suiv);antirebond();
    
            if (affiche1==9 && affiche2==9)
            {
            affiche1=1;
            affiche2=0;
            }
    else
            {
                if (affiche1!=9) affiche1++;
                else if (affiche1==9)
                {
                    affiche1=0;affiche2++;
                }
            }
    a=affiche2;
    b=affiche1;
    a=a<<4;
    c=(a+b);
    afficheur=c;
    }
    
        if (pred)
        {
           //antirebond();while(pred);antirebond();
            if (affiche1==1 && affiche2==0)
            {
            affiche1=9;
            affiche2=9;
            }
    else
            {
                if (affiche1>0) affiche1--;
            else
                {
                    affiche1=9;
                 affiche2--;
                }
        }
        
    a=affiche2;
    b=affiche1;
    a=a<<4;
    c=(a+b);
    afficheur=c;
    }
    }
    void reponse(void)
    {
    
    if (inter1)
    {antirebond();while(inter1);l1=!l1;
     led1=l1;antirebond();
    }
    
    
    if (inter2)
    {antirebond();while(inter2);l2=!l2;
     led2=l2;antirebond();
    }
    
    if (inter3)
    {antirebond();while(inter3);l3=!l3;
     led3=l3;antirebond();
    }
    
    
    if (inter4)
    {antirebond();while(inter4);l4=!l4;
     led4=l4;antirebond();
    }
    
    }
    
    void antirebond(void)
    {
    for (tempo=0;tempo<5000;tempo++); //fonction pour antirebond de 20 ms
    }

    si vous désiriez plus d'explication je peux le faire par la suite!!!!

  8. #7
    freepicbasic

    Re : Question Interruption PIC 16F877

    il faut mettre un flag dans la routine d'int
    et faire les procédures dans le main lorsque le flag est monté
    A+, pat

  9. #8
    invite1cd8f19a

    Re : Question Interruption PIC 16F877

    j'ai pas bien compris ton idée

    mais moi je veux que mon programme fonction en interruption
    merci de votre reponse

  10. #9
    invite7a49d0d5

    Cool Re : Question Interruption PIC 16F877

    Citation Envoyé par bs.amine Voir le message
    (...)
    PS: le programme d'interruption des RB4>>>RB7 ca marche
    mais l'autre du RB0 ca fonction pas
    Bonjour Amine,

    ça m'intéresse car je me suis cassé les dents sur l'NT RB4-RB7...
    http://forums.futura-sciences.com/el...f88oeoeoe.html

    si tu peux envoyer le code...

    vede
    ;O]

  11. #10
    invite1cd8f19a

    Re : Question Interruption PIC 16F877

    Reponse sur votre sujet
    si vous voudriez plus d'explications je serai la a votre service
    a bientot

  12. #11
    invite1cd8f19a

    Re : Question Interruption PIC 16F877

    probleme resoulu j'ai du refaire le schema car il y'avait des entree flotante sur l'interruption cest pk ca marcher pas

Discussions similaires

  1. aide interruption pic 16F877
    Par invite1cd8f19a dans le forum Électronique
    Réponses: 0
    Dernier message: 19/03/2010, 23h40
  2. interruption pic 18f4520
    Par bird12358 dans le forum Électronique
    Réponses: 19
    Dernier message: 25/07/2009, 22h07
  3. interruption PIC 18F452
    Par invite4828afd1 dans le forum Électronique
    Réponses: 4
    Dernier message: 23/02/2009, 20h29
  4. Réponses: 0
    Dernier message: 18/03/2007, 15h43
  5. Pic 16f877 Pic basic pro conseil
    Par invite4ff7103d dans le forum Électronique
    Réponses: 10
    Dernier message: 04/01/2007, 17h26
Découvrez nos comparatifs produits sur l'informatique et les technologies.