Introduction
This discussion focuses on interfacing a Dallas DS2430A 256 bit (32 byte) EEPROM with a PIC12C508.
Microchip has announced a number of 8-pin PICs which include on chip EEPROM. However, the DS2430A is a relatively inexpensive alternative for PICs that do no have on-board EEPROM. The DS2430 uses only one of the PICs I/O leads.
A data sheet for the DS2430A is available at http://www.dalsemi.com. We sell the DS2430A in a TO-92 package.
Details
The following example illustrates how N bytes may be written to EEPROM, beginning at a specific address and how they may tehn be read. In this example, the eight values to write are dummied and nothing is done with the values which are read.
Note that the DS2430A contains a volatile scratch pad. Data is first written to this scratch pad using the 0F command and the entire scratch pad is programmed to EEPROM using the 55 command followed by the validation key A5. However, note that the entire scratch pad is programmed to EEPROM.
Thus, if one desires to only modify specific bytes, the EEPROM content is first transferred to the scratch pad using the F0 command, the specific bytes are written to the scratch pad (0F) and the entire scatch pad is programmed to EEPROM (55 followed by the validation code).
Data is read by transferring EEPROM to scratch pad (F0), followed by the address of the first byte followed by sequential reads.
Note that in the example, the device lasered ROM addressing capability of the Dallas 1-wire family is not used. Rather the skip ROM (CC) feature is used.
The following example does not show an interesting write capability to the 64-bit application register followed by a copy and lock.
; Program 2430_1.asm ; ; Performs temperature measurment. No addressing. ; ; Illustrates use of DS2430A 1-W 256 bit EEPROM ; ; 12C508 DS2430A ; GPIO.0 (term 7) ------------------------------ DQ (term 2) ; ; copyright, P. H. Anderson LIST p=12C508 #include <p12C508.inc> __CONFIG 0EH ; MCLR dis, CP off, WDT enabled, INTRC CONSTANT DATA_PIN=0 CONSTANT BASE_VAR=07H CONSTANT DATA_BUFF=18H CONSTANT BUFF_SIZE=8 PIN_DIRS EQU BASE_VAR+0 N EQU BASE_VAR+1 ADR EQU BASE_VAR+2 INDEX EQU BASE_VAR+2 ; these vars used by the O_BYTE EQU BASE_VAR+3 ; common 1-wire routines I_BYTE EQU BASE_VAR+4 LOOP2 EQU BASE_VAR+5 LOOP1 EQU BASE_VAR+6 TEMP EQU BASE_VAR+7 B0 EQU DATA_BUFF+0 ; first location in DATA_BUFF B1 EQU DATA_BUFF+1 B2 EQU DATA_BUFF+2 B3 EQU DATA_BUFF+3 B4 EQU DATA_BUFF+4 B5 EQU DATA_BUFF+5 B6 EQU DATA_BUFF+6 B7 EQU DATA_BUFF+7 ORG 000H MAIN: MOVLW 0C0H ; GPWU dis, GPPU dis, other bits are not used OPTION MOVLW 1FH MOVWF PIN_DIRS ; make all I/Os inputs TRIS GPIO CALL DUMMY_VARS ; set B7 - B0 to some values ; the following illustrates how to write these eight values to EEPROM ; beginning at EEPROM address 06. MOVLW 06H MOVWF ADR ; start address of where data is ; to be stored CALL INIT ; intitialize DS2430 MOVLW 0CCH ; skip ROM MOVWF O_BYTE CALL OUT_BYTE MOVLW 0F0H ; read memory into scratch pad MOVWF O_BYTE CALL OUT_BYTE CALL INIT MOVLW 0CCH ; skip ROM MOVWF O_BYTE CALL OUT_BYTE MOVLW 0FH ; write scratchpad command MOVWF O_BYTE CALL OUT_BYTE MOVF ADR, W ; address of where to start writing MOVWF O_BYTE CALL OUT_BYTE MOVLW BUFF_SIZE ; number of bytes of data MOVWF N MOVLW 18H ; beginning of data buffer MOVWF FSR WRITE_1: MOVF INDF, W ; get the data MOVWF O_BYTE CALL OUT_BYTE INCF FSR, F DECFSZ N, F GOTO WRITE_1 ; done writing to scratch pad ; now program to EEPROM CALL INIT MOVLW 0CCH ; skip ROM MOVWF O_BYTE CALL OUT_BYTE MOVLW 55H ; copy scratch pad MOVWF O_BYTE CALL OUT_BYTE MOVLW 0A5H ; validation key MOVWF O_BYTE CALL OUT_BYTE CALL STRONG_PULL_UP ; provide strong pull up during conversion ; the following shows how to read 8 bytes beginning at address 06 CALL INIT ; intitialize DS2430 MOVLW 0CCH ; skip ROM MOVWF O_BYTE CALL OUT_BYTE MOVLW 0F0H ; read memory into scratch pad MOVWF O_BYTE CALL OUT_BYTE MOVF ADR, W ; address of where to read from MOVWF O_BYTE CALL OUT_BYTE MOVLW BUFF_SIZE ; number of bytes of data MOVWF N MOVLW 18H ; beginning of data buffer MOVWF FSR READ_1: CALL IN_BYTE MOVF I_BYTE, W MOVWF INDF INCF FSR, F DECFSZ N, F GOTO READ_1 ; done reading DONE: GOTO DONE DUMMY_VARS: ; dummy up the data buffer with some values MOVLW .8 MOVWF B0 MOVLW .7 MOVWF B1 MOVLW .6 MOVWF B2 MOVLW .5 MOVWF B3 MOVLW .4 MOVWF B4 MOVLW .3 MOVWF B5 MOVLW .2 MOVWF B6 MOVLW .1 MOVWF B7 RETURN ; The following are standard 1-Wire routines. INIT: CALL PIN_HI CALL PIN_LO MOVLW .50 ; 500 us delay CALL DELAY_10USEC CALL PIN_HI MOVLW .50 ; 500 usec delay CALL DELAY_10USEC RETURN IN_BYTE: ; returns byte in I_BYTE MOVLW .8 MOVWF INDEX CLRF I_BYTE IN_BYTE_1: CALL PIN_LO ; momentary low on DATA_PIN NOP CALL PIN_HI NOP NOP NOP NOP NOP NOP MOVF GPIO, W ; 7 usecs later, fetch from DATA_PIN MOVWF TEMP BTFSS TEMP, DATA_PIN BCF STATUS, C ; its a zero BTFSC TEMP, DATA_PIN BSF STATUS, C ; its a one RRF I_BYTE, F MOVLW .6 ; now delay 60 usecs CALL DELAY_10USEC DECFSZ INDEX, F GOTO IN_BYTE_1 MOVF I_BYTE, W ; return the result in W RETURN OUT_BYTE: ; sends O_BYTE to 2430 MOVLW .8 MOVWF INDEX OUT_BYTE_1: RRF O_BYTE, F BTFSS STATUS, C GOTO OUT_0 GOTO OUT_1 OUT_BYTE_2: DECFSZ INDEX, F GOTO OUT_BYTE_1 RETURN OUT_0: CALL PIN_LO ; bring DATA_PIN low MOVLW .6 ; for 60 usecs CALL DELAY_10USEC CALL PIN_HI GOTO OUT_BYTE_2 OUT_1: CALL PIN_LO ; momentary low CALL PIN_HI MOVLW .6 ; 60 usec delay CALL DELAY_10USEC GOTO OUT_BYTE_2 ;;;;;; PIN_HI: BSF PIN_DIRS, DATA_PIN MOVF PIN_DIRS, W TRIS GPIO RETURN PIN_LO: BCF GPIO, DATA_PIN BCF PIN_DIRS, DATA_PIN MOVF PIN_DIRS, W TRIS GPIO RETURN STRONG_PULL_UP: BSF GPIO, DATA_PIN BCF PIN_DIRS, DATA_PIN MOVF PIN_DIRS, W TRIS GPIO CALL DELAY_LONG BSF PIN_DIRS, DATA_PIN MOVF DATA_PIN, W TRIS GPIO RETURN DELAY_LONG: MOVLW .100 ; 100 msec delay MOVWF LOOP1 DELAY_N_MS: OUTTER: MOVLW .110 ; close to 1.0 msec delay when set to .110 MOVWF LOOP2 INNER: CLRWDT NOP NOP NOP NOP NOP NOP DECFSZ LOOP2, F ; decrement and leave result in LOOP2 ; skip next statement if zero GOTO INNER DECFSZ LOOP1, F GOTO OUTTER RETURN DELAY_10USEC: ; provides a delay equal to W * 10 usecs MOVWF LOOP1 DELAY_10USEC_1: CLRWDT NOP NOP NOP NOP NOP NOP DECFSZ LOOP1, F GOTO DELAY_10USEC_1 RETURN END