Problèmes avec plusieurs interruptions
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Problèmes avec plusieurs interruptions



  1. #1
    flyingrock

    Problèmes avec plusieurs interruptions


    ------

    Bonjour,

    Je rencontre actuellement des difficultés pour faire cohabiter plusieurs interruptions ensemble.

    1) Détection d'un front descendant sur le portb.b0 INT0
    2) Détection d'un front descendant sur le portb.b1 INT1
    3) Débordement du Timer0
    4) Débordement du Timer3

    Si tous les bits d'activation des interruptions sont à 1
    T0CON.TMR0ON , T3CON.TMR3ON, INTCON.TMR0IE, INTCON.INT0IE, INTCON3.INT1IE, INTCON.GIE,
    INTCON.PEIE.
    Tout fonctionne...mais voilà quand j"interdit les 2 interruptions INT0,INT1 en mettant à zéro
    INTCON.INT0IE et INTCON3.INT1IE, je continue malgré tout à détecter les fronts descendants.
    Le seul moyen pour les arrêter c'est de désactiver également les timers, je ne vois pas bien pourquoi.

    Il est a noter que pour le moment je ne peux tester le programme que sur Isis (simulateur).

    Le µcontroleur est un PIC 18f8722 et j'utilise MikroC.

    @+

    -----

  2. #2
    invite03481543

    Re : Problèmes avec plusieurs interrutions

    Bonjour,

    bien sur que l'on peut faire cohabiter toutes les interruptions.
    Déja il suffit de ne pas remettre à 0 le flag de INT0IF ou INT1IF, ou encore de dévalider INT0IE et INT1IE.

    Fais voir un peu ton code.
    Dernière modification par HULK28 ; 26/12/2012 à 09h39.

  3. #3
    invite03481543

    Re : Problèmes avec plusieurs interrutions

    Si tu laisses GIE et PEIE actives il est normal que ça fonctionne toujours.

  4. #4
    flyingrock

    Re : Problèmes avec plusieurs interrutions

    Bonjour HULK28,

    Effectivement elles fonctionnent toutes ensemble mais si je souhaite en désactiver en cours de fonctionnement
    dans mon cas INT0 et INT1 cela ne semble pas possible à cause des timers.

    Pour le moment le code c'est juste 2 compteurs et la détection des 2 fronts rien de plus.
    Code:
      void interrupt() {
      
       if (PIR2.TMR3IF )
            {
            cnt_2++;
    
            TMR3H = 0x3B;       // preset for timer3 MSB register
            TMR3L = 0x89;       // preset for timer3 LSB register
            PIR2.TMR3IF = 0;
           }
      
    
     if (intcon.tmr0if){
           cnt_1 ++;
    
           TMR0H = 0x67;     // preset for timer1 MSB register  attention a l'ordre des registre le H tjs avant
           TMR0L = 0x65;     // preset for timer1 LSB register
           INTCON.TMR0IF = 0;
        }
      if (intcon.int0if){
    
           latd.b1=1;
    
           intcon.int0if=0;
           }
    
       if (intcon3.int1if){
    
           latd.b2=1;
    
           intcon.int0if=0;
           }
    
    
    
    
    }
    
    void aff_cnt_1 ()
               {
               static char ch1;
               lcd_out(2,15,"B");
          ch1 = (cnt_1 / 10000) % 10;
          Lcd_Chr(2,16,48+ch1);
          ch1 = (cnt_1 / 1000) % 10;
          Lcd_Chr(2,17,48+ch1);
          ch1 = (cnt_1 / 100) % 10;
          Lcd_Chr(2,18,48+ch1);
          ch1 = (cnt_1 / 10) % 10;
          Lcd_Chr(2,19,48+ch1);
           ch1 = (cnt_1 % 10) ;
          Lcd_Chr(2,20,48+ch1);
    
               }
    
    void aff_cnt_2 ()
               {
               static char ch2;
               lcd_out(3,15,"P");
          ch2 = (cnt_2 / 10000) % 10;
          Lcd_Chr(3,16,48+ch2);
          ch2 = (cnt_2 / 1000) % 10;
          Lcd_Chr(3,17,48+ch2);
          ch2 = (cnt_2 / 100) % 10;
          Lcd_Chr(3,18,48+ch2);
          ch2 = (cnt_2 / 10) % 10;
          Lcd_Chr(3,19,48+ch2);
           ch2 = (cnt_2 % 10) ;
          Lcd_Chr(3,20,48+ch2);
    
               }
    
    
    
    
    
    void main() {
                      TRISB=0xFF;
                      TRISD=0x00;
                       //initialisation de l'afficheur
                       Lcd_Init();                        // Initialize Lcd
                       Lcd_Cmd(_LCD_CLEAR);               // Clear display
                       Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
    
                      //++++++++++++++++INTERRUPTIONS+++++++++++++++++++++++++++++++++++++++++++
    
                      INTCON.GIE=1;  // Enables all unmasked interrupts
                      INTCON.PEIE=1; // Enables all unmasked peripheral interrupts
                      
                      INTCON.TMR0IE=1; // Enables the TMR0 overflow interrupt
                      INTCON.INT0IE=0; // Enables the INT0 external interrupt
                      INTCON3.INT1IE=0; //  Enables the INT1 external interrupt
                      
    
                      INTCON2.INTEDG0=0; //  Interrupt on falling edge
                      INTCON2.INTEDG1=0; //  Interrupt on falling edge
                      
                      INTCON.INT0IF=0; // initialisation du flag a zero
                      INTCON3.INT1IF=0; // initialisation du flag a zero
                      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                      //+++++++++++++++++++++++TIMER0++++++++++++++++++++++++++++++++++++++++++++
                      T0CON.TMR0ON = 1;// Timer0 On/Off Control bit:1=Enables Timer0 / 0=Stops Timer0
                      T0CON.T08BIT = 0;// Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
                      T0CON.T0CS   = 0;// TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
                      T0CON.T0SE   = 0;// TMR0 Source Edge Select bit: 0=low/high / 1=high/low
                      T0CON.PSA    = 0;// Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
                      T0CON.T0PS2  = 1;// bits 2-0  PS2:PS0: Prescaler Select bits
                      T0CON.T0PS1  = 1;
                      T0CON.T0PS0  = 1;
                      TMR0H = 0x67;    // preset for Timer0 MSB register
                      TMR0L = 0x65;    // preset for Timer0 LSB register
                      INTCON.TMR0IF = 0; //initialisation du flag a zero
                      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                      //+++++++++++++++++++++++++ Timer3+++++++++++++++++++++++++++++++++++++++
                      // Prescaler=1:8; TMR3 Preset=15241; Freq=99,41346Hz; Period=10,059 ms
                      T3CON.T3CKPS1 = 1;// bits 5-4  Prescaler Rate Select bits
                      T3CON.T3CKPS0 = 1;//
                      T3CON.T3SYNC  = 1;// bit 2 Timer3 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
                      T3CON.TMR3CS  = 0;// bit 1 Timer3 Clock Source Select bit:0=Internal clock (FOSC/4)
                      T3CON.TMR3ON  = 1;// bit 0 enables timer
                      TMR3H = 0x3B;       // preset for timer3 MSB register
                      TMR3L = 0x89;       // preset for timer3 LSB register
                      PIE2.TMR3IE=1;      // autorise l'interruption du timer 3
                      PIR2.TMR3IF = 0;     //initialisation du flag a zero
                      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
             while(1)
             {
                  aff_cnt_1 ();
                  aff_cnt_2 ();
             }
    Dernière modification par HULK28 ; 26/12/2012 à 18h23.

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

    Re : Problèmes avec plusieurs interrutions

    Avec ce code en toute logique je ne devrais pas detecter les front descendants.

    Code:
    INTCON.INT0IE=0; // Enables the INT0 external interrupt
    INTCON3.INT1IE=0; //  Enables the INT1 external interrupt

  7. #6
    invite03481543

    Re : Problèmes avec plusieurs interrutions

    Oui à condition de bien le placer dans ton code.

    Je te suggère d'essayer ainsi:

    Code:
    if ((INTCON.INT0IF) && (INTCON.INT0IE))
         {
    
           latd.b1=1;
    
           intcon.int0if=0;
           }
    
       if ((INTCON3.INT1IF) && (INTCON3.INT1IE ))
         {
    
           latd.b2=1;
    
           intcon3.int1if=0;
          }
    @+
    Dernière modification par HULK28 ; 26/12/2012 à 18h21.

  8. #7
    invite03481543

    Re : Problèmes avec plusieurs interrutions

    Dans ton post #4 il y a une erreur, je l'ai mise en rouge.
    Tu déclares la même chose pour les deux évènements donc ça ne peut pas fonctionner

    Corrige avec ce que je t'ai posté juste au dessus et ça va le faire.

  9. #8
    flyingrock

    Re : Problèmes avec plusieurs interrutions

    Bonsoir HULK28,

    Je me suis aperçu de mon erreur après avoir posté le code, mais trop tard

    Par contre j'étais loin de me douter que je devais tester en plus du flag de l'interruption
    si celle-ci est active ou pas.
    Est ce que c'est quelque chose que l'on doit faire systématiquement quand on teste si
    le flag d'une interruption passe à 1 ?

    Tout ça pour dire qu'avec les modifs que tu m'a suggérées ça marche.

    Merci.

  10. #9
    invite03481543

    Re : Problèmes avec plusieurs interrutions

    Disons que c'est plus pratique.
    Imagine que tu ne le fasses pas et que tu déclares quelque part dans ton programme GIE=1; PEIE=1; dans ce cas ton interruption avec INT0 ou INT1 sera aussi activée.
    En manipulant uniquement les bits d'autorisation des interruptions concernées tu évites ce genre de problème.
    De manière générale GIE/PEIE doivent rester activées sauf si tu as besoin d'agir sur toutes les interruptions en même temps (les activer ou les stopper), ensuite si tu souhaites stoper uniquement INT0 tu agis directement et uniquement sur INT0IE.

  11. #10
    Forhorse

    Re : Problèmes avec plusieurs interrutions

    Si je me rappel bien ce qui est inscrit dans la documentation, sur un PIC les flag d'interruption (xxxIF) sont toujours actifs lorsque l’événement correspondant se produit, que l'interruption correspondante soit activée ou non.
    Tout projet flou conduit à une connerie précise !

  12. #11
    flyingrock

    Re : Problèmes avec plusieurs interrutions

    Je confirme c'est bien écrit à plusieurs reprises dans la doc, peut être qu'écrit plus gros je l'aurai vu et encore c'est pas sûr...

    "Interrupt flag bits are set when an interrupt
    condition occurs, regardless of the state of
    its corresponding enable bit or the Global
    Interrupt Enable bit, GIE (INTCON<7>).
    "

    Mais alors à quoi servent ces bits de validation dans l'activation des interruptions ?

  13. #12
    Forhorse

    Re : Problèmes avec plusieurs interrutions

    A déclencher le vecteur d'interruption
    Tout projet flou conduit à une connerie précise !

  14. #13
    flyingrock

    Re : Problèmes avec plusieurs interrutions

    Ok merci beaucoup.

Discussions similaires

  1. problemes a plusieurs inconnus
    Par invite16139149 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 25/09/2012, 12h29
  2. problèmes à plusieurs inconnus
    Par invite16139149 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 25/09/2012, 00h24
  3. [Brun] TV Schneider 52tb1452 : plusieurs problèmes ! [résolu]
    Par olympee dans le forum Dépannage
    Réponses: 4
    Dernier message: 05/02/2011, 10h15
  4. Programmation en C : Plusieurs interruptions avec PIC 18
    Par lcoulon dans le forum Électronique
    Réponses: 2
    Dernier message: 24/10/2010, 08h07
  5. Plusieurs problèmes
    Par inviteb33108a8 dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 24/03/2007, 19h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.