Microchip Technology DM183021 Data Sheet
2010 Microchip Technology Inc.
DS39616D-page 93
PIC18F2331/2431/4331/4431
EXAMPLE 8-3:
WRITING TO FLASH PROGRAM MEMORY
MOVLW
D'64'
; number of bytes in erase block
MOVWF
COUNTER
MOVLW
BUFFER_ADDR_HIGH
; point to buffer
MOVWF
FSR0H
MOVLW
BUFFER_ADDR_LOW
MOVWF
FSR0L
MOVLW
CODE_ADDR_UPPER
; Load TBLPTR with the base
MOVWF
TBLPTRU
; address of the memory block
MOVLW
CODE_ADDR_HIGH
MOVWF
TBLPTRH
MOVLW
CODE_ADDR_LOW
; 6 LSB = 0
MOVWF
TBLPTRL
READ_BLOCK
TBLRD*+
; read into TABLAT, and inc
MOVF
TABLAT,W
; get data
MOVWF
POSTINC0
; store data and increment FSR0
DECFSZ
COUNTER ;
done?
BRA
READ_BLOCK
; repeat
MODIFY_WORD
MOVLW
DATA_ADDR_HIGH
; point to buffer
MOVWF
FSR0H
MOVLW
DATA_ADDR_LOW
MOVWF
FSR0L
MOVLW
NEW_DATA_LOW
; update buffer word and increment FSR0
MOVWF
POSTINC0
MOVLW
NEW_DATA_HIGH
; update buffer word
MOVWF
INDF0
ERASE_BLOCK
MOVLW
CODE_ADDR_UPPER
; load TBLPTR with the base
MOVWF
TBLPTRU
; address of the memory block
MOVLW
CODE_ADDR_HIGH
MOVWF
TBLPTRH
MOVLW
CODE_ADDR_LOW
; 6 LSB = 0
MOVWF
TBLPTRL
BCF
EECON1, CFGS
; point to PROG/EEPROM memory
BSF
EECON1, EEPGD
; point to Flash program memory
BSF
EECON1, WREN
; enable write to memory
BSF
EECON1, FREE
; enable Row Erase operation
BCF
INTCON, GIE
; disable interrupts
MOVLW
55h
; Required sequence
MOVWF
EECON2
; write 55h
MOVLW
0AAh
MOVWF
EECON2
; write 0AAh
BSF
EECON1, WR
; start erase (CPU stall)
NOP
BSF
INTCON, GIE
; re-enable interrupts
WRITE_BUFFER_BACK
MOVLW
8
; number of write buffer groups of 8 bytes
MOVWF
COUNTER_HI
MOVLW
BUFFER_ADDR_HIGH
; point to buffer
MOVWF
FSR0H
MOVLW
BUFFER_ADDR_LOW
MOVWF
FSR0L
PROGRAM_LOOP
MOVLW
8
; number of bytes in holding register
MOVWF
COUNTER
WRITE_WORD_TO_HREGS
MOVF
POSTINC0,F
; get low byte of buffer data and increment FSR0
MOVWF
TABLAT
; present data to table latch
TBLWT+*
; short write
; to internal TBLWT holding register, increment
; TBLPTR
DECFSZ
COUNTER
; loop until buffers are full
GOTO
WRITE_WORD_TO_HREGS