aqui adjunto la funcion para poder escribir datos en la memoria de programa del pic 18f452, hasta ahora no graba nada, a ver si alguien encuentra el porque
void escribiendo_memoria(char *ptra,int addr_upper,int addr_high,int addr_low){
char COUNTER;
char buffer[64];
char *pt;
int i,j,dir;
char new_data_low;
char new_data_high;
char counter_high;
pt=&buffer[0];
TBLPTRU=ADDR_UPPER;
TBLPTRH=ADDR_HIGH;
TBLPTRL=ADDR_LOW;
FSR0H=0;
FSR0L=pt;
#asm
movlw 0x40
movwf COUNTER
//LEYENDO EL BOQUE DE 64 BYTE
READ_BLOCK:
TBLRD*+
MOVF TABLAT,W
MOVWF POSTINC0
DECFSZ COUNTER
BRA READ_BLOCK
//actualizando buffer
movlw 0
movwf FSR0H
movf PT,W
MOVWF FSR0L
Movlw 0
movwf POSTINC0
Movf PTRA,W
movwf INDF0
ERASE_BLOCK:
MOVF ADDR_UPPER,W
MOVWF TBLPTRU
MOVF ADDR_HIGH,W
MOVWF TBLPTRH
MOVF ADDR_LOW,W
MOVWF TBLPTRL
bsf EECON1,7 //eepgd
bcf EECON1,6 //cfgs
bsf EECON1,2 //wren
bsf EECON1,4 //FREE
bcf INTCON,7 //GIE
movlw 0X55
movwf EECON2
movlw 0XAA
movwf EECON2
bsf EECON1,1
bsf INTCON,7
TBLRD*-
//ESCRIBIENDO
WRITE_BUFFER_BACK:
MOVLW 8
MOVWF COUNTER_HIGH
MOVLW 0
MOVWF FSR0H
MOVF PTRA,W
MOVWF FSR0L
PROGRAM_LOOP:
MOVLW 8
MOVWF COUNTER
WRITE_WORD_HREGS:
MOVF POSTINC0,W
MOVWF TABLAT
TBLWT+*
DECFSZ COUNTER
BRA WRITE_WORD_HREGS
PROGRAM_MEMORY:
BSF EECON1,7
BCF EECON1,6
bsf EECON1,2 //WREN
bcf INTCON,7 //GIE
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,1
BSF INTCON,7
DECFSZ COUNTER_HIGH
BRA PROGRAM_LOOP
BCF EECON1,2
#endasm
}