lukappa87 Inserito: 14 febbraio 2006 Segnala Share Inserito: 14 febbraio 2006 (modificato) 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 FF0008 : FF FF FF FF FF FF FF FF0010 : ecc ecci 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,4DETTO CIO':in molti casi mi ritrovo ad esempio al posto di 12,4 --->12,3al posto di 42,7 --->42,6al posto di 2,2 --->2,1eccperò 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: 14 febbraio 2006 da lukappa87 Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 14 febbraio 2006 Segnala Share Inserita: 14 febbraio 2006 Cosa lavori in assembler o in C e se in C con che compilatore ???Ciao Link al commento Condividi su altri siti More sharing options...
lukappa87 Inserita: 14 febbraio 2006 Autore Segnala Share Inserita: 14 febbraio 2006 in C...il compilatore è HITECH PICC Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 14 febbraio 2006 Segnala Share Inserita: 14 febbraio 2006 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 More sharing options...
dlgcom Inserita: 14 febbraio 2006 Segnala Share Inserita: 14 febbraio 2006 (modificato) 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: 14 febbraio 2006 da dlgcom Link al commento Condividi su altri siti More sharing options...
lukappa87 Inserita: 14 febbraio 2006 Autore Segnala Share Inserita: 14 febbraio 2006 (modificato) si . ho già provato in diversi modi! facendo conversioni, ma nienteil compilatore è PICC della hitech.cosa si può fare altro?dlgcom il valore che leggo dalla eeprom sono 3 interi dai quali ricavo il floatmi fai un esempio di routine? Modificato: 14 febbraio 2006 da lukappa87 Link al commento Condividi su altri siti More sharing options...
dlgcom Inserita: 14 febbraio 2006 Segnala Share Inserita: 14 febbraio 2006 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 More sharing options...
lukappa87 Inserita: 15 febbraio 2006 Autore Segnala Share Inserita: 15 febbraio 2006 appena ho tempo provo...ti farò sapere. grazie Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora