Ok Pacala
Aqui va el codigo del maestro y el esclavo, acabo de comprobar que esta rutina si escribe en el esclavo (lo comprove con el ICD-U40), pero la lectura no.
************Maestro********************
#include <18F452.h>
#device icd=true
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#include <input.c>
#include <2402.c>
void main() {
BYTE value, cmd;
EEPROM_ADDRESS address;
init_ext_eeprom();
do {
do {
printf("
Read or Write: "

;
cmd=getc();
cmd=toupper(cmd);
putc(cmd);
} while ( (cmd!="R") && (cmd!="W") );
printf("
Location: "

;
#if sizeof(EEPROM_ADDRESS)==1
address = gethex();
#else
#if EEPROM_SIZE>0xfff
address = gethex();
#else
address = gethex1();
#endif
address = (address<<

+gethex();
#endif
if(cmd=="R")
printf("
Value: %X
",READ_EXT_EEPROM( address ) );
if(cmd=="W") {
printf("
New value: "

;
value = gethex();
printf("
"

;
WRITE_EXT_EEPROM( address, value );
}
} while (TRUE);
}
********************Esclavo********************
#include <16F877A.h>
#device ICD=TRUE
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0, slow)
typedef enum {NOTHING, CONTROL_READ,
ADDRESS_READ, READ_COMMAND_READ} I2C_STATE;
I2C_STATE fState;
BYTE address, buffer[0x10];
#INT_SSP
void ssp_interupt ()
{
BYTE incoming;
output_bit (pin_b0, true);
if (i2c_poll() == FALSE) {
if (fState == ADDRESS_READ) { //i2c_poll() returns false on the
i2c_write (buffer[address]);//interupt receiving the second
fState = NOTHING; //command byte for random read operation
}
}
else {
incoming = i2c_read();
if (fState == NOTHING){
fState = CONTROL_READ;
}
else if (fState == CONTROL_READ) {
address = incoming;
fState = ADDRESS_READ;
}
else if (fState == ADDRESS_READ) {
buffer[address] = incoming;
fState = NOTHING;
}
}
}
void main ()
{
int i;
fState = NOTHING;
address = 0x00;
for (i=0;i<0x10;i++)
buffer
= 0x00;
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while (TRUE) {
delay_ms(1000);
output_bit (pin_b0, false);
}
}
Cuando elijo la opcion de leer "R" (a travez de Hiperterminal) este me devuelve el valor FF, por su puesto no es el dato que mande a escribir.
NelsonPIC