Newsgroup: it.hobby.elettronica.digitale
Titolo: gestire eeprom 8 bit

Ciao a tutti!
Ho necessita di gestire nella eeprom ad 8 bit interna di un microcontrollore 
numeri superiori a 255 (valore massimo 500) volevo conferma se quello che ho 
pensato puo' andare bene oppure c'e' una soluzione migliore e piu' 
efficiente.
Pensavo di fare un controllo, se il numero e minore di 255 uso la locazione 
1 se invece e' superiore metto 255 nella prima locazione, nella seconda 
metto la differenza del numero con 255 (es. numero 260 differenza 260-255=5) 
quando mi riserve quel numero vado a controllare la seconda locazione della 
eeprom se trovo un numero valido( differente a 255) vado a leggere la prima 
locazione ed aggiungo il valore della seconda locazione (255+5=260) 

 efficiente.
Per funzionare funziona, e, visto che comunque si devono usare due bytes 
e il massimo e' 500, tutto sommato un modo o l'altro non fa differenza.
E' tuttavia un sistema "pittoresco", in quanto di solito con due bytes 
si puo' rappresentare un valore fino a 65535 (numero a 16 bit), 
suddiviso in byte alto e byte basso.
Per conoscere il valore totale, il byte alto va moltiplicato per 256 e 
sommato a quello basso.
Allo stesso modo per scomporre un valore compreso tra 0 e 65535 in due 
bytes si divide il valore per 256, il quoziente e' il byte alto, il 
resto quello basso. Nel caso di valori fino a 255 il byte alto rimane 
sempre 0.
In pratica non dovrebbe poi esserci neppure bisogno di fare queste 
operazioni, perche' il valore da memorizzare per forza di cose e' gia' 
scomposto in parte alta e parte bassa e basta memorizzarle e recuperarle 
cosi' come sono, ma la visibilita' di questa struttura puo' essere 
occultata da un eventuale linguaggio ad alto livello che si sta usando.
ciao
Claudio_F


Sto usando un modesto PIC16F628A con il compilatore CCS, non so se c'e' 
qualcosa di gia pronto, credo comunque che quello che hai scritto e' 
corretto ma temo che in termini di risorse sia meno efficiente, sbaglio? 

 corretto ma temo che in termini di risorse sia meno efficiente, sbaglio? 
Se hai accesso alla struttura dei dati (immagino una variabile integer) 
non serve nessuna operazione, ma non so come si faccia in C.
Non c'e' un qualcosa del tipo high(valore) low(valore) ?
Se non c'e', allora il byte basso lo ottieni con valore AND 0FFH e 
quello alto con valore shiftato a destra 8 volte.
In rilettura fai alto shiftato a sinistra 8 volte + basso.
Questo come algoritmo, poi come quantita' di istruzioni assembler 
sottostanti o velocita' non saprei, facendo nel tuo modo abbiamo pur 
sempre dei confronti e delle somme e sottrazioni integer che 
probabilmente coinvolgono chiamate a funzioni interne del linguaggio.
ciao
Claudio_F


E' da poco che uso il C per queste cose, forse meglio aspettare qualche 
esperto. 


una possibile implementazione potrebbe essere la seguente :
/*
   prototipi delle funzioni di scrittura/lettua della EEProm, da
   verificare adattare secondo il proprio sistema
*/
void writeEE(int addr,unsigned char value);
unsigned char readEE(int addr);
int a;/* la tua variabile da scrivere o leggere */	
int destaddr;
unsigned char *p;
/* scrittura */
	destaddr = 0; /* o qualsiasi indirizzo della EEProm */
	p = (unsigned char *) &a;
	writeEE(destaddr++,*p++);
	writeEE(destaddr,*p);
/* lettura */
	destaddr = 0; /* o qualsiasi indirizzo della EEProm */
	p = (unsigned char *) &a;
	*p++ = readEE(destaddr++);
	*p = readEE(destaddr);
questa soluzione sfrutta il fatto che il C e' di bocca buona nell'uso 
dei puntatori e nella loro "conversione", e che un intero ( a 16 bit ) 
viene visto comunque come 2 byte ( char ) ad 8 bit in due indirizzi 
ocnsecutivi, chiaramente i puristi l'aborrono ma funziona ;-)
si potrebbero usare le union ma IMHO non ne vale la pena

 locazione ed aggiungo il valore della seconda locazione (255+5=260)
Aggiungo a quanto detto dagli altri amici che se devi inserire e 
modificare più valori nella EEPROM il tuo metodo non funziona perché 
passando da un valore minore di 255 a uno superiore hai bisogno di una 
cella in più. Se questa è già occupata sei fregato.
In base al tipo e alla quantità di valori dei memorizzare valuta di 
usare sempre 2 celle per ciascuno.
Marco

 ha scritto:


Oppure usare una situazione mista, per esempio  negli AVR utilizzando le
istruzioni Swap e AndI si può facilmente utilizzare un mezzo byte in più, ad
esempio usando il semibyte basso per gli indirizzi pari e il semibyte alto per
quelli dispari, separandoli con un offsert fisso è impossibile fare errori.
--
ciao
  Stefano