I have been trying to use the 'read data EEPROM' feature of the 16F88, but can't get it to work. I have used the sample code from Microchip's datasheet. Attached is the (entire) ASM file that I am using. It should (I had hoped) store the value h'BB' in the register count1. Then read it from the data EEPROM location (h'20') and store it into the register count2. When I step through it in the simulator, the EEDATA register gets the value h'FF' instead of h'BB'. I can't figure this out and have spent many hours on it so would be very grateful if someone could help. Code follows... LIST N,ST=OFF,pF88 INCLUDE P16f88.INC ;Register definitions errorlevel 0,-302 __config _config1, _hs_osc & _wdt_off & _pwrte_on & _cp_off & _boden_off & _CCP1_RB0 & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF __config _config2, _IESO_ON & _FCMEN_ON cblock h'20' ; count1 count2 ADDR endc GOTO INITIALISE NOP NOP NOP INITIALISE banksel eedata ; Clearing these registers first to make it easier ; to see what's going on in Watch Window clrf eedata clrf eeadr banksel count1 clrf count1 clrf count2 movlw h'BB' movwf count1 read_eeprom ; This section of code taken from 16F88 datasheet BANKSEL EEADR ; Select Bank of EEADR ; MOVF ADDR,W ; I replaced this line with the literal value h'20' movlw h'20' ; (which is the address of count1) for the purposes of ; troubleshooting MOVWF EEADR ; Data Memory Address to read BANKSEL EECON1 ; Select Bank of EECON1 BCF EECON1,EEPGD ; Point to Data memory BSF EECON1,RD ; EE Read BANKSEL EEDATA ; Select Bank of EEDATA MOVF EEDATA,W ; W = EEDATA ; check to see if data read successful banksel count2 movwf count2 ; move the data value to count2 goto $ end |
|
Problems reading data Eeprom using Pic16F88
Started by ●November 13, 2004
Reply by ●November 16, 20042004-11-16
I dont understand where you are writing BBh into the EEPROM. Given your code, I would expect you to get FFh when you read because you aren't writing to EEPROM. Maybe you've got the register space and eeprom address space confused? They are seperate spaces and no locations are reserved so you can start at 0. You need to copy the write code from the datasheet and call that first, then call the read code. By the way, you can display the EEPROM contents in the simulator so you can immediately see the results of your actions. You could manually write BB into location 20 of the EEPROM to see if the read code works. --- In , izzy_w_2004 <no_reply@y...> wrote: > > > I have been trying to use the 'read data EEPROM' feature of the 16F88, > but can't get it to work. > > I have used the sample code from Microchip's datasheet. Attached is > the (entire) ASM file that I am using. It should (I had hoped) store > the value h'BB' in the register count1. Then read it from the data > EEPROM location (h'20') and store it into the register count2. > > When I step through it in the simulator, the EEDATA register gets the > value h'FF' instead of h'BB'. I can't figure this out and have spent > many hours on it so would be very grateful if someone could help. > > Code follows... > LIST N,ST=OFF,pF88 > INCLUDE P16f88.INC ;Register definitions > errorlevel 0,-302 > __config _config1, _hs_osc & _wdt_off & _pwrte_on & _cp_off & > _boden_off & _CCP1_RB0 & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF > __config _config2, _IESO_ON & _FCMEN_ON > cblock h'20' ; > count1 > count2 > ADDR > endc > GOTO INITIALISE > NOP > NOP > NOP > > INITIALISE > > banksel eedata ; Clearing these registers first to make it easier > ; to see what's going on in Watch Window > clrf eedata > clrf eeadr > > banksel count1 > clrf count1 > clrf count2 > movlw h'BB' > movwf count1 > > read_eeprom ; This section of code taken from 16F88 datasheet > BANKSEL EEADR ; Select Bank of EEADR > > ; MOVF ADDR,W ; I replaced this line with the literal value h'20' > movlw h'20' ; (which is the address of count1) for the > purposes of > ; troubleshooting > > MOVWF EEADR ; Data Memory Address to read > BANKSEL EECON1 ; Select Bank of EECON1 > BCF EECON1,EEPGD ; Point to Data memory > BSF EECON1,RD ; EE Read > BANKSEL EEDATA ; Select Bank of EEDATA > MOVF EEDATA,W ; W = EEDATA > > ; check to see if data read successful > banksel count2 > movwf count2 ; move the data value to count2 > > goto $ > end |