memorizzare un reale su eprom

Oct 08, 2004 9 Replies

Salve ragazzi, premesso che gestisco la eprom con il protocollo IC2 e che con gli interi tutto funziona perfettamente. Come posso memorizzare sulla eprom un float? Mi spiego meglio. Nella eprom con la procedura di scrittura posso scrivere un byte alla volta all'indirizzo che voglio, quindi per quanto riguarda i risultati della conversione (0..1023) nessun problema, memorizzo i due registri low e high in due byte e poi ricreo il risultato, il tutto funge benissimo. (se avete qualche idea migliore ben venga). Ho però bisogno assolutamente di memorizzare una matrice di reali 5x3 e un array da 6 con elementi che possono essere anche negativi, la domanda è, come faccio? Avete idea di come fare per scrivere i 4 byte del reale nella eprom? e il segno? Esiste per caso anche un modo per scorrere la eprom e sapere fin dove è scritta senza tenere memoria dell'ultimo indirizzo usato? (tipo end of file per intenderci...) ...come al solito spero di essere stato chiaro e rimango in attesa di una vs risp..ciao Alessandro



p.s se avete qualche routine funzionante che risolve il problema sarei molto felice...sono graditi anche link utili


Puoi fare una sorta di ricerca binaria: leggi a meta' della memoria, controlla se la cella e' vuota, se lo e' controlla a meta' della porzione inferiore, altrimenti controlla a meta' della porzione superiore della memoria, e cosi' via. E' un algoritmo ricorsivo, riuscirai a trovare l'ultima cella scritta con log2(SIZE) letture, dove SIZE e' la dimensione della eprom. Ovviamente il sistema funziona se scrivi in modo sequenziale (dall'inizio alla fine) e cancelli la eprom prima di ricominciare a scrivere da capo.

Ciao

Il 08 Ott 2004, 19:06, "Alessandro Brasili" ha scritto:

Bisognerebbe sapere in che ambiente lavori. Un float è generalmente memorizzato in 4 bytes. Prendi quattro bytes a partire dall'indirizzo della variabile che contiene il float e passali nella eprom. Quando rileggi la eprom rimetti i 4 bytes a partire dall'indirizzo della variabile che deve ricevere il float e te lo ritrovi come valore della variabile.

Perché non passi alla eprom l'intero array, senza preoccuparti di cosa contiene? Ne conosci certamente la size e l'indirizzo di base. Leggi byte per byte senza preoccuparti di che cosa sia e che cosa contenga e lo passi in eprom.

file

Se nella eprom ci metti valori da 000h a 0FFh non hai modo di inserire un . Se ci metti un testo ascii a 7 bit, il valore 0FFh potrebbe essere usato come . Diversamente scrivi l'indirizzo del primo byte non utilizzato nelle prime locazioni della eprom.

Ciao.

lucky

-------------------------------- Inviato via

formatting link

"lucky" ha scritto nel messaggio news: snipped-for-privacy@usenet.libero.it...

Lavoro con mplab c18. Come faccio a sapere essattamente l'indirizzo di partenza della variabile che devo memorizzare?

es. ammettiamo di avere questo array [ 0.0778 0.1773 -0.1199 0.1405

0.0556 0.4885] come faccio a passarlo byte per byte? la dimensione la conosco ma l'indirizzo di base come lo rintraccio?

GRAZIE MILLE PER LA TUA RISPOSTA.

Ok grazie non ci avevo pensato ci proverò.

"]Nastero[" ha scritto nel messaggio news: snipped-for-privacy@4ax.com...

scrittura

Il problema centrale e' come convertire un float in una sequenza di int e viceversa. Se si volessero fare le cose per bene, l'unica sarebbe convertire il float in stringa di caratteri stampabili, per esempio con sprintf(), ma e' una soluzione troppo poco pratica in un micro. Percio' conviene fare le cose sporche. Ci sono almeno due soluzioni. Con uno spregiudicato uso di puntatori, convertendo un puntatore ad un float a puntatore ad un array di char. Oppure, leggermente piu' elegante, facendo una union tra un float e un array di char. In questo modo e con l'aiuto di sizeof() riesci a fare qualcosa anche abbastanza portatile.

file

Dovresti riservare un valore particolare come marcatore, ma questo di solito non e' possibile se usi la eeprom per scriverci valori binari. Secondo me ti conviene usare una locazione della eeprom come puntatore del primo indirizzo libero e tenerlo aggiornato da software. Attenzione che quella cella si usurera' molto piu delle altre.

Il 09 Ott 2004, 00:04, "Alessandro Brasili" ha scritto:

Che non conosco.

Ho dato un'occhiata e ti confermo che i float sono memorizzati in 4 bytes. I puntatori a variabili (DataMemoryPointer) mi sembra di poter dire che siano int. L'operatore "&" restituisce l'indirizzo della variabile. Dovresti usare qualcosa di simile:

float myfloat; // la tua variabile float int pfloat; // ci metteremo l'indirizzo di myfloat pfloat=(int) &myfloat;

Ora la variabile pfloat contiene l'indirizzo della variabile myfloat. Analoga procedura per l'intero array.

float myfloatay[6]; // il tuo array di 6 float int pfloatay; // ci metteremo l'indirizzo di myfloatay pfloatay=(int) &myfloatay[0];

Ciao.

lucky

-------------------------------- Inviato via

formatting link

Ok lucky, giustamente proverò con i puntatori, non ci avevo pensato. (sono neofita!!) Ho però un problema, come faccio a visualizzare il float su display lcd? anche qui ho una procedura che funziona bene con gli interi, per i reali esiste qualcosa di simile? grazie. Alessandro.

"lucky" ha scritto nel messaggio news: snipped-for-privacy@usenet.libero.it...

"Valeria Dal Monte" ha scritto nel messaggio news:pOF9d.31744$ snipped-for-privacy@twister2.libero.it...

Grazie Valeria, sicuramente farò così, tanto per me l'importante è che funzioni giusto il tempo di fare la sperimentazione e per laurearmi...dopodichè se quella celletta di memoria si buca, ahimè peggio per loro!!

Ciao Alessandro.

"Valeria Dal Monte" ha scritto:

...non si potrebbe emulare una sorta di supporto floating point memorizzando mantissa ed esponente??

-- Per rispondermi via email sostituisci il risultato dell'operazione (in lettere) dall'indirizzo

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required