;======================================================================= ; WriteFlash ; Scrive e verifica 8 bytes puntati da FSR0 in Memoria Programma. ; L' area da scrivere in FLASH è puntata da TBLPTR. ; L' area da copiare dalla RAM è puntata da FSR0. ; La routine può essere ripetuta per un intero blocco da 64 bytes: ; se l' area puntata è all' inizio del blocco di 64 bytes, ; vine cancellato prima l'intero blocco. ; Se c'è stato un errore nella scrittura, viene settato un flag. ;======================================================================= ; Memoria richiesta ; cntr ; counter ; tbptl_sav ; salvataggio pointer ; tbpth_sav ; FLASH_ERR ; flag (1 bit) ;======================================================================= WwriteFlash bcf FLASH_ERR ; cancella il flag di errore scrittura ; vérifier si début d'un bloc de 64 ; --------------------------------- movf TBLPTRL,w ; LSB del pointer andlw 0x3F ; check sui primi 6 bit bnz wf1 ; è all' interno di un blocco, non cancella ; E' l' inizio di un blocco - cancella il blocco bsf EECON1,EEPGD ; memoria flash bcf EECON1,CFGS ; programma bsf EECON1,WREN ; abilita scrittura bsf EECON1,FREE ; abilita cancellazione bcf INTCON, GIE ; arresta interrupt movlw 0x55 ; chiave movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR ; avvia cancellazione nop ; sicurezza bsf INTCON, GIE ; riavvia interrupt ; Scrive 8 bytes in Flash wf1 movff TBLPTRL,tbptl_sav ; salva LSB pointer movff TBLPTRH,tbpth_sav ; salva MSB pointer tblrd*- ; aggiusta pointer (-1) movlw 0x08 ; 8 bytes movwf cntr ; al contatore wf2 movff POSTINC0,TABLAT ; carica dato, pointer+1 e passa tblwt+* ; al buffer di scrittura+1 decfsz cntr,f ; fine ? bra wf3 ; no - altro loop ; si - scrittura bsf EECON1,EEPGD ; memoria flash bcf EECON1,CFGS ; programma bsf EECON1,WREN ; abilita scrittura bcf INTCON, GIE ; arresta interrupt movlw 0x55 ; chiave movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR ; avvia scrittura nop ; sicurezza bsf INTCON, GIE ; riavvia interrupt ; verifica della scrittura movff tbpth_sav,TBLPTRH ; restore MSB pointer movff tbptl_sav,TBLPTRL ; restore LSB pointer movlw 0x08 ; 8 bytes movwf cntr ; al contatore subwf FSR0L,f ; pointer FSR0 in RAM btfss STATUS,C decf FSR0H,f wf3 tblrd*+ ; legge un byte dalla flash movf TABLAT,w ; compara il dato con la RAM cpfseq POSTINC0 ; se uguali salta bsf FLASH_ERR ; diversi - set flag errore decfsz cntr,f ; fine ? bra wf3 ; no - altro loop return ; ritorno ;=======================================================================