Vai al contenuto
PLC Forum


Usare Variabili Float Con Il Pic


Shark_86

Messaggi consigliati

Ciao a tutti, ho un problemino che mi affligge da un pò di giorni che non riesco a risolvere... sto facendo un un "aggeggio" che mi consente di misurare l'energia cinetica di un corpo in movimento (mi serve per degli esperimenti all'università :) ) ma, ho problemi per visualizzare l'uscita sulla porta del PIC. Vi spiego meglio. Ho provato a fare il programma in assembler ma siccome che nel programma ci sono parecchi calcoli in virgola mobile (comprese le costanti) sono diventato matto e ho ripiegato sull'ANSI C. Adesso però ho il problema che usando le variabili in floating point (virgola mobile) il numero viene memorizzato in 4 bytes (i float sono da 32 o 64 bit a seconda della precisione) e non so come fare a mettere questo numero sull'uscita per visualizzarlo sui display a 7 segmenti. Su altri forum mi hanno dato dei consigli che però non mi consentono di completare questo programma e mi hanno consigliato di chiedere anche qui (sono nuovo e prima non ero neanche a conoscenza di questo forum). Vi riporto i vari aiuti:

- cercare tra le librerie dell'ANSI C se ci sono delle routine di conversione, ma ho trovato solo le funzioni FloatToStr che converte un numero da float a stringa di 13 caratteri e Dec2Bcd che converte un numero decimale in codice BCD.

- trovare nelle librerie delle funzioni per modificare il numero in float per renderlo più facile da "manipolare", ma, tra le tante, le uniche "utili" che ho trovato sui float sono "frexp", che spezza il float in 2 parti, uno contenente la "frazione normalizzata" (mantissa) e un altro con l'esponente intero in base 2, "ldex" che fa la moltiplicazione x * 2^n (ovvero mi ritrovo un'altra volta con il float :( ) e "modf" che spezza un numero non intero in parte intera e non intera, ma essendo la mantissa del tipo 0,nnnnnnn ci faccio poco.

- fare il programma in assembler e cercare sul sito della microchip delle librerie per fare i calcoli in virgola mobile, ma rimane comunque il problema di visualizzazione (perchè ho visto che anche su queste librerie si spezza il numero in più bytes)

- fare il programma metà in assembler metà in ANSI C (grazie alle apposite istruzioni), ma come ho già ripetuto già una decina di volte il problema della visualizzazione rimane....

Oggi ripensando e ripensando sul problema sono arrivato ad una possibile soluzione ma la mia conoscenza del C (buona ma non eccezionale) non mi permette risolvere la questione. Stavo pensando di usare l'istruzione di conversione da float a stringa di caratteri ma dopo ho il problema di non poter convertire il carattere in codice BCD.... vi prego, aiutatemi! :)

PS: spero di avervi annoiato con questo "poema epico" :)

Link al commento
Condividi su altri siti


ho avuto a che fare con le variabili float tempo fa usando CCS compiler...

ho risolto in questo modo:

int uni,dec,cent;

float value,tmp,read;

tmp=read/20; //Faccio la media su 20 misure del convertitore AD

value=tOut(tmp); //Converto il valore in temperatura (tOut è funzione float

cent=(value/100); //trovo le centinaia

dec=((value-(cent*100))/10); //trovo le decine

uni=((value-((cent*100)+(dec*10)))); //trovo le unità

per trovare i decimali:

float OUTPUT;

int tmp,decimali;

tmp=OUTPUT; //eguaglio una float a una int per avere la parte intera

decimali=(OUTPUT-tmp)*10; //tolgo la parte intera dal float e moltiplico per 10

per visualizzarlo su display 7 segmenti ho utilizzato la porta c (che ha 8 pin quindi 7 seg + 1dot point) e la porta b come enable per i vari display multiplexandoli...

usando un simulatore funziona... non ho avuto modo di realizzare praticamente il circuito ma sono prossimo alla realizzazione...

spero dia verti aiutato :)

Link al commento
Condividi su altri siti

la funzione tOut contiene una formula per convertire il valore dell'AD in temperatura...

che so: se l'AD contiene 1023 allora la tOut rende in uscita 70 .. che sono i gradi in celsius

:)

Link al commento
Condividi su altri siti

Grazie ancora simons, pensavo che tOut serviva, invece a me non serve :D

Io per programmare in C uso MikroC, CSS è meglio? Ho provato ad usare C18 (quello della microchip) ma mi ci trovo male

Per bigjm87: il pic in genere si programma in linguaggio macchina (assembler) ma, certe volte, si ha a che fare con programmi veramente complessi (come nel mio caso che è complesso ma non tanto :D ), per questo hanno fatto dei programmi appositi per programmarlo con linguaggio ad alto livello, per semplificare le cose (per modo di dire perchè certe cose diventano più difficili da gestire). Infatti trovi compilatori ANSI C, Basic, Pascal, ecc...

Modificato: da Shark_86
Link al commento
Condividi su altri siti

io ho sempre usato ccs c compiler e mi ci sono trovato benissimo anche perchè l'assembler non lo conosco.

poi ognuno ha le sue esigenze :P

Link al commento
Condividi su altri siti

A me serve un programma che abbia parecchie librerie per facilitare la gestione dei dispositivi interni (tipo timer, ADC, interrupt, ecc) perchè in assembler sono capace di gestirli, ma in C la cosa diventa complicatuccia :D

Link al commento
Condividi su altri siti

la funzione tOut() esegue una scalatura .

Se per esempio la massima risoluzione e' 10 bit (1023) e la massima temperatura 100 °

si ottiene una proporzione del valore finale in base al valore attuale

E' il metodo piu efficiente per trasformare un valore digitale (numero ) in una unita di grandezza

fisica , temperatura , pressione , peso , banane o cipolle

ciao

walter

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...