Hola Mauricio,
Perdona la tardanza...
He estado intentando usar el simulador con el ejemplo del pdf, pero no se hacerlo bien, he usado el program memory window, mi intención es borrar la posicion 100. Poniendo Machine en program memory, no veo los valores que estoy cargando en cada posicion y si borra no veo que lo haga. Te pongo el codigo, es el ejemplo del pdf para un 16f88, también puse la escritura.
Espero que me puedas decir donde debo mirar y chequear...
;*****************************************************************************
;*** Version : 1 ***
;*****************************************************************************
list p=16F88 ; List directive to define processor
#include <p16F88.inc> ; Processor specific variable definitions
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF &
_BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
;*****************************************************************************
; Vars, constants and defines
;*****************************************************************************
CBLOCK 0x20 ; RAM START ADDRESS
ADDRH
ADDRL
word_block
DATA_L
DATA_H
ENDC
ERRORLEVEL -302 ; Don't show message 302 while compiling.
;*****************************************************************************
; Program start
;*****************************************************************************
ORG 0 ; RESET vector location
RESET goto START
;*****************************************************************************
; Interrupt vector
;*****************************************************************************
ORG 4 ; interrupt vector location
;*****************************************************************************
; Interrupt Routine.
;*****************************************************************************
;*****************************************************************************
; Program start
;*****************************************************************************
START clrf STATUS ; Clear Status
clrf INTCON ; Disable interrupts
clrf PCLATH ; Keep in lower KByte
clrf PORTA ; Clear ports
clrf PORTB
bsf STATUS,RP0 ; Select bank 1
clrf ANSEL ; All pins are Digital
movlw H'07'
movwf CMCON ; Turn off comparators
movlw B'00010000' ; i/o port value
movwf TRISA
movlw B'00000001' ; i/o port value
movwf TRISB
movlw B'10000111' ; pullup off, prescaler=256,
movwf OPTION_REG ; Set the OPTION register
bcf STATUS, RP0 ; Select bank 0
bsf INTCON,TMR0IE ; unmask the timer0 interrupt
bsf INTCON,GIE ; and enable interrupt.
;*****************************************************************************
; WRITE FLASH MEMORY
;*****************************************************************************
movlw 0x12
movwf DATA_L
movlw 0x04
movwf DATA_H
movlw 0x01
movwf ADDRH
movlw 0x00
movwf ADDRL
; erase flash memory
BANKSEL EEADRH ; Select Bank of EEADRH
MOVF ADDRH, W ;
MOVWF EEADRH ; MS Byte of Program Address to Erase
MOVF ADDRL, W ;
MOVWF EEADR ; LS Byte of Program Address to Erase
;ERASE_ROW
BANKSEL EECON1 ; Select Bank of EECON1
BSF EECON1, EEPGD ; Point to PROGRAM memory
BSF EECON1, WREN ; Enable Write to memory
BSF EECON1, FREE ; Enable Row Erase operation
;
BCF INTCON, GIE ; Disable interrupts (if using)
MOVLW H'55' ;
MOVWF EECON2 ; Write 55h
MOVLW H'AA' ;
MOVWF EECON2 ; Write AAh
BSF EECON1, WR ; Start Erase (CPU stall)
NOP ; Any instructions here are ignored as processor
; halts to begin Erase sequence
NOP ; processor will stop here and wait for Erase complete
; after Erase processor continues with 3rd instruction
BCF EECON1, FREE ; Disable Row Erase operation
BCF EECON1, WREN ; Disable writes
BSF INTCON, GIE ; Enable interrupts (if using)
; write flash memory
; 1. The 32 words in the erase block have already been erased.
; 2. A valid starting address (the least significant bits = '00') is loaded into EEADRH:EEADR
; 3. This example is starting at 0x100, this is an application dependent setting.
; 4. The 8 bytes (4 words) of data are loaded, starting at an address in RAM called ARRAY.
; 5. This is an example only, location of data to program is application dependent.
; 6. word_block is located in data memory.
BANKSEL EECON1 ;prepare for WRITE procedure
BSF EECON1, EEPGD ;point to program memory
BSF EECON1, WREN ;allow write cycles
BCF EECON1, FREE ;perform write only
BANKSEL word_block
MOVLW .4
MOVWF word_block ;prepare for 4 words to be written
BANKSEL EEADRH ;Start writing at 0x100
MOVLW 0x01
MOVWF EEADRH ;load HIGH address
MOVLW 0x00
MOVWF EEADR ;load LOW address
BANKSEL DATA_L
MOVLW DATA_L ;initialize FSR to start of data
MOVWF FSR
loop
BANKSEL EEDATA
MOVF INDF, W ;indirectly load EEDATA
MOVWF EEDATA
INCF FSR, F ;increment data pointer
MOVF INDF, W ;indirectly load EEDATH
MOVWF EEDATH
INCF FSR, F ;increment data pointer
BANKSEL EECON1
MOVLW 0x55 ;required sequence
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1, WR ;set WR bit to begin write
NOP ;instructions here are ignored as processor
NOP
BANKSEL EEADR
INCF EEADR, f ;load next word address
BANKSEL word_block
DECFSZ word_block, f ;have 4 words been written?
GOTO loop ;NO, continue with writing
BANKSEL EECON1
BCF EECON1, WREN ;YES, 4 words complete, disable writes
BSF INTCON,GIE ;enable interrupts
;*****************************************************************************
;*****************************************************************************
end
Gracias.