memorizzare un reale su eprom

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

Reply to
Alessandro Brasili
Loading thread data ...

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

Reply to
]Nastero[

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

Reply to
lucky

"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.

Reply to
Alessandro Brasili

Ok grazie non ci avevo pensato ci proverò.

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

Reply to
Alessandro Brasili

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.

Reply to
Valeria Dal Monte

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

Reply to
lucky

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...

Reply to
Alessandro Brasili

"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.

Reply to
Alessandro Brasili

"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

Reply to
Fabio G.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.