Me ha gustado tu pregunta ...
asi que voy a intentar contestartela, a mi modo ...
Empezemos por el principio: read_eeprom(address) y write_eeprom(address, byte) trabajan con int8, un byte de 8 bits. Para leer y escribir int16, dos bytes de 8 bits cada uno, hay que fabricarse unas funciones "puente" de este estilo:
void write_eeprom_16bits(int address, long* val){
int pLow, pHigh;
pLow = val;
pHigh = val>>8;
write_eeprom(address,pHigh);
delay_ms(12);
++address;
write_eeprom(address,plow);
delay_ms(12);
}
long read_eeprom_16bits(int address){
int pLow, pHigh;
long result;
pHigh = read_eeprom(address);
++address;
pLow = read_eeprom(address);
result=(pHigh<<8);
result+=pLow;
return result;
}
Con ellas he escrito un programa de Test que en el reset guarda un valor de 16 bits en la variable x, llama a la función write_eeprom_16bits y se queda a la espera "escuchando" la RS232 ...
al recibír la tecla 'r' realiza la funciona inversa, lee sobre la variable y, también de 16 bits, desde la misma dirección en la que antes escribimos con read_eeprom_16bits y monitoriza el resultado.
Todo este recorrido esta salpicado de printf's para poder ver todo el proceso paso a paso:
El programa completo tal como quedó para poder monitorizar todos los pasos es:
// eeprom_16bits plus rs232
#include <18f4550.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
char Keypress = 0x00;
char Command = 0x00;
long x,y;
#int_rda
void serial_isr() {
Keypress=0x00;
if(kbhit()){
if(Keypress!=0x00){
if(Keypress=='r'){
Command=Keypress;
}
keypress=0x00;
}
}
}
void write_eeprom_16bits(int address, long* val){
int pLow, pHigh;
printf("write_eeprom_16bits( address=%u, val=%lx)\r\n",address
,val
); pLow = val;
pHigh = val>>8;
printf("write_eeprom( address=%u, val=%x)\r\n",address
,pHigh
); write_eeprom(address,pHigh);
delay_ms(12);
++address;
printf("write_eeprom( address=%u, val=%x)\r\n",address
,pLow
); write_eeprom(address,plow);
delay_ms(12);
}
long read_eeprom_16bits(int address){
int pLow, pHigh;
long result;
printf("read_eeprom_16bits( address=%u)\r\n",address
); pHigh = read_eeprom(address);
printf("read_eeprom( address=%u) = %x\r\n",address
,pHigh
); ++address;
pLow = read_eeprom(address);
printf("read_eeprom( address=%u) = %x\r\n",address
,pLow
); result=(pHigh<<8);
result+=pLow;
return result;
}
void main(){
disable_interrupts(global);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
set_tris_e(0b00010000);
set_tris_c(0b10000000);
delay_ms(1000);
output_High(PIN_E0);
output_High(PIN_E1);
output_High(PIN_E2);
printf("18F4550 in RRBOARAD2\r\n"); printf("Test EEPROM with 18 bits\r\n\n"); delay_ms(500);
output_Low(PIN_E0);
output_Low(PIN_E1);
output_Low(PIN_E2);
Command=0x00;
enable_interrupts(int_rda);
enable_interrupts(global);
x=0x1f2f;
y=0;
printf("initial 16 bits x = %lx (%lu), y = %lx (%lu)\r\n",x
,x
,y
,y
); write_eeprom_16bits(0,x);
while(TRUE) {
if(Command=='r'){
Command=0x00;
y=read_eeprom_16bits(0);
printf("final 16 bits x = %lx (%lu), y = %lx (%lu)\r\n",x
,x
,y
,y
); }
}
}