Vai al contenuto
PLC Forum


Lettura Eeprom Pic!


lukappa87

Messaggi consigliati

ciao a tutti!

ho un problemino con la eeprom interna dell'877.

supponiamo di avere la eeprom in questo stato:

0000 : 31 32 34 FF FF FF FF FF

0008 : FF FF FF FF FF FF FF FF

0010 : ecc ecc

i dati che sono in eeprom devono rappresentare un numero float. in questo caso il numero è 12,4.

per fare ciò utilizzo questa funz.

float x;

1) x=(eeprom_r(0x00)-48)*10;

2) x=x+(eeprom_r(0x01)-48);

3) x=x+((eeprom_r(0x02)-48)/10);

spiego:

nel primo punto leggo il valore in address 0x00 (in questo caso è 0x32) al quale sottraggo lo zero ascii ottenendo il valore 1. moltiplico per 10 e avrò come risultato in x il valore 10.

nel secondo punto faccio la stessa cosa in 0x01 senza moltiplicare per 10 e poi sommo al valore di prima,ottendendo 10+2=12.

nel terzo IDEM in 0x02 , cambia solo il fatto che divido per 10 il risultato ottenuto, quindi 4/10=0.4. e infine sommo al valore di prima: quindi 12+0,4=12,4

DETTO CIO':

in molti casi mi ritrovo ad esempio al posto di 12,4 --->12,3

al posto di 42,7 --->42,6

al posto di 2,2 --->2,1

ecc

però non succede sempre... come mai?

il problema non è sulla eeprom perchè se leggo i valori con il programmatore risulatno esatti!

Grazie per l'attenzione

spero in un vostro aiuto! :)

Modificato: da lukappa87
Link al commento
Condividi su altri siti


Hai provato a studiare il disassemblato per vedere se non sbagli a tradurre alcune istruzioni ?

Prova in caso affermativo a scrivere la stessa operazione in maniera diversa , magari assegnado la variabile EEPROM ad una variabile in memoria prima di fare i calcoli.

Ciao :)

Link al commento
Condividi su altri siti

Non ho capito bene...

Tu vuoi leggere dalla eeprom un valore float e memorizzarlo su una variabile e viceversa giusto?

Allora il metodo piu' semplice e preciso e' quello di scrivere direttamente i 4 byte della variabile in eeprom .

o leggere i 4 byte della eeprom e scriverli nella variabile.

Con tutti quei calcoli , puoi indurre un errore.

Ci devi dire che compilatore usi, per farti un esempio.

Modificato: da dlgcom
Link al commento
Condividi su altri siti

si . ho già provato in diversi modi! facendo conversioni, ma niente

il compilatore è PICC della hitech.

cosa si può fare altro?

dlgcom il valore che leggo dalla eeprom sono 3 interi dai quali ricavo il float

mi fai un esempio di routine?

Modificato: da lukappa87
Link al commento
Condividi su altri siti

Allora partiamo da un punto come sei arrivato a quel numero?

Io ho fatto una prova , un float per microchip e per il compiler CCS e composto da 4 byte .

Il piu' basso e' l'esponente e seguono 3 di mantissa.

Quindi il numero 12.4 diventa 82 46 66 66 in hex.

per dividere questo numero in 4 per salvarlo o leggerlo dalla eprom devi usare un puntatore.

ecco un piccolo esempio in ccs

int i,n;

float data;

n=0; pozizione iniziale della eeprom

for (i = 0; i < 4; i++)

*(&data + i) = read_EEPROM(i + n);

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...