lcd
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

lcd



  1. #1
    invite7ea43b86

    lcd


    ------

    bsr a tous
    dans le cadre de mon pfe j'ai besoin d'afficher des nombres flotants sur lcd
    la variable content le resultat est de type float (32 bit ) (moi j'ai besoin d'afficher de 0,0 a 99,9 ) et le lcd n'affiche que des caracter (8 bits)
    donc est ce qu'il existe une astuce ou une fonction pour la convertion ..
    ps : j'utilise le mico c pro for pic
    et mrc dav

    -----

  2. #2
    Picooz

    Re : lcd

    Le mieux serait de se passer de la float et de travailler avec un entier...
    Sinon tu peux convertir ta float en chaîne de caractères avec floattostr (fonction incluse dans la bibliothèque conversion dans MikroC).
    Ou de faire toi même ta fonction pour passer un float en ASCII dans une chaîne.
    Dernière modification par Picooz ; 17/04/2015 à 18h34.

  3. #3
    invite7ea43b86

    Re : lcd

    mais on peu pas manipuler les nombres a virgule avec un entier nn !!!

  4. #4
    Picooz

    Re : lcd

    Oui... c'est la définition d'un entier ...

    Je sais pas d'où sort ta valeur, mais exemple, si tu multiplie par 10 ta valeur.
    Tu es donc entre 0 et 999. Tu travailles donc avec un entier... avec la même précision ...
    Des calculs sur un float demandent beaucoup de ressources, de mémoire vive, et de mémoire programme...
    Je pense que dans ton cas, tu peux éviter cela très facilement

    Tu te débrouilles ensuite pour ajouter la virgule.

    Dans tout les cas, dans ton cas, il faudra la convertir en chaîne.
    Dernière modification par Picooz ; 17/04/2015 à 21h11.

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

    Re : lcd

    mrc bcp pour ta rep
    mai je croi que j'ai deja essaiyé sa et sa marche pas
    bn voila mon code :

    Code:
     sbit LCD_RS at RD2_bit;
    sbit LCD_EN at RD3_bit;
    sbit LCD_D4 at RD4_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D7 at RD7_bit;
    
    sbit LCD_RS_Direction at TRISD2_bit;
    sbit LCD_EN_Direction at TRISD3_bit;
    sbit LCD_D4_Direction at TRISD4_bit;
    sbit LCD_D5_Direction at TRISd5_bit;
    sbit LCD_D6_Direction at TRISd6_bit;
    sbit LCD_D7_Direction at TRISd7_bit;
    
    float a;
    unsigned int  cpt1, cpt2;
    char i,v1,v2,v3,v4;
    
    void interrupt1()
     {
      if (intcon.T0IF) {
                         {  cpt1++;
                            TMR0 = 0;
                            if (cpt1==15)  { delay_ms(1000); cpt1=0;}
                           INTCON.T0IF = 0;
                           }
    
                        }
    
      else if (intcon.B1==1)
     {
    
                           {
                             cpt2++;
                             if (cpt1=15){delay_ms(1000);cpt2=0; }
                             intcon.B1=0;
                               }
    
       }
         }
    
    void main()
    {
     a=0.0;     //le a est  un float
     cpt1=0;    // char
     cpt2=0;
     i=46;    //char en ascii
     v1=0;
     v1=0  ;
     v2=0 ;
     v3=0;
     v4=0;
     TRISB=0xFF;
     INTCON=0b10011000;
     OPTION_reg=0b11000111;
    
     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1,1,"bon jour" );
     delay_ms(500);
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,1,"chargement"  );
    
     Lcd_Out(2,1,"en cours... " );
     delay_ms(200);
    
     for(;;)
    
    
    
    
      
     if (cpt1==15)
     {
      a=((cpt2*2*3.14*3)/(400));
      v1=a/10;
      v2=a-(v1*10);
      v3=(a*10)%10;
      v4=(a*100)%10;*/
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Chr(2, 3,'v1');
      Lcd_Chr(2, 4,'v2');
      Lcd_Chr(2, 5,'i');
      Lcd_Chr(2, 6,'v3');
      Lcd_Chr(2, 5,'v4');
    
      
    
    
     }
    
    }
    et il m'affiche une erreur (too many chars)
    ou est le problem !!! je ne c po
    Dernière modification par Antoane ; 17/04/2015 à 21h51. Motif: Ajout balises [code]

  7. #6
    Picooz

    Re : lcd

    Il y a un énorme problème au niveau des calculs et des types de variables.
    Tu fais des calculs sur des char avec des float ???!
    Tu fais ça pour ne pas avoir à faire de conversions de types ?

    Peux-tu expliquer quel est le but de cet algorithme car je ne le comprend pas. (et je n'ai pas envie de prendre du temps pour le comprendre alors que tu peux donner plus d'informations).

  8. #7
    Picooz

    Re : lcd

    Pourquoi tu utilises interrupt1() ? Il n'existe qu'une seule entrée d'interruption et sur MikroC, il me semble qu'il ne peut s'agir que de la fonction interrupt().
    Quel PIC utilises-tu ? C'est un PIC16F84 ? INTCON.B1 c'est le flag de RB0 ? Continue d'utiliser les "vrais noms", c'est plus simple, vu que MikroC le permet.
    Dernière modification par Picooz ; 17/04/2015 à 22h54.

  9. #8
    invite7ea43b86

    Re : lcd

    bn le but de cet algorithme : c'est un algorithme d'un anemometre a opto couple (sur un disque avec 4 trou )
    j'utilise l'iterruption de timer0 pour compter le temps(je fai mes calcul sur 1 seconde) et l'interruption de rb0 pour compter les impulsion de l'opto coupl (4 impulsion ==1 tour) et apres je fai le calcul : vitesse du vent =nbr de tour*2*pi*r/t
    au debut j'ai essyé avec void interrupt 1 et 2 mai mnt j'utilise un seul void interr (j'ai oublié d'effacé le 1)
    fais des calculs sur des char avec des float pour le problem de la convertion et ça marche bien avec la prtie entier mai la partie fractionnaire nn
    pour le type de pic j'utilise le pic 16f877

  10. #9
    Picooz

    Re : lcd

    D'accord, je comprends mieux.
    Par rapport à ce que je t'ai marqué post #4
    Ici tu as : a=((cpt2*2*3.14*3)/(400)); avec donc un float et un char
    Je suppose donc que ta variable cpt2 va varier entre 0 et 127 maximum ?


    Tu peux par exemple faire ce calcul la : a = (cpt2*2*314*3)/4 avec a un int non signé.


    En exemple, si le pic est amméné à faire ce calcul : (127*2*3.14*3)/400 = 5.9817(dans ta version)
    Il fera (127*2*314*3)/4 = 59817
    Tu ne perds donc pas en précision. il suffit ensuite de convertir comme il faut l'entier non signé, et ajouter "manuellement" la virgule ( et les zéros si besoin).


    Ceci n'est qu'un exemple, il y a sûrement être moyen de faire mieux.


    Sinon, tu peux rester avec ta float, et utiliser la fonction que j'ai mentionné plus haut...

    Par contre, la fonction lcd_chr ne va sûrement pas marcher comme ça.
    Il faut que tu retires les '' pour passer le contenu de la variable à la fonction.

    http://www.mikroe.com/download/eng/d...cd_library.htm

    Je n'utilise pas cette fonction mais plutôt lcd_out(char row, char column, char *text); qui peut t'afficher une chaîne.
    Dernière modification par Picooz ; 18/04/2015 à 13h47.

  11. #10
    paulfjujo

    Re : lcd

    bonjour,


    Code:
           if (cpt1=15){delay_ms(1000);cpt2=0; }
    mettre == pour un test !


    Code:
      
    
    unsigned int k;
    
    
     while(1)
    {
     if (cpt1==15)
     {
      a=(float) cpt2 *0.04712385 ;  //  (2*3.14*3)/(400));
      k=(unsigned int )a;
      v1=k /10;
      v2=k-(v1*10);
      v3=(k*10)%10;
      v4=(k*100)%10;*/
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Chr(2, 3,0x30+v1);        // transforme valeur en ascii de '0' à '9'
      Lcd_Chr(2, 4,0x30+v2);       // 0x30 ='0'
      Lcd_Chr(2, 5,'.');
      Lcd_Chr(2, 6,'0'+v3);           // ou directement '0' + valeur
      Lcd_Chr(2, 7,'0'+v4);     //<- 7 em ?
    
      }
    }

  12. #11
    invite7ea43b86

    Re : lcd

    mrc bcp
    grace a vous je pense que j'ai reglé mon problem : )

  13. #12
    invite7ea43b86

    Re : lcd

    une derniere chose c'est quoi le role de :
    k=(unsigned int )a; est ce qu'elle transforme le float en int ?? si oui
    si on a par ex :
    a=45.12 est ce que k vaut 4512 ou 45???

  14. #13
    paulfjujo

    Re : lcd

    on perd evidement les decimales ..
    avec a flotant et k integer
    si a=45.12 =>le cast donne k=(unsigned int) a = 45


    sinon il y a toujour moyens de multiplier a *10 => 451.2 => k=415
    et de positionner la virgule au bon endroit sur l'affichage
    pour avoir 45.1

    ou multiplier a*100 => 4512 => k=4512
    .. positioner la virgule ....

    a condition que a*100 reste < 65536 ( valeur maxi d'un entier non signé 16 bits)

    .. on peut aussi utiliser un entier long ...pour passer au dessus de cette limite.

    C'est de la cuisine informatatique .. tu as les ingredients
    fais ta sauce..

  15. #14
    invite7ea43b86

    Re : lcd

    Ok merci /: )

Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...