Shark_86 Inserito: 5 luglio 2006 Segnala Share Inserito: 5 luglio 2006 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 More sharing options...
Simons Inserita: 5 luglio 2006 Segnala Share Inserita: 5 luglio 2006 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 10per 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 More sharing options...
Shark_86 Inserita: 6 luglio 2006 Autore Segnala Share Inserita: 6 luglio 2006 Si mi hai aiutato moltissimo, grazie! Solo che non ho capito cosa fa la funzione tOut, me lo puoi spiegare meglio? Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 6 luglio 2006 Segnala Share Inserita: 6 luglio 2006 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 More sharing options...
bigjm87 Inserita: 6 luglio 2006 Segnala Share Inserita: 6 luglio 2006 ma il pic non si programmava mica col linguaggio macchina questo m sembra piu c Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 6 luglio 2006 Segnala Share Inserita: 6 luglio 2006 se leggi in cima ci ho scritto che uso CCS C compiler... Link al commento Condividi su altri siti More sharing options...
Shark_86 Inserita: 6 luglio 2006 Autore Segnala Share Inserita: 6 luglio 2006 (modificato) Grazie ancora simons, pensavo che tOut serviva, invece a me non serve Io per programmare in C uso MikroC, CSS è meglio? Ho provato ad usare C18 (quello della microchip) ma mi ci trovo malePer 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 ), 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: 6 luglio 2006 da Shark_86 Link al commento Condividi su altri siti More sharing options...
Simons Inserita: 8 luglio 2006 Segnala Share Inserita: 8 luglio 2006 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 Link al commento Condividi su altri siti More sharing options...
Shark_86 Inserita: 8 luglio 2006 Autore Segnala Share Inserita: 8 luglio 2006 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 Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 8 luglio 2006 Segnala Share Inserita: 8 luglio 2006 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 grandezzafisica , temperatura , pressione , peso , banane o cipolle ciao walter Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora