Subroutine per la stampa di un floating point

  • firstcolle
  • Platino Utente
  • Platino Utente
Di più
9 Anni 4 Mesi fa #16 da firstcolle
Risposta da firstcolle al topic Subroutine per la stampa di un floating point
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Claudio_F
  • Premium Utente
  • Premium Utente
Di più
9 Anni 4 Mesi fa #17 da Claudio_F
Risposta da Claudio_F al topic Subroutine per la stampa di un floating point
non so se le stdlib vengono incluse automaticamente, io personalmente me le sono scordate, ma viene compilato ed eseguito ugualmente, forse è un caso.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • paoletto
  • Autore della discussione
  • Elit Utente
  • Elit Utente
Di più
9 Anni 4 Mesi fa #18 da paoletto
Risposta da paoletto al topic Subroutine per la stampa di un floating point
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.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
9 Anni 3 Mesi fa #19 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Subroutine per la stampa di un floating point
Bene...

Dov'e' la nuova funzione? :)

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • paoletto
  • Autore della discussione
  • Elit Utente
  • Elit Utente
Di più
9 Anni 3 Mesi fa #20 da paoletto
Risposta da paoletto al topic Subroutine per la stampa di un floating point
Ciao :)
la funzione è un qualcosa del genere
Code:
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.