Pues ya está solucionado.
El problema estaba en que la rutina de escritura que viene en el datasheet está mal.
Codigo:
////////////////////////////////////// PREPROCESADO ///////////////////////////////////
#include <16F876A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#include "lcd.c"
#ORG 0x1D00,0x1EFF {} // 512 bytes reservados para el buffer
/////////////////////////////// REGISTROS Y GLOBALES ////////////////////////////////
#byte STATUS = 0x03
#byte INDF = 0x100
#byte FSR = 0x104
#byte EEDATA = 0x10C
#byte EEADR = 0x10D
#byte EEDATH = 0x10E
#byte EEADRH = 0x10F
#byte INTCON = 0x18B
#byte EECON1 = 0x18C
#byte EECON2 = 0x18D
#byte ADDRH = 0x79
#byte ADDRL = 0x7A
#byte DATADDR = 0x7B
/////////////////////////////////////// RUTINAS //////////////////////////////////////
void escribe_buffer(char *ptr,unsigned int dir_H,dir_L)
{
DATADDR = ptr;
EEADRH = dir_H;
EEADR = dir_L;
#ASM
INICIO: BSF STATUS,6 ;
BCF STATUS,5 ; Banco 2
MOVF DATADDR,W ; Dirección inicial de los 4 bytes de origen
MOVWF FSR ; Apuntamos a dicha dirección inicial
LOOP: MOVF INDF,W
MOVWF EEDATA ; Cargamos el dato en el byte menos significativo
MOVLW 0x00
MOVWF EEDATH ; Deshechamos (todos a 0) los 6 bits restantes de la WORD
INCF FSR,1 ; Apuntamos a la siguiente dirección de origen
BSF STATUS,5 ; Banco 3
BSF EECON1,7 ; Accedemos a la memoria de programa
BSF EECON1,2 ; Habilitamos escritura
BCF INTCON,7 ; Deshabilitamos interrupciones
MOVLW 0x55 ; Secuencia de escritura
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,1
NOP
NOP
BCF EECON1,2 ; Deshabilitamos escritura
BSF INTCON,7 ; Habilitamos interrupciones
BCF STATUS,5 ; Banco 2
INCF EEADR,1 ; Incrementamos la dirección de destino...
MOVF EEADR,W
ANDLW 0x04
XORLW 0x04
BTFSS STATUS,2 ; ...y comprobamos si ya se escribió todo el bloque...
GOTO LOOP ; NO! Aún no se escribieron los 4 datos
#ENDASM
}
char lee_buffer(unsigned int dir_H,dir_L)
{
EEADRH=dir_H;
EEADR=dir_L;
#ASM
BSF STATUS,6 //
BSF STATUS,5 // Banco 3
BSF EECON1,7 // Acceso a memoria de programa
BSF EECON1,0 // Lectura
NOP
NOP
#ENDASM
return(EEDATA);
}
////////////////////////////////////// PRINCIPAL /////////////////////////////////////
void main()
{
char DATO[4],dat,*ptr;
DATO[0] = "A";
DATO[1] = "B";
DATO[2] = "C";
DATO[3] = "D";
ptr = &DATO[0];
lcd_init();
escribe_buffer(ptr,0x1D,0x00); // Escribimos en la dirección 0x1D00
printf(lcd_putc,"Escrito-> %c%c%c%c",DATO[0],DATO[1],DATO[2],DATO[3]);
lcd_gotoxy(1,2);
dat = lee_buffer(0x1D,0x00); // Leemos la dirección 0x1D00
printf(lcd_putc,"Leido -> %c",dat);
dat = lee_buffer(0x1D,0x01); // Leemos la dirección 0x1D01
printf(lcd_putc,",%c",dat);
dat = lee_buffer(0x1D,0x02); // Leemos la dirección 0x1D02
printf(lcd_putc,",%c",dat);
dat = lee_buffer(0x1D,0x03); // Leemos la dirección 0x1D03
printf(lcd_putc,",%c",dat);
}