- Messaggi: 32
- Ringraziamenti ricevuti 3
Conversione valori in C. Arrotondamento a n decimali.
10 Anni 8 Mesi fa #1
da pad
Conversione valori in C. Arrotondamento a n decimali. è stato creato da pad
E' da poco tempo, forse troppo poco che scrivo codice in C per programmare i PIC. Ultimamente, mi sto dedicando all'uso di un ricevitore FM stereo TEA5767 NXP ex Philips. Il progetto che sto sviluppando, tramite un P18f2550 consente di inserire la frequenza del ricevitore che deve essere utilizzata per configurare il PLL dell'integrato citato per mezzo di una tastiera. Premetto di aver verificato il funzionamento di tutta la routine che gestisce il protocollo I2C per la configurazione del TEA e tutto funziona bene, anzi, benissimo. Il mio problema è invece far scrivere il valore della frequenza sul display LCD. Infatti, la frequenza della stazione la scrivo in una variabile di tipo float che per essere inviata all'LCD deve essere trasformata in una variabile di tipo char. Non riesco ad effettuare tale operazione ovvero, a ridurre il valore della variabile float effettuando un arrotondamento e troncandolo a 2 decimali.
La situazione è la seguente:
float station = 83.7; // valore della stazione da ricevere in Mhz
quando recupero il valore di station, e lo converto in carattere, per il tramite della funzione propria del compilatore che uso (MiKroC), mi ritorna il valore 83.69998 anzichè il valore atteso, arrotondato a 2 decimali.
Come mi consigliate di approcciare il problema? ovvero, come posso effettuare un arrotondamento a 2 decimali?
Grazie a tutti ed a chiunque voglia favorirmi un consiglio.
La situazione è la seguente:
float station = 83.7; // valore della stazione da ricevere in Mhz
quando recupero il valore di station, e lo converto in carattere, per il tramite della funzione propria del compilatore che uso (MiKroC), mi ritorna il valore 83.69998 anzichè il valore atteso, arrotondato a 2 decimali.
Come mi consigliate di approcciare il problema? ovvero, come posso effettuare un arrotondamento a 2 decimali?
Grazie a tutti ed a chiunque voglia favorirmi un consiglio.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- pad
- Autore della discussione
- Junior Member
Riduci
Di più
10 Anni 8 Mesi fa #2
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Conversione valori in C. Arrotondamento a n decimali.
Ciao pad e benvenuto tra noi...
non conosco il mikroC, quindi non ci giro intorno a darti consigli presuntuosi o inutili...
però lancio un appello ai ragazzi del forum: chi è esperto con il mikroC può gentilmente dare una mano d'aiuto per il new entry?
Marcello
non conosco il mikroC, quindi non ci giro intorno a darti consigli presuntuosi o inutili...
però lancio un appello ai ragazzi del forum: chi è esperto con il mikroC può gentilmente dare una mano d'aiuto per il new entry?
Marcello
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
10 Anni 8 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Conversione valori in C. Arrotondamento a n decimali.
Ciao PAd,
benvenuto del Forum.
Se riesci gia´ ad ottenere una stringa 83.69998 per troncare basta posizionare il carattere di fine stringa dopo il 9, ovvero per ottenere 83.69 scrivi \0 al quinto carattere della tua stringa.
Poi invia la stringa per la visualizzazione all´LCD.
Saluti,
Mauro
benvenuto del Forum.
Se riesci gia´ ad ottenere una stringa 83.69998 per troncare basta posizionare il carattere di fine stringa dopo il 9, ovvero per ottenere 83.69 scrivi \0 al quinto carattere della tua stringa.
Poi invia la stringa per la visualizzazione all´LCD.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
10 Anni 8 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Conversione valori in C. Arrotondamento a n decimali.
In aggiunta, visto che la frequenza potrebbe anche essere con valori superiori a 99 potresti cercare il punto nella stringa e spostarti di 2 (o n decimali)per posizionare il carattere di fine stringa.
Saluti,
Mauro
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
10 Anni 8 Mesi fa #5
da pad
Risposta da pad al topic Conversione valori in C. Arrotondamento a n decimali.
Ciao Mauro, ciao a tutti, la soluzione che proponi ovviamente soddisfa parzialmente l'esigenza ovvero, un sintonizzatore FM procede a passi di 1 Khz e ovviamente, quello che deve apparire sul display non può essere una frazione di Khz. Le stazioni radio procedono con incrementi unitari ed infatti se vedi qualsiasi sintonizzatore, sul display la frequenza è espressa ad esempio in 89,7mhz; 89,8mhz; 89,9mhz ecc. ovvero, superati i 99,9mhz diventa 100,0mhz (3 unità e 1 decimale). Il problema è che il valore deve essere arrotondato assolutamente ad uno o due decimali dopo la virgola e non può essere impreciso perchè il valore inserito viene processato dal seguente codice:
frq = station * 1000000; // Frequenza della stazione radio in Hz (station*1000000)
frqB = (4*(frq+225000)/32768); // Calcola la Frequenza del PLL
frqH = ( frqB >> 8 ) ; // primo byte per I2C
frqL = frqB & 0XFF ; // secondo byte per I2C
I due risultati frqH e frqL sono inviati direttamente sul bus I2C del TEA5767
Il valore station è un float ed è proprio lì che devo andare a mettere le mani. Credo che la soluzione più elegante, ma più dispendiosa per la mente è quella di utilizzare un tipo di variabile char e poi, trattarla individualmente per farla divenire un valore utile per la nuova variabile station.
Altro al momento non mi viene in testa. Se fosse ASP, ASPX o PHP non avrei problemi, il livello del linguaggio me lo consentirebbe ma in C mi trovo proprio male per adesso.
Se ritieni o se ritenete di offrirmi un'altra soluzione o una vostra idea, sono tutto orecchi e pronto a provare.
Ovviamente, sono tentato anche di usare le tue librerie ed il C18 piuttosto che MiKroC ma non credo che cambierebbe molto.
Grazie.
frq = station * 1000000; // Frequenza della stazione radio in Hz (station*1000000)
frqB = (4*(frq+225000)/32768); // Calcola la Frequenza del PLL
frqH = ( frqB >> 8 ) ; // primo byte per I2C
frqL = frqB & 0XFF ; // secondo byte per I2C
I due risultati frqH e frqL sono inviati direttamente sul bus I2C del TEA5767
Il valore station è un float ed è proprio lì che devo andare a mettere le mani. Credo che la soluzione più elegante, ma più dispendiosa per la mente è quella di utilizzare un tipo di variabile char e poi, trattarla individualmente per farla divenire un valore utile per la nuova variabile station.
Altro al momento non mi viene in testa. Se fosse ASP, ASPX o PHP non avrei problemi, il livello del linguaggio me lo consentirebbe ma in C mi trovo proprio male per adesso.
Se ritieni o se ritenete di offrirmi un'altra soluzione o una vostra idea, sono tutto orecchi e pronto a provare.
Ovviamente, sono tentato anche di usare le tue librerie ed il C18 piuttosto che MiKroC ma non credo che cambierebbe molto.
Grazie.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- pad
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 32
- Ringraziamenti ricevuti 3
Moderatori: Mauro Laurenti, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.