Sign in

username:

password:



Not a member?

Search piclist



Search tips

Subscribe to piclist



piclist by Keywords

12F675 | 16F628 | 16F84 | 16f877 | 16F877A | 16F88 | 18F458 | ADC | AVR | Bootloader | CAN | CCS | CRC | EAGLE | EEPROM | ICD | ICSP | IDE | JDM | LED | Macros | Microchip | MPLAB | PCB-CAD | PIC10F | Pic12f675 | PIC16F84 | PIC16F84A | PIC16F877 | PIC18 | PIC18F452 | PicBasic | PICC | PICSTART | PWM | RS-485 | RS232 | SMT | SPI | UART | USART | USB | Wireless | Wisp628 | Xilinx

Ads

Discussion Groups

Discussion Groups | Piclist | 16F628 on-chip eeprom problem

A discussion group for the PICMicro microcontroller. Also called the Microchip PIC, this list is dedicated to the use and abuse of this fine, simple, microcontroller. Close to topic posts are welcome, ie. general electronics.

16F628 on-chip eeprom problem - Vladimir M Skrbic - Mar 1 16:06:00 2004

Hello everyone,

I'm new to the group and I'd like to ask a question. I've recently
moved all my projects from 16F84 to 16F628 mcu's. Yesterday I've
tried to write data to the internal (on-chip) eeprom of 16F628 using
PicBasic Pro with little (or no ;) sucess. Would anyone care to
explain why the same code works on 16F84 and 16F876/877 but not on
16F628? I used the most common method:

EEPROM 0, 127 ' Store 127 into eeprom location 0
...
[code]
...
READ 0, W ' Put contents of memory location 0 into W
...
[code]
...
WRITE 0, W ' Put contents in W into eeprom location 0
...
END

And neither of the commands work! I've tried all locations from
0 - 11 for example and no luck. What am I doing wrong? Any help is
appreciated! Thanks in advance.

--
Sincerest regards,
YZ7REA Vladimir M Skrbic
4N7ATV Repeater Administrator
YU7GHZ Radio Club President




(You need to be a member of piclist -- send a blank email to piclist-subscribe@yahoogroups.com )


Re: Re: 16F628 on-chip eeprom problem - Kees Stenekes - Mar 3 10:32:00 2004

Hi, I even made some assembler-macro's that can be
used for the '628. They work perfectly.

Kees.

;=========================================================================================
; EEprom macros for PIC 16F628
;=========================================================================================
EEPROM_READ MACRO CONFIG_ADDR
BSF STATUS, RP0 ; Bank1
MOVLW CONFIG_ADDR ;
MOVWF EEADR ; Address to read
BSF EECON1, RD ; perform EEPROM read
MOVF EEDATA, W ; store the data
BCF STATUS, RP0 ; Bank0
ENDM

EEPROM_WRITE MACRO CONFIG_ADDR, CONFIG_DATA
BSF STATUS, RP0 ; Bank1
MOVLW CONFIG_ADDR ;
MOVWF EEADR ; Address to write
MOVLW CONFIG_DATA ;
MOVWF EEDATA ; Data to write
BSF EECON1, WREN ; Enable Write
BCF INTCON, GIE ; Disable Interrupts
MOVLW 0x55 ; Write 0x55
MOVWF EECON2 ;
MOVLW 0xAA ; Write 0xAA
MOVWF EECON2 ;
BSF EECON1, WR ; set WR bit

BTFSC EECON1, WR ; still set?
GOTO $-1 ; wait until cleared

BCF EECON1, WREN ; Disable further Writes
BSF INTCON, GIE ; Enable Interrupts

BCF STATUS, RP0 ; Bank0
ENDM

