Este pequeño codigo deberia escribir el dato 0xff en la posicion 1 de la EEPROM para luego leer dicha posicon y llevar el dato al PORTB. en la simulacion de proteus tendrian que ponerse a 1 todas las salidas pero fallan dos de ellas.
; Memoria EEPROM
;
; ******************************************************
list p=16f886
include "p16f886.INC"
#define Fosc 4000000
; ******************************************************
; *******************************************************************************
__config _CONFIG1, _LVP_OFF&_PWRTE_OFF&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF
__config _CONFIG2, _WRT_OFF&_BOR40V
; *******************************************************************************
; *******************************************************************************
org 0x2100 ; primera posición de memoria de la EEPROM
de 0xff ; la directiva "de" graba el valor 0xff en la primera
; posición de la EEPROM despues del ensamblado. La utili
; zamos para saber que la primera vez que se graba el
; dispositivo,se encuentra el valor 0xff en la primera
; posición de memoria.
; *******************************************************************************
; *******************************************************************************
org 0x00
goto inicio
org 0x05
; *******************************************************************************
; *******************************************************************************
; rutina para grabar un byte en la EEPROM de datos. La dirección está contenida
; en EEADR y el dato se encuentra en EEDAT
WRITE_EEPROM bsf STATUS,RP0
bsf STATUS,RP1 ; banco 3
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,WREN ; Habilitación de escritura. Bit WREN = 1
bcf INTCON,GIE ; Deshabilitar interrupciones
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2 ; Secuencia de escritura dada por Microchip
bsf EECON1,WR ; Inicio del ciclo de escritura
esperar btfsc EECON1,WR ; Fin de escritura ?
goto esperar
bcf EECON1,WREN ; escritura deshabilitada. Bit WREN = 0
bcf PIR2,EEIF ; Flag de fin de escritura. Borrado por software
bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf INTCON,GIE
return
; ********************************************************************************
; *******************************************************************************
; rutina para leer un byte en la EEPROM de datos. La dirección a leer está
; contenida en EEADR y el dato aparecerá en EEDAT
READ_EEPROM bsf STATUS,RP0
bsf STATUS,RP1 ; banco 3
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,RD ; Habilitación de lectura. Bit RD = 1
bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
return
; ********************************************************************************
; *******************************************************************************
; Programa principal.Se escribe el dato 0xff en la EEPROM y seguidamente se lee
; para mandarlo al puerto B
inicio bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf STATUS,RP0
bsf STATUS,RP1 ; Banco 3
clrf ANSEL ; PORTA I/O digitales
clrf ANSELH ; PORTB I/O digitales
bcf STATUS,RP1 ; Banco 1
clrf TRISB
clrf TRISA
bcf STATUS,RP0 ; Banco 0
clrf PORTA ; Init PORTA
clrf PORTB ; Init PORTB
bcf STATUS,RP0
bsf STATUS,RP1 ; Banco 2
principal movlw 0x01
movwf EEADR ;Direccion 1 de la EEPROM
movlw 0xFF ; Dato a escribir en la EEPROM
movwf EEDAT ; lo llevamos al registro EEDAT
call WRITE_EEPROM
call READ_EEPROM ; leemos el byte de la EEPROM
movf EEDAT,W
movwf PORTB
goto principal
end