Newsgroup: it.hobby.elettronica.digitale
Titolo: accesso eeprom interna pic16f877

sarà un argomento trito e ritrito.. immagino.. ma non riesco a capire come
si fa
cercando su google sembra che per il C si usi la routine di HTL_PICC
sono andato a leggermi il manuale ma....
come da manuale uso questo codice
ma non lo so interpretare
#include <pic.h>
unsigned char eeprom_read(unsigned char addr);
void eeprom_write(unsigned char addr, unsigned char value);
#include <pic.h>
void
main (void)
{
unsigned char data;
unsigned char address;
address = 0x10;
data = eeprom_read(address);
}
non esiste un esempio SEMPLICE di come scrivere 2 dati sulla eprom e
ovviamente leggerli?
non riesco davvero a capire
grazie

 ovviamente leggerli?
Ora non mi viene in mente, ma se posti il contenuto della funzione 
eeprom_read ci dovrebbe essere dentro.
Ciao
S.

> unsigned char eeprom_read(unsigned char addr);
almeno da manuale
cosě nn funziona
non esiste un esempio semplice di come fare da zero?
ho capito come dovrebbe funzionare.. ma non funziona e non so perchč
nessuno ha routine apposite? 

 non esiste un esempio semplice di come fare da zero?
Io la butto lì, aspettando sempre l'esperto di C...
provare a scrivere:
data=&"indirizzo di memoria esadecimale";
Senza virgolette. _Dovrebbe_ assegnare alla variabile "data" il 
contenuto dell'indirizzo di memoria...provare non costa nulla no?
Poi fai sapere.
S.


...
Sul manuale del pic16f87x riporta chiaramente come eseguire il read ed il 
write da eeprom con tanto di esempio.
http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
pagina 35

 write da eeprom con tanto di esempio.
..in asm! :(

 contenuto dell'indirizzo di memoria...provare non costa nulla no?
provato
allora
se scrivo data=&0x00 ma anche con altri indirizzi l'errore č il medesimo:
"can't take this address" (htl-picc)

 > write da eeprom con tanto di esempio.
ipotizziamo si usare un pezzo di asm nel listato in C
ecco qui cosa suggerisce il datasheet
#asm
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Bank 2
MOVF DATA_EE_ADDR,W ; Data Memory
MOVWF EEADR ; Address to read
BSF STATUS,RP0 ; Bank 3
BCF EECON1,EEPGD ; Point to Data memory
BSF EECON1,RD ; EE Read
BCF STATUS,RP0 ; Bank 2
MOVF EEDATA,W ; W = EEDATA
#endasm
mi aiutate? :)
se quindi metto in EEADR l'indirizzo in EEDATA mi trovo il dato? giusto?
il problema è che mi da errore ad ogni riga (undefined symbol) immagino
perchè non siano stati dichiarati i significati di RP0, STATUS.. ecc ecc....
chi mi da una dritta?

 "can't take this address" (htl-picc)
Non so come funziona nel C dei PIC, ma l'operatore & è chiamato
"indirizzo di", ovvero è usato per mettere in una variabile
l'indirizzo di un'altra variabile. Il valore 0x00 è una semplice
costante numerica e come tale non ha indirizzo.
Piuttosto, penso che tu possa scrivere (senza scomodare nessun
puntatore, che qui non serve) qualcosa tipo:
data=0x00;

 "can't take this address" (htl-picc)
Ok, ho guardato meglio, ha ragione Darwin sull'utilizzo dell'operatore 
&, non fa al caso tuo.
Da quello che ho letto in giro direi che il modo più semplice per 
leggere/scrivere in memoria siano quelle subroutine eeprom_read ed 
eeprom_write che sono già belle implementate nel compilatore.
- data=eeprom_read("indirizzo di memeoria")
ti restituisce il valore contenuto in quell'indirizzo
- eeprom_write("indirizzo di memoria","valore")
ti scrive il valore a quell'indirizzo
Sono troppo scontato o non vedo il problema?
S.

 ti scrive il valore a quell'indirizzo
oddio... è così semplice??? O_O
controllo appena arrivo a casa! 

 > ti scrive il valore a quell'indirizzo
non funziona
dato=eeprom_read(0x10);
che restituisce un warning (function declared implicit int)
allora come da manuale inserisco
unsigned char eeprom_read(unsigned char addr);
che però da errore anch'esso (undefined symbol)
in sostanza.. è possibile che nessuno qui abbia mai salvato o letto un dato
nella eprom di un pic con HTL-PIC ???

 non funziona
Hai incluso la libreria?
#include <pic.h>
Altrimenti non so proprio cosa dirti, ci devo provare anch'io...

 nella eprom di un pic con HTL-PIC ???
Si, ma in assembler. Non ho mai usato il C per i PIC, anche se conosco
il linguaggio.

 #include <pic.h>
si

 ha scritto nel messaggio
news:44a5125c$0$10052$4faf...@reader3.news.tin.it...

..devi includere il file con le definizioni delle costanti (pic16f877.inc),
se usi C è probabile che lo devi inserire dichiarandolo come asm..ora non so
dirti...cmq..ho letto un po' quello che hai scritto prima...ma hai mai
controllato che le funzioni
unsigned char eeprom_read(unsigned char addr);
void eeprom_write(unsigned char addr, unsigned char value);
siano scritte da qualche parte..tipo nel pic.h...diversamente è logico che
non ti funzionerà mai, inoltre controlla che l'indirizzo sia sempre un
numero compreso tra 0 e FF...se non funziona ancora posta meglio il tipo di
errore che ti da, il programma che compili e la riga a cui ti segnala
l'errore...solo così forse si può far qualcosa!!
Ciao..
Steno


ha scritto:

Se usi la versione Lite del compilatore PICC, le funzioni per
l'accesso alla EEPROM  *NON* sono incluse e le devi scrivere
appositamente.  Quello che segue è un esempio funzionante, nel quale
le funzioni eeprom_write e eeprom_read realizzano in C quello che il
manuale Microchip ti spiega in assembler.
Spero che sia chiaro.
Massimo De Munari
#include <pic.h>
unsigned char var1, var2, var3;
void eeprom_write( unsigned char addr, unsigned char value )
{
	while (WR)
		continue;
	EEADR   = addr;
	EEDATA  = value;
	EECON1 &= 0x7F;
	CARRY   = 0;
	if (GIE)
		CARRY = 1;
	GIE     = 0;
	WREN    = 1;
	EECON2  = 0x55;
	EECON2  = 0xAA;
	WR      = 1;
	if (CARRY)
		GIE = 1;
	WREN    = 0;
}		  
unsigned char eeprom_read( unsigned char addr )
{
	EEADR   = addr;
	EECON1 &= 0x7F;
	RD      = 1; 
	return ( EEDATA );
}
main(void)
{
	...
	...
 
	/* scrive i valori VAr1, var2, var3 in EEPROM usando tre
indirizzi consecutivi */
 
	eeprom_write( 0x00, var1 );
	eeprom_write( 0x01, var2 );
	eeprom_write( 0x02, var3 );
	/* legge gli stessi valori */
	var1 = eeprom_read( 0x00 );
 	var2 = eeprom_read( 0x01 );
	var3 = eeprom_read( 0x02 );

 manuale Microchip ti spiega in assembler.
grazie.. funziona!
anche se cmq io non uso la versione lite
mah......