LIST p=16F88
include "P16F88.inc"
__config _CONFIG1, _WDT_OFF & _INTRC_IO & _MCLR_ON & _LVP_OFF
ERRORLEVEL 0, -302
ADDR equ 0x110
cblock 0x20
OLD, NEW,
endc
;WRITE TO EEPROM__________________________
org 0x00
movlw h'ab'
movwf NEW
movlw h'02'
movwf OLD
banksel TRISA ;bank 1
movlw 0x72 ;8MHz clock
movwf OSCCON
banksel EEADR ;Bank 2
movf ADDR,W ;Address to write to
movwf EEADR
movf NEW, W ;Data to write
movwf EEDATA
banksel EECON1 ;Bank 3
bcf EECON1, EEPGD ;Point to Data memory
bsf EECON1, WREN ;Enable writes
movlw 0x55 ;Write 55h to
movwf EECON2 ;EECON2
movlw 0xAA ;Write AAh to
movwf EECON2 ;EECON2
bsf EECON1, WR ;Start write operation
btfsc EECON1, WR ;Wait for write to finish
goto $-1
bcf EECON1, WREN ;Disable writes
;_____________________________________________________________________________________
;READ EEPROM
banksel EEADR
movf ADDR, W ;address to read from
movwf EEADR
banksel EECON1 ;Bank 3
bcf EECON1, EEPGD ;Point to Data memory
bsf EECON1, RD ;Start read operation
banksel EEADR ;Bank 2
movf EEDATA, W ; W=DATA from EEPROM
movwf OLD
end
;
; read crystal calibration TRIM values from EEPROM
;
clrf EEPTR ; EEPROM address 00 |B0
call Rd_EEProm ; |B0
movwf CCNT ; setup correction count |B0
incf EEPTR,f ; EEPROM address 01 |B0
call Rd_EEProm ; |B0
movwf CVAL ; setup correction value, FF/01 |B0
EEPTR equ h'74' ; EEPROM address pointer
EEVAL equ h'75' ; EEPROM data
;******************************************************************
;
; entry: W contains data, EEPTR contains address, 0..255
;
Wr_EEProm
movwf EEVAL ; save data |B0
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
movf EEVAL,W ; get data |B2
movwf EEDATA ; set data |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,WREN ; enable writes |B3
bcf INTCON,GIE ; disable interrupts |B3
movlw h'55' ; |B3
movwf EECON2 ; |B3
movlw h'AA' ; |B3
movwf EECON2 ; |B3
bsf EECON1,WR ; initiate the write |B3
Wr_chk
btfsc EECON1,WR ; last write complete? |B3
goto Wr_chk ; no, branch |B3
bsf INTCON,GIE ; enable interrupts |B3
bcf EECON1,WREN ; disable writes |B3
bcf STATUS,RP0 ; bank 2 |B2
bcf STATUS,RP1 ; bank 0 |B0
return ; |B0
;******************************************************************
;
;
;
Rd_EEProm
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,RD ; perform RD operation |B3
bcf STATUS,RP0 ; bank 2 |B2
movf EEDATA,W ; get data byte |B2
bcf STATUS,RP1 ; bank 0 |B0
return ; |B0
LIST p=16F88
include "P16F88.inc"
__config _CONFIG1, _WDT_OFF & _INTRC_IO & _MCLR_ON & _LVP_OFF
ERRORLEVEL 0, -302
goto start
EEPTR equ h'74' ; EEPROM address pointer
EEVAL equ h'75' ; EEPROM data
OLD equ h'76'
;******************************************************************
;
; entry: W contains data, EEPTR contains address, 0..255
;
Wr_EEProm
movwf EEVAL ; save data |B0
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
movf EEVAL,W ; get data |B2
movwf EEDATA ; set data |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,WREN ; enable writes |B3
movlw h'55' ; |B3
movwf EECON2 ; |B3
movlw h'AA' ; |B3
movwf EECON2 ; |B3
bsf EECON1,WR ; initiate the write |B3
Wr_chk
btfsc EECON1,WR ; last write complete? |B3
goto Wr_chk ; no, branch |B3
bcf EECON1,WREN ; disable writes |B3
bcf STATUS,RP0 ; bank 2 |B2
bcf STATUS,RP1 ; bank 0 |B0
return ; |B0
;******************************************************************
;
;
;
Rd_EEProm
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,RD ; perform RD operation |B3
bcf STATUS,RP0 ; bank 2 |B2
movf EEDATA,W ; get data byte |B2
bcf STATUS,RP1 ; bank 0 |B0
return ;
start
banksel TRISA ;bank 1
movlw 0x72 ;8MHz clock
movwf OSCCON
movlw 0xAB
call Wr_EEProm
nop
call Rd_EEProm
movwf OLD
end
LIST p=16F88
include "P16F88.inc"
__config _CONFIG1, _WDT_OFF & _INTRC_IO & _MCLR_ON & _LVP_OFF
ERRORLEVEL 0, -302
goto start
EEPTR equ h'74' ; EEPROM address pointer
EEVAL equ h'75' ; EEPROM data
OLD equ h'76'
;******************************************************************
;
; entry: W contains data, EEPTR contains address, 0..255
;
Wr_EEProm
movwf EEVAL ; save data
bsf STATUS,RP1 ; bank 2 (RP0 clear)
movf EEPTR,W ; get address
movwf EEADR ; setaddress
movf EEVAL,W ; get data
movwf EEADR ; set data
bsf STATUS,RP0 ; bank 3
bcf EECON1,EEPGD ; select data memory
bsf EECON1,WREN ; enable writes
movlw h'55' ;
movwf EECON2 ;
movlw h'AA' ;
movwf EECON2 ;
bsf EECON1,WR ; initiate the write
Wr_chk
btfsc EECON1,WR ; last write complete?
goto Wr_chk ; no, branch
bcf EECON1,WREN ; disable writes
bcf STATUS,RP0 ; bank 2
bcf STATUS,RP1 ; bank 0
return ;
;******************************************************************
;
;
;
Rd_EEProm
bsf STATUS,RP1 ; bank 2 (RP0 clear)
movf EEPTR,W ; get address
movwf EEADR ; set address
bsf STATUS,RP0 ; bank 3
bcf EECON1,EEPGD ; select data memory
bsf EECON1,RD ; perform RD operation
bcf STATUS,RP0 ; bank 2
movf EEDATA,W ; get data byte
bcf STATUS,RP1 ; bank 0
return ;
start
banksel TRISA ;bank 1
movlw 0x72 ;8MHz clock
movwf OSCCON
movlw h'74
movwf EEPTR
movlw 0xAB
call Wr_EEProm
nop
call Rd_EEProm
movwf OLD
nop
end
list p=16F88, b=8, c= 102, n=71, t=on, st=off, f=inhx32
;******************************************************************
;* *
;* Filename: 16F88 EEPROM Test.asm *
;* Author: Mike McLaren, K8LH *
;* Date: 15-Jul-08 *
;* *
;* 16F88 EEPROM Test Program *
;* *
;* *
;* MPLab: 8.01 (tabs=8) *
;* *
;******************************************************************
processor PIC16F88
include P16F88.INC
errorlevel -302
__CONFIG _CONFIG1, _LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
__CONFIG _CONFIG2, _IESO_OFF&_FCMEN_OFF
;
; _CP_OFF ; default
; _CCP1_RB0 ; default
; _DEBUG_OFF ; default
; _WRT_PROTECT_OFF
; _CPD_OFF ; default
; _LVP_OFF
; _BODEN_OFF
; _MCLR_ON ; default
; _PWRTE_ON
; _WDT_OFF
; _INTRC_IO or _HS_OSC
;
PTRL equ h'20' ; PutString routine
PTRH equ h'21' ; PutString routine
TEMP equ h'22' ; PutByte routine
counter equ h'27' ;
;
EEPTR equ h'70' ;
EEVAL equ h'71' ;
;
; eeprom test value
;
; org h'2100' ; test, ignore
; de h'FF',h'FF',h'FF',h'FF'
;******************************************************************
;* *
;* *
;* *
;******************************************************************
Start equ h'0100' ; bootloader present
org h'0000'+Start ; 0000 or 0100 (bootloader)
Reset_Vector
clrf STATUS ; force bank 0, IRP 0 |B0
clrf PORTA ; clear PORT A latches |B0
clrf PORTB ; clear PORT B latches |B0
bsf STATUS,RP0 ; bank 1 |B1
clrf ANSEL ; setup PORT A digital I/O |B1
clrf TRISA ; setup PORT A all outputs |B1
movlw d'64' ; 25 (8-MHz) or 64 (20-MHz) |B1
movwf SPBRG ; 19200 baud |B1
movlw b'00100100' ; |B1
movwf TRISB ; set RB5/TX & RB2/RX as inputs |B1
movlw b'00100100' ; TXEN=1, SYNC=0, BRGH=1, TX9=0 |B1
movwf TXSTA ; Async, 8, 1, none |B1
bcf STATUS,RP0 ; select Bank 0 |B0
movlw b'10010000' ; SPEN=1, TX9=0, CREN=1, ADDEN=0 |B0
movwf RCSTA ; enable serial port |B0
movf RCREG,W ; flush Rx Buffer |B0
movf RCREG,W ; |B0
call Greeting ; print greeting string |B0
clrf EEPTR ; EE address 00 |B0
movlw 'a' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 01 |B0
movlw 'b' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 02 |B0
movlw 'c' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 03 |B0
movlw 'd' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 04 |B0
movlw 'e' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 05 |B0
movlw 'f' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 06 |B0
movlw 'g' ; |B0
call Wr_EEProm ; |B0
incf EEPTR,F ; EE address 07 |B0
movlw 'h' ; |B0
call Wr_EEProm ; |B0
test movlw 8 ; |B0
movwf counter ; |B0
movlw 0 ; |B0
call PutHex ; |B0
movlw ':' ; |B0
call Put232 ; |B0
movlw ' ' ; |B0
call Put232 ; |B0
clrf EEPTR ; EE address 00 |B0
t1 call Rd_EEProm ; |B0
call PutHex ; |B0
movlw ' ' ; |B0
call Put232 ; |B0
incf EEPTR,F ; |B0
decfsz counter,F ; |B0
goto t1 ; |B0
;
Loop call Get232 ; |B0
call Put232 ; |B0
goto Loop ; |B0
;******************************************************************
;
Get232 btfss PIR1,RCIF ; character available? |B0
goto Get232 ; no, branch, else |B0
movf RCREG,W ; get character |B0
return ; |B0
;
Put232 btfss PIR1,TXIF ; transmit buffer empty? |B0
goto Put232 ; no, branch, else |B0
movwf TXREG ; send character |B0
return ; |B0
;
PutHex movwf TEMP ; save byte |B0
swapf TEMP,W ; swap nibbles in W |B0
call Hex2Asc ; process left nibble |B0
movf TEMP,W ; process right nibble |B0
Hex2Asc andlw b'00001111' ; mask off left nibble |B0
addlw h'36' ; |B0
btfsc STATUS,DC ; |B0
addlw h'07' ; |B0
addlw 0-6 ; ($FA) |B0
goto Put232 ; print ASCII nibble |B0
;
Wr_EEProm
movwf EEVAL ; save data |B0
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
movf EEVAL,W ; get data |B2
movwf EEDATA ; set data |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,WREN ; enable writes |B3
; bcf INTCON,GIE ; disable interrupts |B3
movlw h'55' ; |B3
movwf EECON2 ; |B3
movlw h'AA' ; |B3
movwf EECON2 ; |B3
bsf EECON1,WR ; initiate the write |B3
Wr_chk
btfsc EECON1,WR ; last write complete? |B3
goto Wr_chk ; no, branch |B3
; bsf INTCON,GIE ; enable interrupts |B3
bcf EECON1,WREN ; disable writes |B3
bcf STATUS,RP0 ; bank 2 |B2
bcf STATUS,RP1 ; bank 0 |B0
return ; |B0
;
Rd_EEProm
bsf STATUS,RP1 ; bank 2 (RP0 clear) |B2
movf EEPTR,W ; get address |B2
movwf EEADR ; set address |B2
bsf STATUS,RP0 ; bank 3 |B3
bcf EECON1,EEPGD ; select data memory |B3
bsf EECON1,RD ; perform RD operation |B3
bcf STATUS,RP0 ; bank 2 |B2
movf EEDATA,W ; get data byte |B2
bcf STATUS,RP1 ; bank 0 |B0
return ; |B0
Greeting
movlw high sHello ; |B0
movwf PTRH ; |B0
movlw low sHello ; |B0
movwf PTRL ; |B0
;
PutString
call GetTable ; get a table character |B0
andlw b'11111111' ; |B0
skpnz ; a 00 byte, last character? |B0
return ; yes, return |B0
call Put232 ; output char |B0
incfsz PTRL,F ; increment pointer |B0
goto PutString ; |B0
incf PTRH,F ; |B0
goto PutString ; |B0
;
GetTable
movf PTRH,W ; |B0
movwf PCLATH ; |B0
movf PTRL,W ; |B0
movwf PCL ; |B0
;
sHello dt 0x1b, "[2J" ;home & clear screen
dt "K8LH 16F88 EEPROM Test v1.0\r\n\n\n",0
;
END
LIST p=16F88
include "P16F88.inc"
__config _CONFIG1, _WDT_OFF & _INTRC_IO & _MCLR_ON & _LVP_OFF
ERRORLEVEL 0, -302
goto start
EEPTR equ h'74' ; EEPROM address pointer
NEW equ h'75' ; EEPROM data
OLD equ h'76'
;******************************************************************
;
; entry: W contains data, EEPTR contains address, 0..255
;
write
movwf NEW ; save data
bsf STATUS,RP1 ; bank 2 (RP0 clear)
movf EEPTR,W ; get address
movwf EEADR ; set address
movf NEW,W ; get data
movwf EEDATA ; set data
bsf STATUS,RP0 ; bank 3
bcf EECON1,EEPGD ; select data memory
bsf EECON1,WREN ; enable writes
movlw h'55' ;
movwf EECON2 ;
movlw h'AA' ;
movwf EECON2 ;
bsf EECON1,WR ; initiate the write
Wr_chk
btfsc EECON1,WR ; last write complete?
goto Wr_chk ; no, branch
bcf EECON1,WREN ; disable writes
bcf STATUS,RP0 ; bank 2
bcf STATUS,RP1 ; bank 0
return ;
;******************************************************************
;
;
;
read
bsf STATUS,RP1 ; bank 2 (RP0 clear)
movf EEPTR,W ; get address
movwf EEADR ; set address
bsf STATUS,RP0 ; bank 3
bcf EECON1,EEPGD ; select data memory
bsf EECON1,RD ; perform RD operation
bcf STATUS,RP0 ; bank 2
movf EEDATA,W ; get data byte
bcf STATUS,RP1 ; bank 0
return ;
start
banksel TRISA ;bank 1
movlw 0x72 ;8MHz clock
movwf OSCCON
movlw h'074
movwf EEPTR
movlw 0xAB
call write
nop
call read
movwf OLD
nop
hang
goto hang
end
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?