[Programmation] PIC 16F877A, LM35, 2Afficheurs7Segments
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

PIC 16F877A, LM35, 2Afficheurs7Segments



  1. #1
    inviteb6932c6b

    PIC 16F877A, LM35, 2Afficheurs7Segments


    ------

    J'ai eu un problème pour faire afficher la température lue sur le LM35 connecté sur un PIC 16F877A et 2afficheurs 7segments. Après simulation, les afficheurs affichent jusqu'à 31° mais pas de suite.
    Voilà mon programme sur microC:

    int N=0,t=0,i=0,j=0;// i=unité,j=Dizaine,t=températur e. char tab[10]={63,6,91,79,102,109,125,7,127 ,111}; void main() { TRISA=0xFF; TRISB=0x00; TRISD=0x00; PORTB=0x00; PORTD=0x00; ADCON1=0x14; for(j=1;j<9;j++) { for(i=0;i<9;i++) { N= ADC_Read(0); t=(500*N)/1023; i=t%10; j=t/10; RD0_bit=0; PORTB=tab[i]; RD1_bit=1; delay_ms(5); RD1_bit=0; PORTB=tab[j]; RD0_bit=1; delay_ms(5); } } }

    Tentative de correction avec introduction des balises code

    Raté une première fois.



    Code:
    int N=0,t=0,i=0,j=0;// i=unité,j=Dizaine,t=température.
    char tab[10]={63,6,91,79,102,109,125,7,127,111};
    
     void main() 
          { 
          TRISA=0xFF; 
          TRISB=0x00; 
          TRISD=0x00; 
          PORTB=0x00; 
          PORTD=0x00; 
          ADCON1=0x14;
    
          for(j=1;j<9;j++) 
                { 
                for(i=0;i<9;i++) 
                      { 
                      N= ADC_Read(0); 
                      t=(500*N)/1023; 
                      i=t%10; 
                      j=t/10; 
                      RD0_bit=0; 
                      PORTB=tab[i]; 
                      RD1_bit=1; 
                      delay_ms(5); 
                      RD1_bit=0; 
                      PORTB=tab[j]; 
                      RD0_bit=1; delay_ms(5); 
                      } 
                } 
          }

    -----
    Dernière modification par gienas ; 20/12/2016 à 15h51. Motif: Conversion programme et balises code

  2. #2
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Bonjour et bienvenue sur le forum,

    il aurait fallu utiliser les balises [CODE] ...txt.... [\CODE à ta disposition dans l'éditeur de réponse.
    Dans la deuxième balise CODE tu ajoutes le crochet fermant (sinon tu n'aurais pas pu lire mon exemple).

    Peux-tu préciser ton problème? De suite après quoi exactement?

  3. #3
    JPL
    Responsable des forums

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Ton code est illisible, il manque les retours à la ligne.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  4. #4
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Code:
    int N=0,t=0,i=0,j=0;// i=unité,j=Dizaine,t=températur e.
     char tab[10]={63,6,91,79,102,109,125,7,127 ,111};
     void main()
     {
     TRISA=0xFF;
     TRISB=0x00;
     TRISD=0x00;
     PORTB=0x00;
     PORTD=0x00;
     ADCON1=0x14;
    
     for(j=1;j<9;j++)
        {
        for(i=0;i<9;i++)
           { N= ADC_Read(0);
              t=(500*N)/1023;
              i=t%10; j=t/10;
              RD0_bit=0;
              PORTB=tab[i];
              RD1_bit=1;
             delay_ms(5); 
             RD1_bit=0;
             PORTB=tab[j];
             RD0_bit=1;
             delay_ms(5);
             }
        }
    }
    


    c'est quand même plus lisible comme ça

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

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Plusieurs problèmes dans ce code.

    1/
    Code:
    t=(500*N)/1023;
    
    il faut diviser par 1024 puisque tu vas de 0 à 1023 soit 1024 valeurs.

    2/ t est un float pas un int (500*1023 > 32767)

    3/ pourquoi mettre des délais dans ton for?

  7. #6
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Pour N tu peux déclarer unsigned int, vu que tu n'auras jamais un négatif.
    De même i et j doivent être des char, puisque ton tableau est déclaré en char pas en int.

    J'aurai écrit:
    Code:
    unsigned int N=0;
    char i, j; // i et j sont initialisés dans les "for" pas utile de les initialiser à 0 ici
    ..... // code ici
    i=(char)(t%10);  // casting en char
    j= (char)(t/10);
    ...

  8. #7
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Par ailleurs, accessoirement, je ne vois pas le but de ton code.

    Tu appelles des éléments fixes de ton tableau... je vois mal comment ça peut être corrélé à des températures.

  9. #8
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Ofet ce code devrait permettre grâce à un montage sur Protéus d'afficher la température de 0 à 99 via 2afficheurs 7segments.
    Avec ce code j'ai pu afficher jusqu'à 31° (en variant bien-sûr sur le LM35 en + ou en - ) à partir de 32° l'afficheur ne fonctionne pas normalement.

  10. #9
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Ok, donc le tableau contient les codes des chiffres.

    Poste ton schéma, le problème doit être lié au fait que tu es en limite de tension sur l'ADC ou autre chose qui sera visible sur ton schéma.

  11. #10
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    merci pour votre aide j'ai finalement trouvé la solution !
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  12. #11
    JPL
    Responsable des forums

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Il est possible de mettre le code dans le message grâce à la balise [code]....[/code]
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  13. #12
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Code:
    float N=0;
     unsigned int unit=0,diz=0,cent=0,rest=0,t=0;
     char tab[10]={63,6,91,79,102,109,125,7,127,111};
    void main() 
    {
     TRISA=0xFF;
     TRISB=0x00;
     TRISD=0x00;
     
     PORTB=0x00;
     PORTD=0x00;
     ADCON1=0x14;
     for(cent=0;cent<9;cent++)
      {
       for(diz=1;diz<9;diz++)
       {
        for(unit=0;unit<9;unit++)
       {
        N= ADC_Read(0);
        t=(500*N)/1023;
        cent=t/100;
        rest=t%100;
        diz=rest/10;
        unit=rest%10;
    
        RD0_bit=0;
        RD1_bit=0;
        PORTB=tab[unit];
        RD2_bit=1;
        delay_ms(5);
      
        RD0_bit=0;
        RD2_bit=0;
        PORTB=tab[diz];
        RD1_bit=1;
        delay_ms(5);
        
         RD1_bit=0;
         RD2_bit=0;
        PORTB=tab[cent];
        RD0_bit=1;
        delay_ms(5);
      }
       }
    }
     }
    Dernière modification par gienas ; 21/12/2016 à 07h07. Motif: Ajouté les balises code OBLIGATOIRES avec les programmes

  14. #13
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Nom : Capture2.PNG
Affichages : 158
Taille : 18,2 Ko

    Voici le montage !

  15. #14
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    J'ai l'impression de perdre mon temps avec toi.
    Tu n'as rien compris aux variables en C...
    Et juste avant on t'a expliqué comment mettre les balises code... et tu persistes à ne pas les utiliser.

    Explique moi l'intérêt de ça:
    Code:
    float N=0;
    quand tu as ça:
    Code:
    N= ADC_Read(0);
    Tu dois comprendre qu'un float c'est 4 bytes là où tu as seulement besoin de 2 bytes, la conversion ADC du PIC ne retourne que des ENTIERS de 0 à 1024 donc aucune utilité de float.

    Pire:
    Code:
    t=(500*N)/1023;
    Là justement pour déclarer t il te faut un float puisque tu as une division qui te donnera une valeur décimale non entière.
    Ce n'est pas parce que le compilateur va procéder à un cast automatique que tu ne dois pas déclarer convenablement tes variables, tu as juste de la chance que le compilateur fasse bien le travail parce que tu n'utilises pas par ailleurs t.

    Pareil pour cent et diz.

    Pour le schéma:

    -> Il n'apparait pas les condensateurs de découplage pour l'alim du µC.
    -> le LM35 s'alimente de 4 à 30V donc ton PIC ne devra pas être alimenté en 3.3V, comme ce n'est pas précisé sur ton schéma autant prévenir, car ton simulateur ne tiendra surement pas compte de ça.
    -> tu dois mettre un condensateur de 100nF pour découpler l'alim du LM35.

    Pour le code:

    quand on fait un thermomètre ou une mesure analogique il est d'usage de ne pas se contenter uniquement d'une mesure et d'avoir la meilleure précision possible.
    Donc il faut utiliser la tension de référence interne, quand il y en a une, ou une tension de référence externe.
    Et faire une mesure moyennée en prenant par exemple 8 échantillons cumulés puis on fait une division par 8, ce qui se fait simplement avec un décalage de 3 vers la droite.

    Utiliser un simulateur ne sert pas à grand chose si tu ne comprends pas ce que tu fais, le résultat quand tu passeras à une réalisation réelle sera que rien ne fonctionnera comme prévu.
    Dernière modification par HULK28 ; 21/12/2016 à 06h24.

  16. #15
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Merci pour tes suggestions HULK28, mais moi je suis venu dans ce forum pour compléter mes manquements en programmation et électronique.
    Je ne connais pas certains termes que tu emploi comme "balise code " si possible : définition +exemple .
    Un éclaircissement sur la déclaration des variables aussi stp.
    Merci

  17. #16
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Citation Envoyé par JPL Voir le message
    Il est possible de mettre le code dans le message grâce à la balise [code]....[/code]
    C'est pourtant clair non?

    Essaye de mettre ton code entre les 2 balises html indiquées c'est tout ce que tu as à faire.

  18. #17
    invite03481543

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Comme tu utilises mikroC tu as dans l'éditeur un point d'interrogation (?) qui est l'aide (help), il te suffit de taper dans "index" le mot "arithmetic type" et tu auras tous les détails pour chaque type.

  19. #18
    inviteb6932c6b

    Re : PIC 16F877A, LM35, 2Afficheurs7Segments

    Ok merci bien

Discussions similaires

  1. flowcode lm35
    Par invite3d253af7 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/04/2013, 11h50
  2. LM35 en température +/-
    Par invitee7724d6b dans le forum Électronique
    Réponses: 7
    Dernier message: 03/05/2010, 15h22
  3. alimentation lm35
    Par nanard dans le forum Électronique
    Réponses: 15
    Dernier message: 07/06/2007, 20h50
  4. exploiter un LM35
    Par invite654a15a7 dans le forum Électronique
    Réponses: 10
    Dernier message: 17/09/2006, 15h32
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...