PIC18 - eeprom write

This is my first attempt to write to eeprom using a pic18f2455. Obviously it isn't working. ;)

Most of it is straight out of the datasheet; can anyone point out what I'm missing? Thanks.

;write serial number to EEPROM ; EEADR initial value is 4 ; MOVWF EEADR ; Lower bits of Data Memory Address to write DECF EEADR ; decrement EEPROM address for ser# storage MOVF NIBBLE_TEMP, W ; ser# value to store MOVWF EEDATA ; Data Memory Value to write BCF EECON1, EEPGD ; Point to DATA memory BCF EECON1, CFGS ; Access EEPROM BSF EECON1, WREN ; Enable writes BCF INTCON, GIE ; Disable Interrupts MOVLW 55h ; Required Sequence MOVWF EECON2 ; Write 55h MOVLW 0AAh ; MOVWF EECON2 ; Write 0AAh BSF EECON1, WR ; Set WR bit to begin write

; User code execution BTFSC EECON1, WR GOTO $-2 ; test for write errors (WRERR) would go here...

BCF EECON1, WREN ; Disable writes on write complete (EEIF set) BSF INTCON, GIE ; Enable Interrupts

Reply to
Randy Day
Loading thread data ...

Randy,

I am very new to PIC MCUs, but you might want to try the PIC list. Lots of folks there who know this stuff.

formatting link
PIC/SX FAQ & list archive

Good luck, Richard

Reply to
Richard Seriani, Sr.
[snip]

Bookmarked. Thanks!

Reply to
Randy Day

Just out of curiosity, what programmer are you using? I have built the PIC-PG1 (JDM with 6.2V zener instead of 8.2V), always had 90% failure rate with 16F626A now. after over a year later can't program the new 18F2320s or the old 16f628s. The new IC-PROG(G) I have noticed some strange things so I am loosing faith in it too.

Just about ready to build a parallel programmer and control it from LINUX if I could only find some detail info on programming algorithms, in case that is available doesn't work.

Cheers, Sam.

Reply to
Sambo

I'm using the PicKit 2 from MicroChip. It came with a 16F690 as a learner chip, but I'm using it now to program 18F2455's.

I've had no problems at all so far; it works great. Then again , mine is a hobbyist environment, not day-in-day-out use. IIRC, it retails for about US$80.

It came with a USB programmer dongle, a preassembled breadboard, MPLAB and the PicKit programming software (Windows), lots of tutorial help and code examples. Not to mention lots of stuff on the CD that I've never even looked at... :)

One thing I did have to do was download a later version of the PicKit software (v1.21) in order to program the newer PIC18 series.

Anyone who wants to do in-circuit programming with the PicKit 2 should read:

formatting link

Reply to
Randy Day

Maybe I'll finally break down and buy one of those. I would be nice to compile and burn.

Reply to
Sambo

===============================================================================

It is very helpful to have a debugger such as the ICD2, but it costs about $150, so might be out of reach for a hobbyist. The software simulator is extremely powerful, however, and you might be able to track down your problem in that way.

You can try some of the following code. I am using a PIC18F242. I think it works for EEPROM, but now I write to Program Flash Memory, which I think is recommended as more reliable:

EEPROMread: MOVLW DATA_EE_ADDR ; MOVWF EEADR ; Data Memory Address to read BCF EECON1, EEPGD ; Point to DATA memory BCF EECON1, CFGS ; Access program FLASH or Data EEPROM memory BSF EECON1, RD ; EEPROM Read MOVF EEDATA, W ; W = EEDATA RETURN

EEPROMwrite: MOVLW DATA_EE_ADDR ; MOVWF EEADR ; Data Memory Address to read MOVLW DATA_EE_DATA ; MOVWF EEDATA ; Data Memory Value to write BCF EECON1, EEPGD ; Point to DATA memory BCF EECON1, CFGS ; Access program FLASH or Data EEPROM memory BSF EECON1, WREN ; Enable writes BCF INTCON, GIE ; Disable interrupts MOVLW 55h ; MOVWF EECON2 ; Write 55h MOVLW 0AAh ; MOVWF EECON2 ; Write AAh BSF EECON1, WR ; Set WR bit to begin write BSF INTCON, GIE ; Enable interrupts ; user code execution

