Interruption sur le portB
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Interruption sur le portB



  1. #1
    invite71317231

    Interruption sur le portB


    ------

    Bonjour,
    J'ai besoin de détecter une variation d'état dans le portb.
    j'ai essayer avec ce code en Mikroc
    Code:
    unsigned char read=0;
    void interrupt(){
         if(INTCON.RBIF==1){
             portc=~portc;
             read=portb;
         }
    }
    void init(){
         portc=0X00;
         trisc=0X00;
         portb=0X00;
         trisb=0XFF;
         //initialisation de ports
         intcon=0X88;
         //initialisation des interruptions
    
    }
    
    
    void main() {
    
    init();
    
    
    }
    Lors de la simulation sur proteus ISIS, j'ai remarqué que le programme entre dans l'interruption mais il sort jamais!
    Quelques suggestion svp.
    J'utilise un pic 16F877.
    merci

    -----

  2. #2
    invite71317231

    Re : Interruption sur le portB

    Le code marche j'ai oublier de réinitialiser le flag "RBIF"
    INTCON.RBIF=0;
    Mais un nouveau question se pose comment faire la différence entre une interruption de la pin 4 et une autre de la pin 6 par exemple?
    Merci

  3. #3
    schizophrene

    Re : Interruption sur le portB

    Il me semble (mais je peux me tromper, ça fait longtemps que je n'ai pas bossé sur PIC...) qu'il n'y a pas moyen de déterminer quelle broche a provoqué l'interruption, c'est le portB qui déclenche, quelle que soit la broche, l'interruption.

  4. #4
    r4ph

    Re : Interruption sur le portB

    Il me semble aussi, cela dit il suffit de lire le port pour le savoir

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

    Re : Interruption sur le portB

    Salut Mazen,

    Je te recommande de lire la documentation du PIC sur :
    1/ le PORTB
    2/ les interruptions

    Quand on entre en interruption, il ne faut pas oublier de remettre à 0 le flag d'interruption qui l' aprovoquée sans quoi en sortant on re-rentre dedans...

    a+

  7. #6
    jeff123

    Re : Interruption sur le portB

    Salut,

    Sinon pour avoir une difference tu prends RB0 et (RB4 ou RB6).
    ET lors de l'interruption tu lis INTCON.INTF et INTCON.RBIF. le premier pour RB0 et le deuxieme pour RB4 ou RB6.
    Et ne pas oublier de les remettre a 0 dans l'interruption comme te dit RISC.

    A bientot.

  8. #7
    jeff123

    Re : Interruption sur le portB

    De plus en assembleur on fait une sauvegarde et une restitution des registres lorsqu'on entre dans l'interruption.
    Elle est peut etre automatisé dans votre langage.

    A vérifier.

  9. #8
    invite71317231

    Re : Interruption sur le portB

    Merci beaucoup pour les réponses.
    J'ai bien mis le flag à 0 pour initialiser le timer2.
    J'ai pensé à utilisé l'interruption en RB0 mais ce n'est pas vraiment pratique.
    En fait je suis en train de créer 2 capteurs odométriques chaque capteur possède 2 fourches optiques donc j'ai besoin de 4 entrées en total sur le portb (RB4,RB5,RB6,RB7) J'ai cru que je peu utilisé le registre IOCB mais il parait qu'il n'existe pas dans le pic 184550 donc je vais opter pour la lecture du portB à chaque interruption.
    voici le code en Mikroc pour la détection de la variation d'une fourche optique.
    Code:
    int read=0;
    int left=0;
    int right=0;
    int l =0;
    int riL =0;
    char txt[7];
    void interrupt(){
         if(TMR2IF_bit){
               portd.RD4=~portd.RD4;
               left=l;
               l=0;
               TMR2IF_bit=0;//never forget to put 0 int the flag after interruption
         }
         if(INTCON.RBIF==1){
             portd.RD2=~portd.RD2;
             l++;
             read=portb;
             INTCON.RBIF=0;
         }
    }
    void init(){
         portd=0X00;
         trisd=0X00;
         portb=0X00;
         trisb=0XFF;
         //initialisation de ports
         intcon=0XC8;
         //initialisation des interruption global(GIE,PIE,RBE)
         t2con=0X07;
         TMR2IE_bit=1;
         //timer 2
         uart1_init(9600);
    
    
    
    }
    
    
    void main() {
    init();
    while(1){
    inttostr(left,txt);
    uart1_write_text(txt);
    uart1_write(10);
    uart1_write(13);//pour la visualisation
         
    };
    
    
    }
    Je suis ouvert à toutes vos suggestions et remarques.

  10. #9
    RISC

    Re : Interruption sur le portB

    Salut,

    Je suis confus....Dans ton premier post tu parles du PIC16F877. Dans le dernier tu parles du PIC18F4550 !!!
    Ou est la vérité ???


    Plusieurs remarques :
    1/ si tu veux mesurer un temps ou une fréquence il vaut bien mieux utiliser l'unité CCP en mode Capture car c'est exactement fait pour cela !
    2/ sur les PICs il vaut mieux TOUJOURS éviter d'utiliser dans son programme les broches RB6 et RB7 car elles sont utilisées pour le debug et la programmation (connecteur ICSP)...
    3/ il vaut mieux en général éviter de faire des opérations logiques sur un champ de bits car cela génère un code long et pas optimisé...il vaut mieux faire les opérations logiques au niveau du registre. Par contre les affectations au niveau du champ de bits sont recommandées

    4/ Lis la datasheet du PIC que tu utilises et ne suppose rien....la plupart des erreurs sont dues à une mauvaise lecture ou une mauvaise interprétation de la datasheet

    a+

  11. #10
    invite71317231

    Re : Interruption sur le portB

    J'ai migré vers le pic 18F4550 car je besoin d'envoyer des données via l’USB dans un deuxième lieu.
    Pour Le ccp je ne peux pas l’utiliser car je besoin de 4 entrées pour la lecture de variations à partir de 2 encodeurs or Il ya que 2 ccp dans le 18F4550.
    J'ai pas bien saisi votre 3eme remarque. Est ce que vous pouvez m'expliquer de plus?

  12. #11
    RISC

    Re : Interruption sur le portB

    Salut,

    Si tu as besoin de plus de CCP tu devrais choisir un autre PIC comme le PIC18F46J53.
    C'est la même chose qu'un J50 mais avec beaucoup plus de CCP.
    Toutefois ce micro fonctionne en 3.3V avec je crois une tolérance 5V.

    Pour le point 3/ regarde la taille du code désassemblé avec les 2 méthodes que j'ai indiqué et tu comprendras...

    a+

  13. #12
    DAUDET78

    Re : Interruption sur le portB

    Citation Envoyé par Mazen21 Voir le message
    car je besoin de 4 entrées pour la lecture de variations à partir de 2 encodeurs
    Si tu as besoin d'utiliser un "codeur incrémental", je te conseille de lire ça http://forums.futura-sciences.com/pr...cremental.html
    J'aime pas le Grec

  14. #13
    invite71317231

    Re : Interruption sur le portB

    Merci infiniment pour vos aides précieuses. Je pense que je suis maintenant sur les bon routes ))

  15. #14
    invite71317231

    Re : Interruption sur le portB

    Bonsoir,
    J'ai continué mon code mais je suis bloqué et je ne sais pas d'ou vien le problème
    En fait, mon code est simple:
    *chaque variation sur le portB le code entre dans l'interruption--> actualisation de nombre de pas de droit et de gauche
    *en // j'ai un timer qui se déclenche chaque 200ms--> affectation de nombre de pas droit et gauche dans les variable right et left et mis à 0 de autres variables corresponds au nbr de pas.
    *affichage de valeurs left et right sur le terminal
    Code:
    /******************************************************************************
    **********Programme de calcul de deux roue à encodeurs incrementaux************
    **********Club Commande Embarqué***********************************************
    **********Réalisé par Groupe R3ad TunisRobots12********************************
    **********Tache affecté à Aounallah Mazen**************************************
    **********Date de création: 13/10/2011*****************************************
    ******************************************************************************/
    
    unsigned char var_a=0, var_b=0, rig =0,var_c=0, var_d=0, lef =0,left=0,right=0;
    int read=0; //une variable pour mettre à zero le RBInterrupt flag
    int cnt=0;
    char txt[4];
    void stockagel(){
         var_a=portb.RB6;
         var_b=portb.RB7;
    }
    void stockager(){
         var_c=portb.RB4;
         var_d=portb.RB5;
    }
    void varplus(unsigned char j){
         j++;
         portd.RD5=0;
         portd.RD6=1;
    }
    void varmoin(unsigned char j){
         j--;
         portd.RD5=1;
         portd.RD6=0;
    }
    saisi_capteur_incrementaux(){
             //Left
             if(var_a==0 && var_b==0){
                         if(portb.RB6==0 && portb.RB7==1) varplus(lef);
                         else if(portb.RB6==1 && portb.RB7==0) varmoin(lef);
             }
             else if(var_a==0 && var_b==1){
                         if(portb.RB6==1 && portb.RB7==1) varplus(lef);
                         else if(portb.RB6==0 && portb.RB7==0) varmoin(lef);
             }
             else if(var_a==1 && var_b==1){
                         if(portb.RB6==1 && portb.RB7==0) varplus(lef);
                         else if(portb.RB6==0 && portb.RB7==1) varmoin(lef);
             }
             else if(var_a==1 && var_b==0){
                         if(portb.RB6==0 && portb.RB7==0) varplus(lef);
                         else if(portb.RB6==1 && portb.RB7==1) varmoin(lef);
             }
             stockagel();
             //right
             if(var_c==0 && var_d==0){
                         if(portb.RB4==0 && portb.RB5==1) varplus(rig);
                         else if(portb.RB4==1 && portb.RB5==0) varmoin(rig);
             }
             else if(var_c==0 && var_d==1){
                         if(portb.RB4==1 && portb.RB5==1) varplus(rig);
                         else if(portb.RB4==0 && portb.RB5==0) varmoin(rig);
             }
             else if(var_c==1 && var_d==1){
                         if(portb.RB4==1 && portb.RB5==0) varplus(rig);
                         else if(portb.RB4==0 && portb.RB5==1) varmoin(rig);
             }
             else if(var_c==1 && var_d==0){
                         if(portb.RB4==0 && portb.RB5==0) varplus(rig);
                         else if(portb.RB4==1 && portb.RB5==1) varmoin(rig);
             }
             stockager();
    }
    void interrupt(){
         if(TMR2IF_bit){
             cnt++;
             if(cnt==500){
               portd.RD4=~portd.RD4;
               right=rig;
               left=lef;
               rig=0;
               lef=0;
               cnt=0;
               //send_data();
               }
               TMR2IF_bit=0;//never forget to put 0 int the flag after interruption
         }
         if(INTCON.RBIF==1){
             read=portb;
             saisi_capteur_incrementaux();
             INTCON.RBIF=0;
             portd.RD3=~portd.RD3;
    
         }
    }
    void init(){
    portd=0X00;
         trisd=0X00;
         portb=0X00;
         trisb=0XFF;
         adcon1.PCFG2=1;
         adcon1.PCFG3=1;//L'interruption sur la pin RB4 est autorisé
         //initialisation de ports
         intcon=0XC8;
         //initialisation des interruption global(GIE,PIE,RBE)
         t2con=0X07;
         TMR2IE_bit=1;
         //timer 2
         uart1_init(9600);
    }
    
    void main() {
    init();
    while(1){
    uart1_write(left);
    uart1_write(10);
    uart1_write(13);
    uart1_write(right);
    uart1_write(10);
    uart1_write(13);
    };
    }
    mais lors de la simulation le terminal m'affiche un truc que je ne comprend pas.
    Nom : 1.png
Affichages : 170
Taille : 186,0 Ko
    Svp si vous avez des suggestions n'hésitez pas de les poster.
    Merci

Discussions similaires

  1. FLOWCODE-interruption sur PORTB
    Par invited8a36ace dans le forum Électronique
    Réponses: 3
    Dernier message: 23/01/2011, 17h45
  2. Pull-up sur PORTB, PIC18
    Par amoniaque dans le forum Électronique
    Réponses: 6
    Dernier message: 22/01/2011, 01h26
  3. Interruption portB pic
    Par nirvo dans le forum Électronique
    Réponses: 34
    Dernier message: 11/08/2010, 14h56
  4. Pb de PORTB sur PIC18F4520 et PICDEM2 plus
    Par invite3d87268c dans le forum Électronique
    Réponses: 5
    Dernier message: 02/03/2010, 19h03
  5. Comment gener que le front montant sur PortB
    Par invitea0a9f65f dans le forum Électronique
    Réponses: 2
    Dernier message: 17/04/2008, 18h53
Découvrez nos comparatifs produits sur l'informatique et les technologies.