Newsgroup: it.hobby.elettronica.digitale
Titolo: lettura eeprom PIC

questo è il listato del programma come da manuale di HI_TECH PICC
il pic è un 16f877a
ma il compilatore da errore
#include <pic.h>
unsigned char EEPROM_READ (unsigned char addr);
void EEPROM_WRITE (unsigned char addr, unsigned char value);
void
main (void)
{
unsigned char data;
unsigned char addr;
addr = 0x10;
data = EEPROM_READ(addr);
}
l'errore è un "undefined symbol" sull'EEPROM_READ
dove sbaglio?


mi rispondo.....
con queste 2 dichiarazioni funziona.. ringrazio tanto Massimo... :)
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 );
}


ha scritto:

Nel compilatore PICCLite della HI_TECH,   versione 8.xx (ma potrebbe
essere così anche nella 9.xx), le dichiarazioni di funzione relative
alla EEPROM non funzionano.
Quindi, l'esempio funziona  se usi la versione professionale, ma se
usi la versione Lite, non funziona proprio (ho provato: stesso errore
che dà  a te).
L'unico modo di farlo funzionare in C, che io sappia, è di scrivere le
funzioni come ho descritto nel post precedente, cosi che il tuo
esempio diventa:
#include <pic.h>
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 );
}
void main (void)
{
	unsigned char data;
	unsigned char addr;
	addr = 0x10;
	data = EEPROM_READ(addr);
}
Nell'esempio corretto,  le funzioni eeprom_write  e  eeprom_read  sono
SCRITTE, al contrario di quello che hai proposto tu, dove le funzioni
sono solo DICHIARATE.  Tutto il problema ha origine in una limitazione
del compilatore "Lite" rispetto a quello "Professionale".  Questa
limitazione è descritta in un qualche file di documentazione del
compilatore Lite, ma non ricordo se anche nel suo manuale. 
L'ambaradan delle funzioni, specialmente di eeprom_write, spiega al
PIC che l'indirizzo di memoria si riferisce alla EEPROM dati e non
alla RAM e  cerca di evitare scritture accidentali dovute ad interrupt
o errori nel programma.
Massimo De Munari

 o errori nel programma.
funzionano meravigliosamente
grazie 

 #include <pic.h>



-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> dove sbaglio?
Il problema, che in realtà è una limitazione dichiarata dal produttore
(ma non ricordo in quale documento),  riguarda la versione "Lite"
(PiccLite) del compilatore C per il Pic della Hi-tech, ossia la
versione scaricabile freeware e limitata a pochi modelli di PIC e a
soli 2k di programma. 
Uso PiccLite versione 8.05PL2 e ho questo problema, comunque
aggirabile come descritto in un post precedente.
Massimo De Munari