Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC e floating point

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC e floating point

Messaggioda Foto UtenteShark_86 » 26 giu 2006, 16:37

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"! :lol:
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, :lol: 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)
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

0
voti

[2]

Messaggioda Foto Utentejosel » 27 giu 2006, 21:13

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.
josel
Avatar utente
Foto Utentejosel
0 2
 
Messaggi: 20
Iscritto il: 1 giu 2006, 9:03

0
voti

[3]

Messaggioda Foto UtenteShark_86 » 27 giu 2006, 21:33

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...
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

0
voti

[4]

Messaggioda Foto Utentejosel » 27 giu 2006, 23:37

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.
josel
Avatar utente
Foto Utentejosel
0 2
 
Messaggi: 20
Iscritto il: 1 giu 2006, 9:03

0
voti

[5]

Messaggioda Foto UtenteShark_86 » 28 giu 2006, 13:24

Io come programma uso mikroC per cui se mikroPascal ha queste librerie lo deve avere anche mikroC, visto che lo produce la stessa casa, adesso cerco di informarmi bene.
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

0
voti

[6]

Messaggioda Foto Utentejosel » 29 giu 2006, 14:39

Per conoscere le Conversions Library è sufficiente che tu consulti l'indice dell'help, almeno così si fa in mikroPascal.
josel
Avatar utente
Foto Utentejosel
0 2
 
Messaggi: 20
Iscritto il: 1 giu 2006, 9:03

0
voti

[7]

Messaggioda Foto UtenteShark_86 » 29 giu 2006, 21:26

Si le ho viste ma parla solo di Dec2Bcd16, ovvero da decimale a bcd e non da float... :( che non viene neanche nominato... :(
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

0
voti

[8]

Messaggioda Foto Utentejosel » 30 giu 2006, 17:59

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.
josel
Avatar utente
Foto Utentejosel
0 2
 
Messaggi: 20
Iscritto il: 1 giu 2006, 9:03

0
voti

[9]

Messaggioda Foto UtenteShark_86 » 30 giu 2006, 19:54

Scusa ma non ho capito una cosa... :oops: 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 :lol:
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

0
voti

[10]

Messaggioda Foto UtenteShark_86 » 30 giu 2006, 20:06

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'è... :oops: :lol:
Avatar utente
Foto UtenteShark_86
0 2
 
Messaggi: 10
Iscritto il: 26 giu 2006, 15:23
Località: Roma

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti