Souci avec l'afficheur LCD (pic 16F877]
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Souci avec l'afficheur LCD (pic 16F877]



  1. #1
    invitecb822ecd

    Souci avec l'afficheur LCD (pic 16F877]


    ------

    Bonjour,

    Je voudrais tester la conduction des fils, donc j'ai fait un schéma ISIS ou j'ai mis des connecteurs (fermé dans le cas où le fil est passant, ouvert si le fil est bloquant). Et je voudrais afficher sur un afficheur LCD l'état de chaque fil systématiquement (s'il est passant ou non).

    J'ai fait un programme en langage C sur MikroC pro mais j'ai un petit problème, l'afficheur saute quelques instructions pendant la simulation et je ne sais pas où est le problème.

    Je vous mets ici le montage ISIS et le programme ci-dessous (juste le void main) :

    Code:
    void main() {
    
       TRISB=0xFF;
              Lcd_Init();
              Lcd_Cmd(_LCD_CLEAR);
              Lcd_Cmd(_LCD_CURSOR_OFF);
      Lcd_Out(1, 1, "TEST START");
                     delay_ms(500) ;
            while(1)
            {
            delay_ms(500);
           if (PORTB.F0==1)
            {
              Lcd_Out(1, 1, " Fil 1 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 1" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
              
    
           if (PORTB.F1==1)
            {
              Lcd_Out(1, 1, " Fil 2 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 2" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
                  
           if (PORTB.F2==1)
            {
              Lcd_Out(1, 1, " Fil 3 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 3" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
    
           if (PORTB.F3==1)
            {
              Lcd_Out(1, 1, " Fil 4 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 4" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
    
           if (PORTB.F4==1)
            {
              Lcd_Out(1, 1, " Fil 5 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 5" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
    
           if (PORTB.F5==1)
            {
              Lcd_Out(1, 1, " Fil 6 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
            else
              Lcd_Out(1, 1, " Faulty Fil 6 " );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
    
            if (PORTB.F6==1)
            {
              Lcd_Out(1, 1, " Fil 7 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
            else
              Lcd_Out(1, 1, " Faulty Fil 7" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    
    
            if (PORTB.F7==1)
            {
              Lcd_Out(1, 1, " Fil 8 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 8" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);

    J'ai besoin de votre aide s'il vous plaît.

    -----
    Images attachées Images attachées  
    Dernière modification par gienas ; 21/06/2012 à 13h12. Motif: Ajouté balises code obligatoires pour les programmes

  2. #2
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Bonjour
    Avez vous ajouté les connections du module LCD avant la main???
    A+

  3. #3
    invitecb822ecd

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Ouais évidemment, comme suit :

    Code:
    sbit LCD_RS at RD4_bit;
    sbit LCD_EN at RD5_bit;
    sbit LCD_D4 at RD0_bit;
    sbit LCD_D5 at RD1_bit;
    sbit LCD_D6 at RD2_bit;
    sbit LCD_D7 at RD3_bit;
    
    sbit LCD_RS_Direction at TRISD4_bit;
    sbit LCD_EN_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD0_bit;
    sbit LCD_D5_Direction at TRISD1_bit;
    sbit LCD_D6_Direction at TRISD2_bit;
    sbit LCD_D7_Direction at TRISD3_bit;
    Dernière modification par gienas ; 21/06/2012 à 13h15. Motif: Balises code

  4. #4
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Re.
    Apparemment il est juste !
    pourriez vous joindre les fichier .c et isis? comme ça on peut analyser le programme.
    A+

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

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Oui bien sûr voilà.
    Fichiers attachés Fichiers attachés

  7. #6
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    En attente de validation ...

  8. #7
    invitecb822ecd

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Qui doit les valider en fait ?

  9. #8
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Les modérateurs de ce forum

  10. #9
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Re.
    essayez de supprimer tous les blocs de else.
    Qu'est ce qu'il vous donne comme résultat???

  11. #10
    invitecb822ecd

    Re : Souci avec l'afficheur LCD (pic 16F877]

    ça marche dans le cas où je supprime les ELSE, mais je comprends toujours pas pourquoi.

  12. #11
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Re.
    vraiment c'est blizzard. il me semble que le pic ne supporte pas 8 boucles de "if-else"!!!, j'ai supprimé 2 "if-else": la première qui affiche l'état du fil 5 et l'autre pour afficher l'état du 6 et il donne les bonnes résultats!!!
    svp essayez vous même de supprimer ces blocs (fil 5 et 6)?? qu'est ce qu'il donne??
    A+

  13. #12
    invitecb822ecd

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Oui c'est bon, mais c'est vraiment bizarre.
    Bon je travaille sans boucles ELSE dans ce cas, je n'ai pas d'autres choix.

    Merci beaucoup pour votre implication.

  14. #13
    invite40805967

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Un PIC qui ne supporte pas 8 boucles if/else? Oula non c'est pas ça le problème : Quand tu dis simulation tu fais une simple simulation logicielle ou bien tu fais un deboguage logiciel/circuit?

    Si c'est du debuguage sur circuit tu as brancher deux de tes fils sur les pattes RB6 et RB7 : c'est justement les pattes destinés à communiquer avec le logiciel lors d'un debuguage sur circuit : change de pin et laisse tes if-else.Ou bien laisse tes pin et tu programme ton pic de manière autonome et ca marchera.

    Si tu fais une simulation simplement logicielle, quelle partie est sautée?

  15. #14
    invite0e5af214

    Re : Souci avec l'afficheur LCD (pic 16F877]

    il me semble que le pic ne supporte pas 8 boucles de "if-else"!
    Qu'est-ce qu'il faut pas lire !!!

    1) Le pic comme vous dites peut exécuter autant de conditions if/else qu'il a de mémoire, c'est à dire ENORMEMENT comparé à la taille d'une instruction.
    2) Détail minime, mais if/else n'est pas une boucle

    3) Ca s'écrit :
    Code:
    if(condition)
    {                                  <---  Accolade ouvrante
       // Code
    }                                  <--- Accolade fermante
    else
    {                                  <---  Accolade ouvrante
        // Code
    }                                  <--- Accolade fermante
    Or, dans le code posté au début, il manque les accolades ouvrantes et fermantes après chaque ELSE.

    Vous allez me dire "oui mais ça compile"
    En effet, mais par convention, sans accolade, seule l'instruction qui suit le ELSE est sautée

    Donc dans le code :
    Code:
           if (PORTB.F0==1)
            {
              Lcd_Out(1, 1, " Fil 1 OK ");
              delay_ms(1000)    ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300) ;
            }
           else
              Lcd_Out(1, 1, " Faulty Fil 1" );
              delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    Les instructions
    Code:
     delay_ms(1000) ;
              Lcd_Cmd(_LCD_CLEAR);
              delay_ms(300);
    sont exécutées à chaque fois, quelque soit la valeur de PORTB.F0

    Même raisonnement pour tous les ELSE du programme.

  16. #15
    invitefa15af9f

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Re.
    Citation Envoyé par sin92 Voir le message
    Un PIC qui ne supporte pas 8 boucles if/else?
    Désolé , erreur de frappe c'est pas boucle
    j'ai changé le port B par C ,j'ai choisi XT comme type d'oscillateur, j'ai changé même la fréquence d'horloge à 4 MHz que ça soit dans le mikroC et ISIS!!! et il reste le même problème. mais dés que je supprime les deux blocs que j'avais cité , le programme ça marche bien!!
    voici le programme que j'ai compilé :
    sbit LCD_RS at RD4_bit;
    sbit LCD_EN at RD5_bit;
    sbit LCD_D4 at RD0_bit;
    sbit LCD_D5 at RD1_bit;t
    sbit LCD_D6 at RD2_bit;
    sbit LCD_D7 at RD3_bit;

    sbit LCD_RS_Direction at TRISD4_bit;
    sbit LCD_EN_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD0_bit;
    sbit LCD_D5_Direction at TRISD1_bit;
    sbit LCD_D6_Direction at TRISD2_bit;
    sbit LCD_D7_Direction at TRISD3_bit;

    void main() {
    ADCON1 |= 0x0F; // Configure AN pins as digital
    CMCON |= 7; // Disable comparators
    TRISC=0b11111111;
    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Out(1, 1, "TEST START");
    delay_ms(500) ;
    do
    {
    delay_ms(500);

    if (RC0_bit==1)
    {
    Lcd_Out(1, 1, " Fil 1 OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);

    } else {
    Lcd_Out(1, 1, " Fil 1 not OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);
    }
    if (RC1_bit==1)
    {
    Lcd_Out(1, 1, " Fil 2 OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);

    } else {
    Lcd_Out(1, 1, " Fil 2 not OK ");
    delay_ms(1000) ;
    Lcd_Cmd(_LCD_CLEAR);
    }
    if (RC2_bit==1)
    {
    Lcd_Out(1,1," Fil 3 OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);

    } else {
    Lcd_Out(1, 1, " Fil 3 not OK ");
    delay_ms(1000) ;
    Lcd_Cmd(_LCD_CLEAR);

    }
    if (RC3_bit==1)
    {
    Lcd_Out(1,1, " Fil 4 OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);
    } else {
    Lcd_Out(1, 1, " Fil 4 not OK ");
    delay_ms(1000) ;
    Lcd_Cmd(_LCD_CLEAR);
    }

    if (RC6_bit==1)
    {
    Lcd_Out(1,1," Fil 7 OK ");
    delay_ms(500) ;
    Lcd_Cmd(_LCD_CLEAR);

    } else {
    Lcd_Out(1, 1, " Fil 7 not OK ");
    delay_ms(1000) ;
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300) ;
    }
    if (RC7_bit==1)
    {
    Lcd_Out(1,1, " Fil 8 OK ");
    delay_ms(1000) ;
    Lcd_Cmd(_LCD_CLEAR);
    } else {
    Lcd_Out(1, 1, " Fil 8 not OK ");
    delay_ms(1000);
    Lcd_Cmd(_LCD_CLEAR);
    delay_ms(300) ;
    }

    }while(1);
    }

  17. #16
    invitefaaca50b

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Combien de fois il faudra repeter qu'isi est une grosse daube. La preuve, la moitié des programmes simul"s avec succes ne fonctionnent pas dans la vraie vie a cause des "amenagements" d'isis, et une autre moitié de programmes qui fonctionnent dans la vraie vie car programmés correctement ne fonctionnent pas du tout sur isis... Isis n'est pas le saint graal, mais une saleté qui marchouille quand ca veut bien...

    La meilleure simulation: une plaque a trou, ou une plaque d'experimentation dediee aux pic, et mplab pour la partie logicielle... Ca vaut toutes les isis et touticouanti...

  18. #17
    invitecb822ecd

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Merci bien pour votre précieuse aide.

  19. #18
    invite4671370c

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Ton schéma il est faux. D0 à D3 faut les mettre à la masse.

    En pratique si tu branche Vee à la masse, tu verras rien sur ton écran. Il faut utiliser un pot pour ajuster la tension dessus.

  20. #19
    invitefaaca50b

    Re : Souci avec l'afficheur LCD (pic 16F877]

    on peut laisser D0 à D3 en l'air, ca ne gene pas... Et il faut mettre un potar avec curseur sur Vee, et de chaque coté du potar masse et +5V... en pratique, une tension de 0.7V est un bon chiffre pour un affichage correct.

  21. #20
    invite5637435c

    Re : Souci avec l'afficheur LCD (pic 16F877]

    Bonsoir,

    Cherwam07 ayant dit le principal, j'ajouterai juste que:

    Code:
    if (PORTB.F1 == 1)
    {
    blablabla...
    .....
    }
    peut s'ecrire plus simplement:

    Code:
    if (PORTB.F1)
    {
    blablabla
    ......
    }
    Si PORTB.F1 vaut 0 les instructions du if ne sont pas executees, s'il vaut 1 elles le sont donc ecrire if(PORTB.F1==1) est une lourdeur qui pique les yeux quand on sait qu'un PORT ne peut prendre que des valeurs booleennes.
    @+

Discussions similaires

  1. programmer un afficheur lcd avec pic 16f877
    Par invited14768ec dans le forum Électronique
    Réponses: 5
    Dernier message: 08/05/2011, 20h49
  2. Afficheur LCD et Pic 16F877
    Par invite47ad6754 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/06/2010, 22h44
  3. Comment programmer un LCD avec le pic 16F877 ??
    Par invite9cc9ad42 dans le forum Électronique
    Réponses: 20
    Dernier message: 15/02/2010, 21h41
  4. Programation pic 16F877 en C avec Aff LCD
    Par invite9e27548d dans le forum Électronique
    Réponses: 8
    Dernier message: 01/02/2009, 12h45
  5. Driver LCD 2*16 avec PIC 16F877
    Par inviteabd5f26e dans le forum Électronique
    Réponses: 2
    Dernier message: 20/07/2007, 23h54
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...