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