EEPROM_VERIFY MACRO
BSF STATUS, RP0 ; Bank1
MOVF EEDATA, W ; last written value in 'W'
BSF EECON1, RD ; start read at current address
SUBWF EEDATA, W ; subtract W from EEDATA
BTFSS STATUS, Z ; ZERO flag set?
GOTO write_error ; No, there was a write-error
BCF STATUS, RP0 ; Bank0
ENDM --- rj_satterlee <> wrote:
> Hi Validmer-
>
> Well, it's a little more complicated than that.
> I've included the
> read and write routines to the eeprom memory that I
> use for the
> 16F628, which I got from the manual. It's assembly,
> but I think
> that it gives a pretty clear indication of the
> process. Seems
> to work well for me.
>
> Hope this helps.
>
> Cheers,
>
> Rich S.
>
> aka WB6VAL
>
> --- In , "Vladimir M Skrbic"
> <atomski@E...>
> wrote:
> > Hello everyone,
> >
> > I'm new to the group and I'd like to ask a
> question. I've recently
> > moved all my projects from 16F84 to 16F628 mcu's.
> Yesterday I've
> > tried to write data to the internal (on-chip)
> eeprom of 16F628 using
> > PicBasic Pro with little (or no ;) sucess. Would
> anyone care to
> > explain why the same code works on 16F84 and
> 16F876/877 but not on
> > 16F628? I used the most common method:
> >
> > EEPROM 0, 127 ' Store 127 into eeprom
> location 0
> > ...
> > [code]
> > ...
> > READ 0, W ' Put contents of memory
> location 0 into W
> > ...
> > [code]
> > ...
> > WRITE 0, W ' Put contents in W into eeprom
> location 0
> > ...
> > END
> >
> > And neither of the commands work! I've tried all
> locations from
> > 0 - 11 for example and no luck. What am I doing
> wrong? Any help is
> > appreciated! Thanks in advance.
> >
> > --
> > Sincerest regards,
> > YZ7REA Vladimir M Skrbic
> > 4N7ATV Repeater Administrator
> > YU7GHZ Radio Club President ;---------------------------------------------------------------------
>
> ; Read Eprom routine
> ; inputs: eprom_addr contains the address of the
> eprom memory to read
> ; outputs: eprom_data contains the data read from
> the eprom
>
;---------------------------------------------------------------------
> read_eprom
> movf eprom_addr, W ;get the address
> bsf STATUS, RP0 ;select bank 1
> movwf EEADR ;set address to read
> bsf EECON1, RD ;read the eprom
> movf EEDATA, W ;hold in w register
> bcf STATUS, RP0 ;select bank 0
> movwf eprom_data ;save the information
> return ;---------------------------------------------------------------------
> ; Write/verify Eprom routine
> ; inputs: eprom_addr contains the address of the
> eprom memory to read
> ; eprom_data contains the data to write to
> the eprom
> ; output: W = 0 ==> o.k., W <> 0 ==> error in write
> ; uses: eprom_intcon. Stores the state of the
> interrupt bit
> ; NOTE: this routine COULD hang if the eprom logic
> in the hardware
> ; fails to operate. Could put a check in for
> it. The max
> ; time for a byte to be programmed is 8 ms.
>
;---------------------------------------------------------------------
> write_eprom
> bcf PIR1, EEIF ;clear eprom write int flag
> movf eprom_addr, W ;get the address
> bsf STATUS, RP0 ;select bank 1
> movf INTCON, W ;get interrupt control
> bcf STATUS, RP0 ;select bank 0
> movwf eprom_intcon ;save GIE state
> movf eprom_addr, W ;get the address
> bsf STATUS, RP0 ;select bank 1 again
> movwf EEADR ;set address
> bcf STATUS, RP0 ;select bank 0
> movf eprom_data, W ;get the data
> bsf STATUS, RP0 ;select bank 1 again
> movwf EEDATA ;set the data bits
> bsf EECON1, WREN ;set the write enable
> bcf INTCON, GIE ;turn off interrupts
> movlw h'55'
> movwf EECON2 ;first set of eprom write
> movlw h'aa'
> movwf EECON2 ;second set of eprom write
> bsf EECON1, WR ;set the write bit (acutal
> write)
> bcf STATUS, RP0 ;select bank 0
> ; spin waiting for the write to complete
> movlw h'ff'
> write_eprom1
> btfss PIR1, EEIF ;test for write complete
> goto write_eprom1 ;branch if not finished
> ; finished the write
> ; now verify write
> movf EEDATA, W
> bsf EECON1, RD ;read data written
> ; value in W == data read?
> subwf EEDATA, W
> bcf STATUS, RP0 ;select bank 0
> ; reset the interrupt control bit to original value
> btfsc eprom_intcon, GIE ;branch if not enabled
> bsf INTCON,GIE ;enable general interrupts
> return ;if bad w <> 0
__________________________________






(You need to be a member of piclist -- send a blank email to piclist-subscribe@yahoogroups.com )