;Flash (14-Bit-Werte) nach RAM lesen
;PE: PMADR = Flash-Adresse (Quelle, beliebig)
; FSR0 = RAM-Adresse (Ziel)
; W = Länge in Words
;VR: W, FSR1H = 0, PMADR (vorgerückt), FSR0 (vorgerückt)
flashRead
movwf FSR1H
banksel PMCON1
_rloop bsf PMCON1,RD ; Capture one flash word
nop
nop
movfw PMDATL ; read LoByte
movwi FSR0++ ; save it
movfw PMDATH ; read HiByte
movwi FSR0++ ; save it
incf PMADRL,f
skpnz
incf PMADRH,f
decfsz FSR1H,f
bra _rloop
return
;Flash-Page löschen
;PE: PMADR = Flash-Adresse, durch 32 teilbar?
flashErase
banksel PMCON1 ;bank 3
bsf PMCON1,FREE
bsf PMCON1,WREN ; enable write and erase to program memory
bra flash_unlock ; stalls until erase finishes
;Flash-Page schreiben
;PE: PMADR = Flash-Adresse, durch 32 teilbar!
; FSR0 = RAM-Adresse mit 64 Byte Daten
;PA: -
flashWrite
banksel PMCON1
bsf PMCON1,LWLO ; write to latches only
bsf PMCON1,WREN
_wloop moviw FSR0++ ; load lower byte
movwf PMDATL ; copy to write latch
moviw FSR0++ ; load upper byte
movwf PMDATH ; copy to write latch
comf PMADRL,w
andlw 31 ;Null beim letzten Word in der Page
brz _wend
call flash_unlock ; execute unlock sequence
incf PMADRL,f ; increment write address
bra _wloop
_wend bcf PMCON1,LWLO ; flash entire page while writing last word
;Flash-Freigabe-Sequenz ausführen
;PE: PMCON1 bits CFGS, LWLO, FREE and WREN set appropriately, BSR==3
;VR: W
flash_unlock
movlwf 0x55,PMCON2
movlwf 0xAA,PMCON2
bsf PMCON1,WR
nop
nop
return
| Vorgefundene Kodierung: UTF-8 | 0
|