- Messaggi: 363
- Ringraziamenti ricevuti 39
Subroutine per la stampa di un floating point
- firstcolle
-
- Platino Utente
-
Less
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
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
-
Less
Di più
- Messaggi: 130
- Ringraziamenti ricevuti 11
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
-
Less
Di più
- Messaggi: 186
- Ringraziamenti ricevuti 3
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.
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.
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
Dov'e' la nuova funzione?
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- paoletto
-
Autore della discussione
- Elit Utente
-
Less
Di più
- Messaggi: 186
- Ringraziamenti ricevuti 3
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
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
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 Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Gestione di una tastiera a matrice
- da FABRIZIO
-
- STM32F103C8T6 PWM
- da elpablito
-
- Caricabatteria per batteria al litio 12V
- da cirifischio
-
- Lista Nuovi articoli LaurTec
- da Mauro Laurenti
