problème d’interruption en miKroC
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

problème d’interruption en miKroC



  1. #1
    invite92e1bd02

    problème d’interruption en miKroC


    ------

    Bonjour
    SVP j'ai besoin de votre aide, pour mon projet je dois gérer les appels d'un ascenseur de 4 étages j'ai utilisé un programme d’interruption pour la gestion de l'appel celui-ci .
    il y a 4 boutons(button1 étage1 button2 étages2... etc.) qui sont connectés en port RB0.
    Lors de deux ou trois ou quatre appels successifs de l'ascenseur le programme doivent exécute le premier appel et doit enregistrer le deuxième troisième etc . afin de l'exécuté après qu'il se termine du premier appel ...et ça pour les quatre buttons
    dans mon programme il ne fait pas l'enregistrement est-ce qu'il y a quelqu'un qui peut m'aider.
    voici le programme en miKroc ;
    merci d'avance

    Code:
    char  keypadPort at PORTD;                                                      //declaration du Port D en temps que clavier
    int pDestination[5];
    int n=0;
    
    int etage1(int i)                                                               //fonction de convertion de l'etage du BCD-->decimal
    {
         switch(i)
         {        case 0 : return -1;
                  case 3 : return 0;
                  case 5 : return 1;
                  case 9 : return 2;
                  case 17 : return 3;
                  case 33 : return 4;
         }
    }
    
    int Capteur(int i)
    {
         switch(i)
         {        case 0 : return -1;
                  case 1 : return 0;
                  case 2 : return 1;
                  case 4 : return 2;
                  case 8 : return 3;
                  case 16 : return 4;
         }
    }
    void interrupt(void)                                                            //fonction interruption de INT pour la gestion des demandes des etages                                                                                  //l'ascenseur
    {
         INTCON.GIE=0;
         if(INTCON.INTF)
         {
                        
                        pDestination[n]=etage1(PORTB);
                        n++;
                        INTCON.INTF=0;
         }
         INTCON.GIE=1;
    }
    
    void main()
    {
    
         int i=0,kp=0,demande=-1,capteur,etage=0,capt=-1,choix[5],c,j,k,l,m,z;
         Keypad_Init();                                                             //Initialisation du clavier
         TRISA=0x1F;                                                                //Port A en entré( INPUT)
         TRISC=0x00;                                                                //Port C en sortie
         TRISB=0xFF;
         TRISE=0x00;
         ADCON1=0x06;                                                               //Declaration u port A en entré numerique
         PORTC=0;                                                                   /* Initialisation du afficheur 7 seg */
         PORTE=0x00;
         INTCON.GIE=1;                                                              //Autorisation total des interruption
         INTCON.INTE=1;
         INTCON.INTF=0;                                                             //Autorisation de l'interruption INT
         for(i=0;i<5;i++)
                         pDestination[i]=-1;
         while(1)
         {
                    for(l=0;l<5;l++)
                         choix[l]=5;
                    if(pDestination[0]!=-1)                                         // là on test si il y'a eu une interruption ou pas
                    {
                       demande=pDestination[0];
                       if(demande>etage)
                                       while(demande!=capt)
                                       {
                                                           PORTC.F7=1;
                                                           delay_ms(1000);
                                                           PORTC.F7=0;
                                                           PORTE=0x01;
                                                           etage++;
                                                           PORTC=etage;
                                                           delay_ms(1000);
                                                           capt=capteur(PORTA);
                                       }
                       if(demande<etage)
                                       while(demande!=capt)
                                       {
                                                           PORTC.F6=1;
                                                           delay_ms(1000);
                                                           PORTC.F6=0;
                                                           PORTE=0x01;
                                                           etage--;
                                                           PORTC=etage;
                                                           delay_ms(1000);
                                                           capt=capteur(PORTA);
                                       }
                       PORTE=0x00;
                       delay_ms(1000);
                       PORTC.F4=1;
                       delay_ms(2000);
                       PORTC.F4=0;
                       delay_ms(5000);
                       demande=-1;
                       j=0;
                       while(j<4 && i<4)
                       {
                       c=0;
                       do{
                                  kp = Keypad_Key_Click();
                                  c++;
                       }while (!kp && c<500);
                       switch(kp)
                       {
                                 case 0 : break;
                                 case 1 : choix[i]=0;i++;break;
                                 case 2 : choix[i]=1;i++;break;
                                 case 3 : choix[i]=2;i++;break;
                                 case 5 : choix[i]=3;i++;break;
                                 case 6 : choix[i]=4;i++;break;
                                 case 7 : PORTE.F2=1;
                                          delay_ms(2000);
                                          PORTE.F2=0;
                                          break;
                       }
                       kp=0;
                       j++;
                       }
                       PORTC.F5=1;
                       delay_ms(2000);
                       PORTC.F5=0;
                       i=0;
                       for(k=0;k<4;k++)
                                       for(l=k;l<5;l++)
                                                       if(choix[l]<choix[k])
                                                       {
                                                                            m=choix[l];
                                                                            choix[l]=choix[k];
                                                                            choix[k]=m;
                                                       }
                       k=0;
                       while(k<5)
                       {
                       if(choix[k]<5)
                       {
                       if(choix[k]>etage)
                                       while(choix[k]!=capt)
                                       {
                                                           PORTC.F7=1;
                                                           delay_ms(1000);
                                                           PORTC.F7=0;
                                                           PORTE=0x01;
                                                           etage++;
                                                           PORTC=etage;
                                                           delay_ms(1000);
                                                           capt=capteur(PORTA);
                                       }
                       if(choix[k]<etage)
                                       while(choix[k]!=capt)
                                       {
                                                           PORTC.F6=1;
                                                           delay_ms(1000);
                                                           PORTC.F6=0;
                                                           PORTE=0x01;
                                                           etage--;
                                                           PORTC=etage;
                                                           delay_ms(1000);
                                                           capt=capteur(PORTA);
                                       }
                       PORTE=0x00;
                       delay_ms(1000);
                       PORTC.F4=1;
                       delay_ms(2000);
                       PORTC.F4=0;
                       delay_ms(5000);
                       PORTC.F5=1;
                       delay_ms(2000);
                       PORTC.F5=0;
                       delay_ms(2000);
                       }
                       k++;
                       }
                       demande=-1;
                       for(z=0;z<n;z++)
                                       pDestination[z]=pDestination[z+1];
                       pDestination[n]=-1;
                       n--;
                    }
         }
    }

    -----
    Images attachées Images attachées  
    Dernière modification par gienas ; 24/07/2014 à 07h35. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    invite3d2336a7

    Re : problème d’interruption en miKroC

    Hello,

    Est ce que depuis le temps, le problème est réglé ?
    Aux vues du code, je pense que le problème vient de l'interruption.
    Je pense que tu ne remet pas le Flag à zéro... Tu te contente de réactiver les interruptions. Un petit INTCON.INTF =0; avant de sortir de ton interruption devrait t'aider...

Discussions similaires

  1. problème MikroC
    Par invite2f6724a6 dans le forum Électronique
    Réponses: 9
    Dernier message: 22/03/2013, 16h59
  2. mikroc probleme
    Par invite7dc03981 dans le forum Électronique
    Réponses: 7
    Dernier message: 03/02/2012, 20h09
  3. problème --------->MikroC
    Par invite0a63013b dans le forum Électronique
    Réponses: 16
    Dernier message: 28/12/2011, 20h32
  4. [MikroC] interruption bloque le programme
    Par invite730735cd dans le forum Électronique
    Réponses: 17
    Dernier message: 13/02/2011, 22h59
  5. interruption sur MikroC
    Par invite3d4f2ff3 dans le forum Électronique
    Réponses: 3
    Dernier message: 04/05/2010, 22h36
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...