Innanzitutto salve a tutti, mi sono appena iscritto, e sono un giovane studente di ing. elettronica, ma veniamo subito al dunque: è da un po' di giorni che sto lavorando su un progettino che usa un microcontrollore PIC 16F767 ma ho incontrato un problema che "non mi fa dormire la notte"!
Come faccio a visualizzare sull'uscita ad 8 bit un numero binario espresso in floating point a 32 bit? Mi spiego meglio. Il programma è fatto in ANSI C per PIC perché ho provato a farlo in assembler ma al momento di scrivere il listato che fa una divisione tra numeri decimali non interi sono diventato matto, così ho ripiegato sul C che è nettamente più facile. Però adesso mi ritrovo con una cifra a 32 bit spezzata in 4 bytes da visualizzare sulla porta B. Qualcuno sa come posso fare, o se c'è un algoritmo che risolve questo problema? (io devo visualizzare solo 1 cifra prima della virgola e 2 dopo la virgola su 3 display a 7 segmenti)
PIC e floating point
Moderatore: Paolino
12 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
0
voti
Se ho ben capito, la soluzione non è proprio possibile per come l’hai proposta.
Allora devi individuare 4 locazioni di memoria, dove vai a collocare le quattro cifre e poi le leggi una alla volta.
Se poi vuoi leggere contemporaneamente tutte le cifre devi prevedere un multiplixer.
Però, mi pare che il 16F767 ha quattro porte A, B, C, D, usale per le quattro cifre.
Allora devi individuare 4 locazioni di memoria, dove vai a collocare le quattro cifre e poi le leggi una alla volta.
Se poi vuoi leggere contemporaneamente tutte le cifre devi prevedere un multiplixer.
Però, mi pare che il 16F767 ha quattro porte A, B, C, D, usale per le quattro cifre.
josel
0
voti
forse non mi sono spiegato bene, i 4 bytes, non sono 4 cifre ma una sola espressa in floating point (del tipo 1,500000E-10, per esempio) per cui di questi 32 bit, alcuni saranno riservati al numero vero e proprio, altri all'esponente e altri ai segni (numero ed esponente). Io devo capire come faccio a fargli visualizzare su 3 display a 7 segmenti (pilotati uno alla volta) la prima cifra prima della virgola e 2 dopo la virgola, visto che il PIC 16F767 è ad 8 bit.
Spero di essere stato più chiaro questa volta...
Spero di essere stato più chiaro questa volta...
0
voti
In Pascal e in mikroPascal esistono le procedure di conversione da tipo a tipo.
In mikroPascal ci sono le conversion library che trasformano interi, word, byte, float in stringa e le BCD/decimal conversion.che trasformano i BCD in decimali. Ci saranno altre routine di conversione.
Non conosco ANSI C, però penso che, come il mikroPascal, ti genera l’asm e l’hex da un codice C.
Poiché il C, in quanto linguaggio industriale, è abbastanza capace, dovrà anche avere le librerie di conversione.
In mikroPascal ci sono le conversion library che trasformano interi, word, byte, float in stringa e le BCD/decimal conversion.che trasformano i BCD in decimali. Ci saranno altre routine di conversione.
Non conosco ANSI C, però penso che, come il mikroPascal, ti genera l’asm e l’hex da un codice C.
Poiché il C, in quanto linguaggio industriale, è abbastanza capace, dovrà anche avere le librerie di conversione.
josel
0
voti
Ti riporto quello che ho letto sul manuale del C++ e dello standard ANSI,
In ANSI C e C++ esiste una funzione frexp(double num, int*exp) che scompone num in una mantissa (0.5<= mantissa <1) e in un esponente intero tale che num=mantissa*2^exp.
La funzione restituisce la mantissa, mentre l’esponente e assegnato alla variabile a cui punta exp.
Non so se ti può essere utile avere il valore della mantissa in valore decimale come 0,nnnn, ma sicuramente ci saranno altre funzione che rendono intero la parte dopo la virgola, potresti usare il Dec2Bcd16.
Buon lavoro.
In ANSI C e C++ esiste una funzione frexp(double num, int*exp) che scompone num in una mantissa (0.5<= mantissa <1) e in un esponente intero tale che num=mantissa*2^exp.
La funzione restituisce la mantissa, mentre l’esponente e assegnato alla variabile a cui punta exp.
Non so se ti può essere utile avere il valore della mantissa in valore decimale come 0,nnnn, ma sicuramente ci saranno altre funzione che rendono intero la parte dopo la virgola, potresti usare il Dec2Bcd16.
Buon lavoro.
josel
0
voti
Scusa ma non ho capito una cosa... nella mantissa c'è solo il valore dopo la virgola o contiene anche lo "0,", perché se contiene solo il numero ho risolto! moltiplico questo numero per 2 e lo "sposto" di tanti posti quant'è l'esponente
0
voti
ho visto anche che c'è una altra funzione chiamata Idexp che come scritto nell'help fa "Function returns the result of multiplying the floating-point number num by 2 raised to the power n (i.e. returns x * 2^n)." ma non ho capito una cosa, il valore finale è il risultato dell'espressione nella parentesi o qualche altro numero spezzato sempre in 2 o più bytes?
PS: nella funzione Frexp il numero contenuto nella mantissa è la "frazione normalizzata", adesso devo capire cos'è...
PS: nella funzione Frexp il numero contenuto nella mantissa è la "frazione normalizzata", adesso devo capire cos'è...
12 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti