projet avec mikroc
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

projet avec mikroc



  1. #1
    invite6c3ef481

    projet avec mikroc


    ------

    j ai une probleme dans la fonction interrupt() dans mikroc
    je relie une pic 16f877 et lcd et keyboard (simulation isis) et la procédure interrupt ne fonctionne pas
    malgré j ai bien écrit la procédure et bien definie en main ()
    est ce qu il ya quelque chose exception dans l interruption pour 16f877 et lcd !!!
    voilà le code d interuption

    Code:
    void iterrupt ()
        {
          if(INTCON.INTF){
           INTCON.INTF=0;
    
    
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
            INTCON.INTF=0;
    
        }
        }
    .
    ..
    .
    .
    . void main()
    {TRISB=0xFD;
                 PORTB=0;
      INTCON.INTF=0;
                INTCON.GIE=1;
     INTCON.INTE=1;
    .......
    }

    -----
    Dernière modification par gienas ; 25/01/2014 à 14h02. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    invite5c0d525e

    Re : projet avec mikroc

    Je ne connais pas MikroC mais je connais un peu les PIC. Pour autoriser les interruptions il y a quelques registres a configurer (option_reg, intcon, PIE1, PIR1 etc...) Faut lire la DS

    Et puis void iterrupt () je doute que ça passe, void interrupt() c'est mieux

  3. #3
    invite6c3ef481

    Re : projet avec mikroc

    merci pour votre intérer le pic est bien configurer à travers le TRISB et INTCON et c 'est une faute de frappe pour le procédure interrupt.

  4. #4
    Gérard

    Re : projet avec mikroc

    Citation Envoyé par mira1991 Voir le message
    merci pour votre intérer le pic est bien configurer à travers le TRISB et INTCON et c 'est une faute de frappe pour le procédure interrupt.
    Et PIE et PIR ?

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

    Re : projet avec mikroc

    Il y a un paragraphe "interrupt" dans la DS, Il faut le lire !

    Et mettre le code entre deux balises "code" permet d'envoyer le code complet sans faute de frappe.

  7. #6
    invite6c3ef481

    Re : projet avec mikroc

    c quoi le DS!!!
    et voilà le ode complet :
    Code:
                                      unsigned short kp,cp,cpt=0,k[9],j;
                int i=0,a,b,drapeau;
    
    
       void iterrupt ()
        {
          if(INTCON.INTF){
           INTCON.INTF=0;
    
    
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
                  Lcd_Cmd(_LCD_CLEAR);
                  while(1){};
    
               // drapeau=1;
              INTCON.INTF=0;
    
        }
        }
    
     char  keypadPort at PORTD ;
    
                   sbit LCD_RS at RC4_bit;
                   sbit LCD_EN at RC5_bit;
                   sbit LCD_D4 at RC0_bit;
                   sbit LCD_D5 at RC1_bit;
                   sbit LCD_D6 at RC2_bit;
                   sbit LCD_D7 at RC3_bit;
    
          sbit LCD_RS_Direction at TRISC4_bit;
          sbit LCD_EN_Direction at TRISC5_bit;
          sbit LCD_D4_Direction at TRISC0_bit;
          sbit LCD_D5_Direction at TRISC1_bit;
          sbit LCD_D6_Direction at TRISC2_bit;
          sbit LCD_D7_Direction at TRISC3_bit;
    
    void activate()
         {
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
               PORTB.RB1=1;
               delay_ms(2000);
               PORTB.RB1=0;
         }
    
    int password()
     {   
    
          int a;
       do
        {
            Lcd_out(2,1,"code:");
            delay_ms(1000);
    
            kp=0; i=0;
           
            do{
                do
                   {
                      kp = Keypad_Key_Click();
                   } while (!kp);
                switch (kp) { case 3: kp=3; break;
                              case  2: kp = 48; break; // 0
                              case  5: kp = 49; break; // 1
                              case  6: kp = 50; break; // 2
                              case  7: kp = 51; break; // 3
                              case  9: kp = 52; break; // 4
                              case 10: kp = 53; break; // 5
                              case 11: kp = 54; break; // 6
                              case 13: kp = 55; break; // 7
                              case 14: kp = 56; break; // 8
                              case 15: kp = 57; break; // 9
    
                              default: break;
                            }
    
    
                 Lcd_chr(2, i+7, kp);
                 K[i]=kp;
                 delay_ms(200);
                 Lcd_chr(2, i+7, '*');
                 delay_ms(500);
                 i++;
            } while(kp!=3);
    
              if((k[0]==48)&&(k[4]==3)&&(k[1]==48)&&(k[2]==48)&&(k[3]==48))
                 a=1;
    
               else
               {
                         Lcd_Cmd(_LCD_CLEAR);
                        Lcd_Cmd(_LCD_CURSOR_OFF);
                        lcd_out(1,1,"error!!");
                        delay_ms(2000);
                        Lcd_Cmd(_LCD_CLEAR);
                        Lcd_Cmd(_LCD_CURSOR_OFF);
    
    
                        cpt++;
                         a=0;
    
               }
                  if(cpt==3)
               {
                 Lcd_Cmd(_LCD_CLEAR);
                 Lcd_Cmd(_LCD_CURSOR_OFF);
                 lcd_out(1,1,"  ACESS DENIED ");
                 delay_ms(2000);
                      PORTB.RB1=1;
                  delay_ms(4000);
                  PORTB.RB1=0;
                 Lcd_Cmd(_LCD_CLEAR);
    
                }
    
    
          }while(!a && cpt!=3);
    
             return a;
    
          }
    
    /*char switch_pswrd(char pw[])
    {
       int i;
       char npw[4];
       lcd_cmd(_lcd_clear);
       lcd_out(1,1,"enter current password");
       lcd_cmd(_lcd_clear);
       a=password();
       if(a==1)
       {
         do
         {
           lcd_cmd(_lcd_clear);
           lcd_out(1,1,"enter new password");
           lcd_cmd(_lcd_clear);
           for(i=1;i=4;i++)
            {
               do
                 {
                   kp = Keypad_Key_Click();
                 } while (!kp);
               switch (kp)
               { case 3: kp=3; break;
                 case  2: kp = 48; break; // 0
                 case  5: kp = 49; break; // 1
                 case  6: kp = 50; break; // 2
                 case  7: kp = 51; break; // 3
                 case  9: kp = 52; break; // 4
                 case 10: kp = 53; break; // 5
                 case 11: kp = 54; break; // 6
                 case 13: kp = 55; break; // 7
                 case 14: kp = 56; break; // 8
                 case 15: kp = 57; break; // 9
    
                 default: break;
                } ;
               npw[i]=kp;
               j=1;
               lcd_chr(1,j,kp);
               delay_ms(200);
               lcd_chr(1,j,"*");
               j++;
            }
            lcd_cmd(_lcd_clear);
            lcd_out(1,1,"confirm password");
            a=password();
            if(a==1)
             lcd_out(1,1,"password changed!");
         }while(a!=1);
        }
        return npw;
    } */
    
          void menu()
          {
              Lcd_Cmd(_LCD_CLEAR);
              Lcd_Cmd(_LCD_CURSOR_OFF);
              delay_ms(1000);
              Lcd_Out(1, 4, "Menu :");
              delay_ms(500);
              Lcd_Cmd(_LCD_CLEAR);
              Lcd_Cmd(_LCD_CURSOR_OFF);
              Lcd_out(1,1,"1-Activ sys");
              Lcd_out(2,1,"2-pwrd");
              lcd_out_cp(" 3-quit");
              delay_ms(100);
              
    
    
           }
    
    
    
    void main()
    {         
    
    
                TRISB=0xFD;
                 PORTB=0;
                /* drapeau=0;
                  if(drapeau==1)
                {
                  PORTB.RB1=1;
                  delay_ms(2000);
                  PORTB.RB1=0;
                  PORTB.RB1=1;
                  delay_ms(2000);
                  PORTB.RB1=0;
                  drapeau=0;
                } */
    
                 Keypad_Init();
                  Lcd_Init();
                  Lcd_Cmd(_LCD_CLEAR);
                  Lcd_Cmd(_LCD_CURSOR_OFF);
                  Lcd_out(1,1,"BIENVENUE !!!");
    
                  delay_ms(1000);
                  Lcd_Cmd(_LCD_CLEAR);
                  Lcd_Cmd(_LCD_CURSOR_OFF);
                  delay_ms(1000);
                  
                   INTCON.INTE=1;
                //INTCON.RBIE=1;
               // INTCON.RBIF=0;
    
               INTCON.INTF=0;
                INTCON.GIE=1;
                  a=password();
            if (a==1)
             {
               menu();
    
             }
    
    
                kp=0;
    
    
           
                  do
                    {
                      kp = Keypad_Key_Click();
                     }  while (!kp);
              
                    switch (kp)
                             {
                              case 3: kp=3; break;
                              case  2: kp = 48; break; // 0
                              case  5: kp = 49; break; // 1
                              case  6: kp = 50; break; // 2
                              case  7: kp = 51; break; // 3
                              case  9: kp = 52; break; // 4
                              case 10: kp = 53; break; // 5
                              case 11: kp = 54; break; // 6
                              case 13: kp = 55; break; // 7
                              case 14: kp = 56; break; // 8
                              case 15: kp = 57; break; // 9
    
                              default: break;
                            }
    
    
    
    
    
                 if(kp==51)
                   {
                       Lcd_Cmd(_LCD_CLEAR);
                       Lcd_Cmd(_LCD_CURSOR_OFF);
                    }
               if(kp==49)
               {
    
    
                       Lcd_Cmd(_LCD_CLEAR);
                       Lcd_Cmd(_LCD_CURSOR_OFF);
                       Lcd_out(1,1,"Activation sys");
                       Lcd_out(2,1,"1-yes 2-exit ");
                       delay_ms(100);
                 }
                       do
                          {
                            kp=keypad_key_click();
                          } while(!kp);
                  
                   switch (kp)
                             {
                              case 3: kp=3; break;
                              case  2: kp = 48; break; // 0
                              case  5: kp = 49; break; // 1
                              case  6: kp = 50; break; // 2
                              case  7: kp = 51; break; // 3
                              case  9: kp = 52; break; // 4
                              case 10: kp = 53; break; // 5
                              case 11: kp = 54; break; // 6
                              case 13: kp = 55; break; // 7
                              case 14: kp = 56; break; // 8
                              case 15: kp = 57; break; // 9
    
                              default: break;
                            }
    
                      if (kp==50)
    
                         {
                            Lcd_Cmd(_LCD_CLEAR);
                            Lcd_Cmd(_LCD_CURSOR_OFF);
                            delay_ms(100);
                            menu();
                            delay_ms(1000);
    
                         }
    
                           if (kp==49)
                       {
                           do
                             {
                              Lcd_Cmd(_LCD_CLEAR);
                              activate();
                              do
                                { kp=keypad_key_click();
                                }while(!kp);
                               switch (kp)
                             {
                              case 3: kp=3; break;
                              case  2: kp = 48; break; // 0
                              case  5: kp = 49; break; // 1
                              case  6: kp = 50; break; // 2
                              case  7: kp = 51; break; // 3
                              case  9: kp = 52; break; // 4
                              case 10: kp = 53; break; // 5
                              case 11: kp = 54; break; // 6
                              case 13: kp = 55; break; // 7
                              case 14: kp = 56; break; // 8
                              case 15: kp = 57; break; // 9
    
                              default: break;
                            }
    
    
                       }   while(kp!=3);
                      }
                       if(kp==3)
                        { a=password();
                          if(a==1)
                            { Lcd_Cmd(_LCD_CLEAR);
    
                            }
    
                          else
                            {PORTB.RB1=1;
                             delay_ms(2000);
                             PORTB.RB1=0;
                           //  PORTA.RA0=1;
                             delay_ms(1000);
                           //  PORTA.RA0=1;
                             }
                        }
                       Lcd_Cmd(_LCD_CLEAR);
                       Lcd_Cmd(_LCD_CURSOR_OFF);
    
    
          }
    Dernière modification par gienas ; 25/01/2014 à 14h04. Motif: Ecore les balises code

  8. #7
    invite6c3ef481

    Re : projet avec mikroc

    à quoi sert configurer PIE et PIR ?

  9. #8
    invite5637435c

    Re : projet avec mikroc

    Bonjour,

    comme il a été dit plus haut il y a plusieurs problèmes dans votre code.
    Tout d'abord on ne met jamais un délai dans la routine d'interruption, celle-ci est destinée à gérer les évènements de type interruptif, et doit permettre de les traiter au plus vite pour ne pas rater d'autres évènements de même nature.
    Autre problème est que pour pouvoir être traité, un évènement de type interruptif doit être initialisé et le ou les registres associés doivent être renseignés.
    Lorsqu'une interruption intervient un drapeau (flag) est levé pour indiquer que l'évènement à été détecté, encore faut-il que celui-ci ait été initialisé et remis à 0 une fois pris en compte pour détecter l'évènement suivant.
    Il faut également que les interruptions auquel l'évènement est rattaché soient dûment activées (PEIE, GIE, RBIE ou autres).
    Donc il faut revoir votre code en vérifiant qu'à l'init du PIC tout cela soit proprement déclaré, puis que les drapeaux (RBIF, INTF ou autres) soient remis à 0 si ceux-ci ne le sont pas mis automatiquement par le dispositif dont ils dépendent.

  10. #9
    invite5637435c

    Re : projet avec mikroc

    Je ne sais pas quelle version de mikroC vous avez, ce serait bien utile pour vous répondre efficacement.Il vous manque la déclaration PEIE=1 (activation des interruption périphériques).De plus dans la routine d'interruption vous appelez la fonction LCD_CMD(_LCD_CLEAR) il y a fort à parier que votre compilateur vous refuse ce genre de familiarité...Avez-vous des messages d'erreur ou de warning suite à vote compilation?Restructurez votre code en commençant par placer en haut de code vos déclarations de variables (pas après la routine d'interruption), de créer une fonction d'init (par exemple PIC_init()) dans laquelle vous rassemblez tout ce qui permettra de retrouver facilement l'init de vos ports, l'init de vos IT, etc.Ce sera la première fonction appelée dans votre main().Puis créez des fonctions dédiées pour chaque type d'action, vous y gagnerez en lisibilité.Le principe général est d'avoir un main() contenant une boucle while(1) dans laquelle vous gèrerez vos actions cycliquement ou vos actions que déclencheront un évènement de type interruptif.Si cet évènement n'exige pas un temps de réponse à tout épreuve vous pouvez vous contentez de mettre à 1 une variable dans  la routine d'interruption lorsque l'évènement est détecté puis lorsque dans la boucle de traitement vous voyez cette variable activée vous faites l'action attendue.Une fois fait vous remettez cette variable à 0.Je vous rappelle qu'une variable gérée à la fois dans la routine d'interruption et ailleurs doit être déclarée sous la forme suivante:
    Code:
    volatile type nom_ma_variable ;
    Par exemple:
    Code:
    volatile char detection_appui; // variable de type char

  11. #10
    invite6c3ef481

    Re : projet avec mikroc

    version de mikroc est v.5.6.1 et j ai ajouté INTCON.PEIE et pas de solution je pense que c est une probleme de fonctionnement de pic + lcd+ interruption

  12. #11
    invite5637435c

    Re : projet avec mikroc

    Oui c'est même sur

    Il faut environ une demi heure pour rebâtir ton programme et le rendre fonctionnel.
    Tu tombes bien, j'ai 30 mn à te consacrer.

    Je reviens vers toi dès que j'ai fini.
    @+

  13. #12
    invite5637435c

    Re : projet avec mikroc

    J'ai fait un copier-coller de ton code et je l'ai intégré dans mon compilateur tel quel.
    Une première erreur apparait:

    Code:
    void iterrupt()
    A remplacer par:
    Code:
    void interrupt()

  14. #13
    invite6c3ef481

    Re : projet avec mikroc

    elle fonctionne maintenant mais une seul fois dés que j appuie sur le boutton poussoir la premiere fois

  15. #14
    invite5637435c

    Re : projet avec mikroc

    Bon je vais déjeuner et je reviens.
    Je voulais te poster mon code mais ce satané forum est bourré de bug dans l'éditeur, impossible défaire un copier-coller.

  16. #15
    invite6c3ef481

    Re : projet avec mikroc

    elle fonctionne bien merci pour vos aides

  17. #16
    invite5637435c

    Re : projet avec mikroc

    Voici une remise en forme partielle de ton code, tu n'as plus qu'à t'en inspirer selon mes recommandations précédentes.

    Un bon code se doit d'être lisible, commenté et bien organisé, c'est le minimum pour s'y retrouver.
    @+
    Fichiers attachés Fichiers attachés

  18. #17
    invite5637435c

    Re : projet avec mikroc

    Au fait moi je suis en version 6.0, normalement vu le peu de fonctions que j'appelle ça devrait être compilable sur ta version sans modif.
    Je ne t'ai mis qu'un exemple de variable dans le while(1) mais c'es généralisable vu ce que tu souhaites faire.
    Idéalement il vaut mieux créer des tempo réarmables pour ne pas utiliser des fonctions à la con genre Delay_ms() qui n'ont rien à faire dans un vrai code, si ce n'est le bloquer... inutilement.
    @+

  19. #18
    invite6c3ef481

    Re : projet avec mikroc

    merci bien hulk28 vos aides

Discussions similaires

  1. probleme avec MIKROC
    Par invite1bbe5889 dans le forum Électronique
    Réponses: 1
    Dernier message: 04/08/2013, 12h01
  2. Projet 7 segments mikroC PRO
    Par invite335f57b5 dans le forum Électronique
    Réponses: 2
    Dernier message: 01/04/2013, 22h39
  3. Le PWM avec MikroC
    Par invited3dcf66c dans le forum Électronique
    Réponses: 12
    Dernier message: 24/02/2013, 16h04
  4. MikroC for Pic et programme C avec LCD
    Par invitec7e72fce dans le forum Électronique
    Réponses: 39
    Dernier message: 07/02/2013, 19h05
  5. MikroC et entrée sur Pic 16F88 (projet modelisme)
    Par bypbop dans le forum Électronique
    Réponses: 11
    Dernier message: 27/01/2012, 00h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...