BCF EECON1, WREN ; Disable writes on write complete (EEIF set) RETURN

;Read a block of data from CODE_ADDR into BUFF_ADDR length BUFF_LEN FlashRead: BSF EECON1, EEPGD ; Point to Program Flash memory BCF EECON1, CFGS ; Access program FLASH or Data EEPROM memory BCF INTCON, GIE ; Disable interrupts MOVFF CODE_ADDR_UPPER, TBLPTRU ; Load TBLPTR with the base MOVFF CODE_ADDR_HIGH, TBLPTRH MOVFF CODE_ADDR_LOW, TBLPTRL MOVFF BUFFER_ADDR_HIGH, FSR0H ; point to flash buffer MOVFF BUFFER_ADDR_LOW, FSR0L MOVFF BUFFER_LEN, COUNTER ;Initialize byte counter READ_BYTE TBLRD*+ ; read into TABLAT and increment MOVF TABLAT, W ; get data MOVWF POSTINC0 DECFSZ COUNTER BRA READ_BYTE EndReadFlash BSF INTCON, GIE ; Enable interrupts RETURN

;Write a block of data from BUFF_ADDR into CODE_ADDR length BUFF_LEN FlashWrite: MOVFF BUFFER_LEN, COUNTER_HI ; number of bytes to write MOVFF BUFFER_ADDR_HIGH, FSR0H ; point to flash buffer MOVFF BUFFER_ADDR_LOW, FSR0L

RRNCF COUNTER_HI,F RRNCF COUNTER_HI,F RRNCF COUNTER_HI,F ;Divide by 8 MOVF COUNTER_HI, W ANDLW b'00011111' ;Mask off rotated bits MOVWF COUNTER_HI MOVFF BUFFER_ADDR_HIGH, FSR0H ; point to buffer MOVFF BUFFER_ADDR_LOW, FSR0L PROGRAM_LOOP MOVLW 8 ; number of bytes in holding register MOVWF COUNTER WRITE_WORD_TO_HREGS MOVF POSTINC0, W ; get low byte of buffer data MOVWF TABLAT ; present data to table latch TBLWT+* ; write data, perform a short write ; to internal TBLWT holding register. DECFSZ COUNTER ; loop until buffers are full BRA WRITE_WORD_TO_HREGS

PROGRAM_MEMORY BSF EECON1,EEPGD ; point to FLASH program memory BCF EECON1,CFGS ; access FLASH program memory BSF EECON1,WREN ; enable write to memory BCF INTCON,GIE ; disable interrupts MOVLW 55h MOVWF EECON2 ; write 55h MOVLW 0AAh MOVWF EECON2 ; write AAh BSF EECON1,WR ; start program (CPU stall) BSF INTCON,GIE ; re-enable interrupts DECFSZ COUNTER_HI ; loop until done BRA PROGRAM_LOOP BCF EECON1,WREN ; disable write to memory

RETURN

ERASE_BLOCK MOVFF CODE_ADDR_UPPER, TBLPTRU ; load TBLPTR with base address of memory block MOVFF CODE_ADDR_HIGH, TBLPTRH MOVFF CODE_ADDR_LOW, TBLPTRL BSF EECON1,EEPGD ; point to FLASH program memory BCF EECON1,CFGS ; access FLASH program memory BSF EECON1,WREN ; enable write to memory BSF EECON1,FREE ; enable Row Erase operation BCF INTCON,GIE ; disable interrupts MOVLW 55h MOVWF EECON2 ; write 55h MOVLW 0AAh MOVWF EECON2 ; write AAh BSF EECON1,WR ; start erase (CPU stall) BSF INTCON,GIE ; re-enable interrupts TBLRD*- ; dummy read decrement return

Reply to
Paul E. Schoen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.