Progetti

   

Sponsor

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: Subroutine per la stampa di un floating point

Subroutine per la stampa di un floating point 4 Anni 1 Mese fa #16

  • firstcolle
  • Avatar di firstcolle
  • Offline
  • Platinum Boarder
  • Messaggi: 324
  • Ringraziamenti ricevuti 36
  • Karma: 3
ahhhhhhhh perchè è inclusa nelle stdlib che di solito non uso.
ho provato la funzione ed effettivamente funziona fino ad una risoluzione di 6 decimali.

però con un rapito confronto rispetto alla mia routine occupa 24 byte di data memory e 540 byte in più di program memory
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Subroutine per la stampa di un floating point 4 Anni 1 Mese fa #17

  • Claudio_F
  • Avatar di Claudio_F
  • Offline
  • Expert Boarder
  • Messaggi: 130
  • Ringraziamenti ricevuti 11
  • Karma: 0
non so se le stdlib vengono incluse automaticamente, io personalmente me le sono scordate, ma viene compilato ed eseguito ugualmente, forse è un caso.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Subroutine per la stampa di un floating point 4 Anni 1 Mese fa #18

  • paoletto
  • Avatar di paoletto
  • Offline
  • Gold Boarder
  • Messaggi: 186
  • Ringraziamenti ricevuti 3
  • Karma: 2
Problema risolto,

ho fatto semplicemente in modo di organizzare i token della prima riga (16 caratteri) in un unica stringa e quindi di plottarla tutta ad ogni ciclo, ripulendo il buffer di volta in volta.

Paolo.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Subroutine per la stampa di un floating point 4 Anni 1 Mese fa #19

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4656
  • Ringraziamenti ricevuti 555
  • Karma: 52
Bene...

Dov'e' la nuova funzione? :)

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Subroutine per la stampa di un floating point 4 Anni 1 Mese fa #20

  • paoletto
  • Avatar di paoletto
  • Offline
  • Gold Boarder
  • Messaggi: 186
  • Ringraziamenti ricevuti 3
  • Karma: 2
Ciao :)
la funzione è un qualcosa del genere
void PrintSting(float value)
{
 
char measure_float[9]={ }; //contiene il valore numerico da visualizzare in floating point convertito in stringa
const char s1[20] = "f0: "; //grandezza misurata, frequenza fondamentale del segnale in questo particolare esempio
const  char s3[] = " Hz"; // unità di misura in Hz
char TempString[20] = ""; //stringa temporanea(16 o 20 caratteri, dipende dal display usato)
char EndString[20] = ""; //stringa finale da plottare
 
 
strcpy(TempString,s1);
FloatToString(measure_float,value,1);
strcat(TempString,measure_float);
memset(measure_float, ' ', strlen(measure_float));
strcat(TempString,s3);
strcpy(EndString,TempString);
write_string_LCD(EndString);
memset(EndString, ' ', strlen(EndString));	
home_LCD();	
}
 
 
 
void FloatToString(char *str, float f, char size)
{
 
	char pos;  // position in string
 
    char len;  // length of decimal part of result
 
    char* curr;  // temp holder for next digit
 
    int value;  // decimal digit(s) to convert
 
    pos = 0;  // initialize pos, just to be sure
 
    value = (int)f;  // truncate the floating point number
    ltoa(value,str);  // this is kinda dangerous depending on the length of str
    // now str array has the digits before the decimal
 
    if (f < 0 )  // handle negative numbers
    {
        f *= -1;
        value *= -1;
    }
 
     len = strlen(str);  // find out how big the integer part was
     pos = len;  // position the pointer to the end of the integer part
     str[pos++] = ',';  // add decimal point to string
 
    while(pos < (size + len + 1) )  // process remaining digits
    {
        f = f - (float)value;  // hack off the whole part of the number
        f *= 10;  // move next digit over
        value = (int)f;  // get next digit
        ltoa(value, curr); // convert digit to string
        str[pos++] = *curr; // add digit to result string and increment pointer
    }
 }


La funzione FloatToString non è mia, ma vedo che essenzialmente fa uso dello stesso algoritmo che usavo cioè plottare la parte intera, la virgola e poi le cifre decimali una alla volta moltiplicando di volta in volta per 10.
Comunque funziona bene e vale la pena usarla.
La funzione PrintSting invece è mia. E' davvero semplice, non fa altro che concatenare insieme i vari token da plottare e poi pulire le stringhe measure_float ed EndString scrivendo in essa semplicemente spazi bianchi, in questo modo è come se venisse ripulito il display. Non è certamente però una soluzione ottimale in quanto non libero spazio ma semplicemente lo sovrascrivo con caratteri invisibili :lol:
Diciamo che serve allo scopo ;)
L'esempio è stato fatto per il C2000, interessante è la variante veloce della funzione memset, memset_fast: è scritta addirittura in assembly ed è velocissima per inizializzare stringhe piuttosto che usare cicli ordinari.

Ciao
Paolo
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Moderatori: Mauro Laurenti, StefA
Powered by Forum Kunena
   
© LaurTec 2006-2015