;********************************************************************* ; * ; Tutorial 6 FLASH Persistant Store * ; * ;********************************************************************* ;* TARGET PIC16F877 ;********************************************************************* ; ;********************************************************************* ;* @version 0.1, 27 September 2001 ;* @author James Caska ;********************************************************************* list p=16F877 #include FLASH_ADDRH EQU .112 ;Place in Shared Register Space FLASH_ADDRL EQU .113 ;Place in Shared Register Space FLASH_DATAH EQU .114 FLASH_DATAL EQU .115 ORG .0 GOTO INIT ;========================================== ;Autogenerated configuration code PIC16F877 ;Config Wiz V0.1, www.virtualbreadboard.com ;========================================== ;=========Write to a location in the flash program memory FLASH.WRITE BSF STATUS, RP1 ; BCF STATUS, RP0 ; Bank 2 MOVF FLASH_ADDRH,W ANDLW 0x1f ;keep address within range MOVWF EEADRH ; MSByte of Program Address to read MOVF FLASH_ADDRL,W MOVWF EEADR ; LSByte of Program Address to read MOVF FLASH_DATAH,W MOVWF EEDATH ; MS Program Memory Value to write MOVF FLASH_DATAL,W MOVWF EEDATA ; LS Program Memory Value to write BSF STATUS, RP0 ; Bank 3 BSF EECON1, EEPGD ; Point to PROGRAM memory BSF EECON1, WREN ; Enable writes BCF INTCON, GIE ; Disable Interrupts FLASH.WRITE.doWrite: movlw 0x84 ;enable writes to program flash MOVWF EECON1 movlw 0x55 ;do timed access writes MOVWF EECON2 movlw 0xaa MOVWF EECON2 bsf EECON1,WR ;begin writing to flash NOP ;processor halts here while writing NOP BCF STATUS, RP1 ; Bank 0 BCF STATUS, RP0 RETURN ;=========Read from a location in the flash program memory FLASH.READ BSF STATUS, RP1 ; BCF STATUS, RP0 ; Bank 2 MOVF FLASH_ADDRH,W ANDLW 0x1f ;keep address within range MOVWF EEADRH ; MSByte of Program Address to read MOVF FLASH_ADDRL,W MOVWF EEADR ; LSByte of Program Address to read BSF STATUS, RP0 ; Bank 3 BSF EECON1, EEPGD ; Point to PROGRAM memory FlashRead: movlw 0x80 ;enable reads from program flash MOVWF EECON1 bsf EECON1,RD ;read from flash nop ;processor waits while reading nop BCF STATUS, RP0 ; Bank 2 MOVF EEDATH,W MOVWF FLASH_DATAH MOVF EEDATA,W MOVWF FLASH_DATAL BCF STATUS, RP1 ; Bank 0 RETURN GetNextSample ;Get Next Data Sample _/-\_ BSF PORTE,0 ;Move to the next data NOP BCF PORTE,0 RETURN INIT ;========================================== ;Autogenerated configuration code PIC16F877 ;Config Wiz V0.1, www.virtualbreadboard.com ;========================================== ;======Begin PORT Configuration BSF STATUS, RP0 ;PORT TRIS Registers are on page 1 ;======PORT B MOVLW .255 ;PORTB Configuration Bits MOVWF TRISB ;======PORT C MOVLW .0 ;PORTC Configuration Bits MOVWF TRISC ;======PORT D MOVLW .0 ;PORTD Configuration Bits MOVWF TRISD ;======PORT E CLRF PORTE MOVLW .6 ;PORTE Configuration Bits MOVWF TRISE BCF STATUS, RP0 ;Restore Page0 MAIN MOVLW 0x18 ;Use Page 3 as persistant Store MOVWF FLASH_ADDRH MOVLW .255 MOVWF FLASH_ADDRL MAIN.LOOP MOVF PORTB,W MOVWF FLASH_DATAH CALL GetNextSample MOVF PORTB,W MOVWF FLASH_DATAL CALL FLASH.WRITE CLRF FLASH_DATAH ;Clear to ensure read, really does read back the data CLRF FLASH_DATAL CALL FLASH.READ MOVF FLASH_DATAH,W ;6Bits Only - Means PORTC Loops on 64 not 256 MOVWF PORTC MOVF FLASH_DATAL,W MOVWF PORTD CALL GetNextSample DECFSZ FLASH_ADDRL,F GOTO MAIN.LOOP GOTO MAIN END