problème de programmation
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

problème de programmation



  1. #1
    invitec93fa417

    Arrow problème de programmation


    ------

    salut,
    je viens de réaliser un programme en langage C à l'aide du compilateur
    picc en utilisant un PIC16F877A. alors, mon programme réalise un saisie de clavier sur un écran LCD juste après l'affichage du message "veuillez entrer le code", en tout cas, mon problème est que je veux que le code saisie soit testé avec le code de référence (dans mon cas 1234) mais il affiche toujours "code incorrect", j'ai tout essayé avant de poster cet appel d'aide alors je serai reconnaissant à toute personne qui m'aide et merci...

    Code:
    #include "16F877A.h"
    #include "string.h"
    #use delay(clock=10M)
    #byte PORTB= 0x06
    #byte PORTC= 0x07
    #byte TRISB= 0x86
    #byte TRISC= 0x87
    #byte PORTD= 0x08
    #byte TRISD= 0x88
    #bit E =PORTC.0
    #bit RS=PORTC.1
    #bit C1=PORTD.0
    #bit C2=PORTD.1
    #bit C3=PORTD.2
    char texte[28]="veuillez saisir le code    ";
    char Tvrep[13]="code correct";
    char Tfrep[15]="code incorrect";
    int i;
    char touche=' ';
    void envoie_commande(char commande)
    {
       E=0;
       RS=0;//mode commande
       PORTB=commande;
       E=1;
       delay_us(50);
       E=0;
    }
    void envoie_caractere(char caractere)
    {
       E=0;
       RS=1;//mode affichage
       PORTB=caractere;
       E=1;
       delay_us(50);
       E=0;
    }
    #int_timer0
    void clavier()
    {
       touche=' ';
       PORTD=0x08;//Selection de la ligne A
       if(C1==1){touche='1';while(C1==1);}
       if(C2==1){touche='2';while(C2==1);}
       if(C3==1){touche='3';while(C3==1);}
       PORTD=0x10;//Selection de la ligne B
       if(C1==1){touche='4';while(C1==1);}
       if(C2==1){touche='5';while(C2==1);}
       if(C3==1){touche='6';while(C3==1);}
       PORTD=0x20;//Selection de la ligne C
       if(C1==1){touche='7';while(C1==1);}
       if(C2==1){touche='8';while(C2==1);}
       if(C3==1){touche='9';while(C3==1);}
       PORTD=0x40;//Selection de la ligne D
       if(C1==1){touche='*';while(C1==1);}
       if(C2==1){touche='0';while(C2==1);}
       if(C3==1){touche='#';while(C3==1);}
    }
    void init_LCD()
    {
       delay_ms(15);//attendre le démarrage du LCD
       envoie_commande(0x3C);//Mode 8bits, 2ligne, 5*10 font
       delay_ms(5);
       envoie_commande(0x3C);//Mode 8bits, 2ligne, 5*10 font
       delay_ms(100);
       envoie_commande(0x0E);//display on, Corseur on, blink off
       delay_ms(5);
       envoie_commande(0x01);// clear dispaly
       delay_ms(5);
    }
    void rotation(int texte[26])
    {
      int A;
      A=Texte[0];
      for(i=0;i<25;i++)  texte[i]=texte[i+1];
      texte[24]=A;
    }      
    
    void main()
    {
       char T[4]={1,2,3,4};
       int j,cmpr;
       char Ts[4];
       TRISB=0x00;
       TRISC=0xFC;
       TRISD=0x87;
       setup_timer_0 (RTCC_DIV_128|RTCC_INTERNAL);
       enable_interrupts(INT_TIMER0);
       enable_interrupts(GLOBAL);
       init_LCD();
       
       func1:
       while(touche==' ')
       {
          disable_interrupts(INT_TIMER0);
          envoie_commande(0x80);
          for(i=0;i<24;i++)  envoie_caractere(texte[i]);
         {
          delay_ms(200);
          rotation(texte);
          }
          enable_interrupts(INT_TIMER0);
       }
       envoie_commande(0x01);// clear dispaly
       delay_ms(5);
       
       for(j=0;j<5;j++)
       {   
          //envoie_commande(0x80);
       func2: if (touche!=' ')
          {
             envoie_caractere('*');
             touche=' ';
             Ts[j]=touche;    
          }
          else {goto func2;}
       }
       while(true)
       {
          
          for(j=0;j<5;j++)
          {
           if (Ts[j]==T[j])
           {
               cmpr=1;
           }
          else {cmpr=0;}  
       }
         
    
          if(cmpr==0)
          {
    //!      else{break;}
       
          disable_interrupts(INT_TIMER0);
          envoie_commande(0x80);
          for(i=0;i<24;i++)  envoie_caractere(Tfrep[i]);
         {
          delay_ms(1000);
          rotation(texte);
          }
          enable_interrupts(INT_TIMER0);
          goto func1;
          }
       else
       {
          disable_interrupts(INT_TIMER0);
          envoie_commande(0x80);
          for(i=0;i<24;i++)  envoie_caractere(Tvrep[i]);
         {
          delay_ms(1000);
          rotation(texte);
          }
          enable_interrupts(INT_TIMER0);
    }
       }
    }

    -----

  2. #2
    DomiM

    Re : problème de programmation

    Bonjour,

    Comment sort il de cette boucle ?
    touche n'est modifié que par Clavier() qui n'est pas appelé dans cette boucle
    Peut être est ce enable_interrupts(INT_TIMER0);
    mais le #INT_TIMER0 me semble mal placé bien que je ne connaisse pas ce compilateur

    Code:
       while(touche==' ')
       {
          disable_interrupts(INT_TIMER0);
          envoie_commande(0x80);
          for(i=0;i<24;i++)  envoie_caractere(texte[i]);
         {
          delay_ms(200);
          rotation(texte);
          }
          enable_interrupts(INT_TIMER0);
       }
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  3. #3
    invitec93fa417

    Re : problème de programmation

    il sort du boucle avec cette condition
    if (touche!=' ')
    le clavier est une interruption par #INT_TIMER0, en plus, le problème se situe au niveau de la comparaison des valeurs des deux tableaux...

  4. #4
    bzh_nicolas

    Re : problème de programmation

    Je ne suis pas très doué en prog matérielle mais :
    Déjà tu as un problème avec ce genre de bloc
    Code:
    for(i=0;i<24;i++)  envoie_caractere(Tfrep[i]);
    {
      delay_ms(1000);
      rotation(texte);
    }
    On retrouve ça 3 ou 4 fois dans ton code.
    Les accolades ne servent à rien là :
    soit tu mets :
    Code:
    for(i=0;i<24;i++)  envoie_caractere(Tfrep[i]);
    delay_ms(1000);
    rotation(texte);
    Là le code fait la même chose que le tien : il appelle 24 fois envoie_caractère puis 1 fois delay_ms puis 1 fois rotation

    Soit tu mets :
    Code:
    for(i=0;i<24;i++)  
    {
      envoie_caractere(Tfrep[i]);
      delay_ms(1000);
      rotation(texte);
    }
    Là, il appelle 24 fois les 3 méthodes.

    Autre remarque (et je pense que le problème vient de là) :
    Code:
    if (touche!=' ')
    {
      envoie_caractere('*');
      touche=' ';
      Ts[j]=touche;    
    }
    Ca ne devrait pas plutôt être :
    Code:
    if (touche!=' ')
    {
      envoie_caractere('*');
      Ts[j]=touche;    
      touche=' ';
    }

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

    Re : problème de programmation

    non! désolé ça marcha pas, ce que je veux savoir c'est comment comparer 2 tableaux de char sachant que l'un d'eux est un tableau déja prédéfini au niveau de void main() telle que:

    Code:
    char T[4]={1,2,3,4};

  7. #6
    DomiM

    Re : problème de programmation

    ya un autre bug

    for(j=0;j<5;j++)

    for(j=0;j<4;j++) car 0,1,2,3 ça fait 4
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  8. #7
    bzh_nicolas

    Re : problème de programmation

    Citation Envoyé par killerbee Voir le message
    non! désolé ça marcha pas, ce que je veux savoir c'est comment comparer 2 tableaux de char sachant que l'un d'eux est un tableau déja prédéfini au niveau de void main() telle que:

    Code:
    char T[4]={1,2,3,4};
    Ta méthode de comparaison est bonne, je ne l'ai pas testé mais je n'y voit pas de problème. Je pense plutôt que ton problème provient de la récupération des caractères tapés. Tu as essayé de les réafficher directement voir ce que ça donne après les avoir récupérer.
    P.S. : je confirme mon post précédent :
    Code:
    if (touche!=' ')
    {
      envoie_caractere('*');
      touche=' '; 
    // là tu remplis ton tableau d'espace puisque tu modifie touche avant d'affecter ton tableau
      Ts[j]=touche;    
    }
    Dans le code suivant c'est bon, tu mets touche dedans:
    Code:
    if (touche!=' ')
    {
      envoie_caractere('*');
      Ts[j]=touche;   
      touche=' ';
    }
    EDIT : oups double post le précédent est à supprimer (mauvaise manip)

  9. #8
    DomiM

    Re : problème de programmation

    ben non elle est pas bonne

    ya un autre bug

    for(j=0;j<5;j++)

    for(j=0;j<4;j++) car 0,1,2,3 ça fait 4
    Mesurer la masse de la situation permettrait de connaitre sa gravité :)

  10. #9
    bzh_nicolas

    Re : problème de programmation

    Ah oui exact j'avais sauté ton message. Du coup, il y a 2 boucles à revoir : celle qui récupère les données et celle qui fait la comparaison.

Discussions similaires

  1. probleme programmation C
    Par physicien007 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 13/11/2010, 12h17
  2. probléme en programmation lineaire
    Par invite2c49e8aa dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 23/03/2010, 09h51
  3. probleme programmation C
    Par inviteba5c14d8 dans le forum Électronique
    Réponses: 7
    Dernier message: 09/05/2008, 21h37
  4. Probleme de Programmation CN
    Par invitec07cc70f dans le forum Technologies
    Réponses: 2
    Dernier message: 10/02/2007, 15h54
  5. probleme de programmation
    Par invitefbbbadb6 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 01/10/2006, 15h28