Newsgroup: it.hobby.elettronica.digitale
Titolo: float su Lcd

Qualcuno di voi possiede una routine che mi consenta di visualizzare un
reale su display LCD (2*16)?
Al limite anche un consiglio su come fare. Ciao e grazie.
p.s. uso il compilatore mplab c18 ( molto poco standard)

 Qualcuno ...
Se fai crosspost, che è già poco bello, dichiaralo nel newsgroup e nel
subject.
Ciao.
lucky
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

"Alessandro Brasili"  ha scritto nel messaggio

MPLAB C18 č ANSI standard, semmai quello che non č standard sono gli 
inevitabili adattamenti per via della struttura delle MCU.
La struttura dei numeri float sul C18 č quella definita dallo standard 
IEEE-754 con un paio di piccoli adattamenti per ottimizzarne l'uso sui PIC.
Nel pdf delle librerie trovi la descrizione completa del formato float e 
come fare per convertirle in un numero decimale facilmente rappresentabile 
su di un display LCD tramite le normali funzioni di libreria tipo ltoa() o 
ultoa().
Piů o meno la procedura č la seguente, prima converti in decimale intero il 
numero float usando la procedura descritta nel manuale, lo converti in 
stringa con l'opportuna funzione (ltoa() se signed ultoa() se unsigned), 
aggiungi la virgola nella corretta posizione e visualizzi la stringa cosě 
ottenuta sul display.
Bye 

 ha scritto nel messaggio 
news:bMsad.19619$b5.9...@news3.tin.it...


 p.s. uso il compilatore mplab c18 ( molto poco standard)
Non conosco mplab c18, ma anche lui dovrebbe avere una funzione tipo ftoa()
che restituisce la mantissa in ascii e l'esponente come int. Poi ci fai
quello che vuoi, ad esempio potresti visualizzarlo come i.dddddE-ee oppure
se, il range è sicuramente limitato, come iiii.ddddd.


 se, il range č sicuramente limitato, come iiii.ddddd.
      Non cěč una routine che mi converte un float in ascii, c'č l'inversa 
atof()... come faccio?


 
Ma il numero float che devi visualizzare č rappresentato da una 
variabile di tipo float, oppure c'č qualcosa di piů macchinoso (io per 
esempio, non potendo lavorare in float, trattavo i numeri decimali in 
modo approssimato)?

 approssimato)?
..devo poter visualizzare numeri tipo 1.234 -0.234 sul display lcd..che 
intendi per modo approssimato? 

 ha scritto nel messaggio
news:8Ixad.111409$35.55...@news4.tin.it...

Spesso è più conveniente maneggiare gli interi piuttosto che direttamente
i float. Mi sa che il tuo caso rientra in questi.
Immagino che il tuo numero decimale derivi da una conversione analogico-
digitale più eventuale calcolo.
Se sai che il numero delle cifre decimale è 3, come nel tuo esempio,
potresti gestire quel numero moltiplicato per 1000, quindi un intero!
L'artimetica rimane sempre valida (moltiplicazioni, addizioni, ecc.)
... devi solo ricordarti, alla fine quando mostri il risultato su
display, di dividere per mille per avere la parte intera e prendere il
resto di questa divisione per la parte decimale.
L'unico problema è che i calcoli intermedi potrebbero dare come risultato
un intero troppo grande, quindi potresti avere un overflow. Ma stando
attenti si può evitare anche questo.

 
Con approssimato intendo il fatto che non avendo a disposizione le 
librerie per la gestione dei floating-point, gestivo i valori tramite 
variabili (short o long) contenenti il valore reale moltiplicato per 
10/100/1000 a seconda della precisione di cui necessitavo.
I display solitamente erano dei banali 7-segmenti a più cifre, quindi mi 
occupavo della visualizzazione ricavando le unità/decine/centinaia e i 
decimali dal valore moltiplicato per 10/100/1000 attraverso una semplice 
funzione (se è questa la parte che ti interessa posso spedirtela).
Il punto decimale solitamente è previsto della gestione hardware dei 7 
segmenti, mentre la decodifica hardware viene effettuata tramite un BDC 
o un shift-register.

Gironzolando sul forum della Microchip ho trovato questa routine per MPLAB 
C18 che risolve il tuo problema :
Bye
******************
/****************************************************************
***
 *  FUNCTION: ftoa
 *  AUTHOR   =  TRAMPAS STERN
 *  FILE   = strio.c
 *  DATE  =   2/6/2003  4:27:14 PM
 *
 *  PARAMETERS: long,*str, int count
 *
 *  DESCRIPTION: Convets an float to string
 *   format 'f', 'E', or 'e'
 *
*****************************************************************
**/
int ftoa (float x, CHAR *str, char  prec, char format)
{
 int ie, i, k, ndig, fstyle;
 double y;
 CHAR *start;
 start=str;
 //based on percission set number digits
 ndig=prec+1;
 if (prec<0)
  ndig=7;
 if (prec>22)
  ndig=23;
 fstyle = 0; //exponent 'e'
 if  (format == 'f' || format == 'F')
  fstyle = 1; //normal 'f'
 if (format=='g' || format=='G')
  fstyle=2;
 ie = 0;
 /* if x negative, write minus and reverse */
 if ( x < 0)
 {
   *str++ = '-';
   x = -x;
 }
 //if (x<0.0) then increment by 10 till betwen 1.0 and 10.0
 if (x!=0.0)
 {
  while (x < 1.0)
  {
    x =x* 10.0;
    ie--;
  }
 }
    //if x>10 then let's shift it down
 while (x >= 10.0)
 {
  x = x*(1.0/10.0);
  ie++;
 }
 if (ABS(ie)>MAX_MANTISA)
 {
  if (fstyle==1)
  {
   fstyle=0;
   format='e';
   //ie=2;
  }
 }
 /* in f format, number of digits is related to size */
 if (fstyle)
  ndig =ndig + ie;
 if(prec==0 && ie>ndig && fstyle)
 {
  ndig=ie;
 }
 /* round. x is between 1 and 10 and ndig will be printed to
    right of decimal point so rounding is ... */
 y=1;
 for (i = 1; i < ndig; i++) //find lest significant digit
   y = y *(1.0/10.0);   //multiply by 1/10 is faster than
divides
 x = x+ y *(1.0/2.0);   //add rounding
 /* repair rounding disasters */
 if (x >= 10.0)
 {
  x = 1.0;
  ie++;
  ndig++;
 }
 //check and see if the number is less than 1.0
 if (fstyle && ie<0)
 {
  *str++ = '0';
  if (prec!=0)
   *str++ = '.';
  if (ndig < 0)
   ie = ie-ndig; /* limit zeros if underflow */
  for (i = -1; i > ie; i--)
   *str++ = '0';
 }
 //for each digit
 for (i=0; i < ndig; i++)
 {
  float b;
  k = x;
//k = most significant digit
  *str++ = k + '0';   //output the char
representation
  if (((!fstyle && i==0) || (fstyle && i==ie)) && prec!=0)
   *str++ = '.';   //output a
decimal point
  b=(float)k;
  //multiply by 10 before subtraction to remove
  //errors from limited number of bits in float.
  b=b*10.0;
  x=x*10.0;
  x =x - b;    //subtract k from x
  //b=x+b;
  //x =x* 10.0;
//get next digit
 }
/* now, in estyle,  put out exponent if not zero */
 if (!fstyle && ie != 0)
 {
  *str++ = format;
  if (ie < 0)  //if number has negative exponent
  {
   ie = -ie;
   *str++ = '-';
  }
  //now we need to convert the exponent to string
  for (k=1000; k>ie; k=k/10);  //find the decade of
exponent
  for (; k > 0; k=k/10)
  {
   char t;
   t=DIV(ie,k);
   *str++ = t + '0';
   ie = ie -(t*k);
  }
 }
 *str++ = '\0';
 return (str-start); //return string length
}

 ha scritto nel messaggio 
news:DTBad.22561$b5.11...@news3.tin.it...
