[ srdjan.p @ 18.03.2005. 19:00 ] @
Da li neko ima source za pic16f84 koji cita podatke iz serijskog eeproma 24c16.Potrebno je za gold wafer karticu i problem je u tome zato sto SDA i SCL linije ne mogu da se stave na pull up otpornike,kako je to uobicajeno kod ovog tipa komunikacije.Probano je u pic basic pro, mikro basic i C-u,ali nece.Pozeljno je ako neko ima source u asembleru.
Hvala puno
[ fmdream @ 19.03.2005. 01:46 ] @
Nisam te bas razumio jer se nesjecam tocno spoja 24c16 eproma sa pic16x84 u legendarnoj GoldWafer kartici. Pretpostavljam da zelis napraviti nesto sa mikrokontrolerom koji bi za to trebao znati komunicirati sa 24c16.
Imam gotove rutine za i2c jedino sto bi ti trebao znati je kad, s koje adrese ocitati i gdje ocitano upotrebiti ili spremiti o tome ce ovisiti nacin citanja koji moze biti adresa po adresa ili niz od adrese do adrese.
Najbolje bi ti bilo da pogledas datasheet od 24c16 jer u njemu imas bas sve diagrame za i2c.

Evo ti gotove rutin koje ja koristim

;>>>>>>>>>>>>>>>>> Procedure za komunikaciju sa I2C >>>>>>>>>>>>>>>>>>>
TX
MOVLW b'11000001' ; SDA=OUT SCL=OUT
TRIS PORTB ;

CALL TX4 ; TRANSMIT 8 TIMES
CALL TX4 ;
GOTO BITIN ;
TX4
CALL TXLP ;
CALL TXLP ;
CALL TXLP ;
TXLP
RLF TX_Buffer, f ; ROTATE BIT TO CARRY
GOTO BITO0 ; send the bit to serial EE

; RECEIVE DATA SUBROUTINE
;--------------------------------------------------------------
RX
MOVLW b'11000101' ; SDA=IN, SCL=OUT
TRIS PORTB ;
CALL RX4 ;
CALL RX4 ;
BSF STATUS, C ; SET ACK BIT=1
GOTO BITOUT ; TO FINISH TRANSMISSION

RX4
CALL RXLP ;
CALL RXLP ;
CALL RXLP ;
RXLP
CALL BITI0 ; READ A BIT
RLF RX_Buffer, f ; SHIFT CARRY TO BYTE
RETURN ;

; SEQUENCIAL READING
;---------------------------------------------------------------
RX_SEQ
MOVLW b'11000101' ; SDA=IN, SCL=OUT
TRIS PORTB ;
CALL RX4_SEQ ;
CALL RX4_SEQ ;
BCF STATUS, C ; SET ACK BIT=0
GOTO BITOUT ; TO FINISH TRANSMISSION

RX4_SEQ
CALL RXLP_SEQ ;
CALL RXLP_SEQ ;
CALL RXLP_SEQ ;
RXLP_SEQ
CALL BITI0 ; READ A BIT
RLF RX_Buffer, f ; SHIFT CARRY TO BYTE
RETURN

; START BIT SUBROUTINE
;--------------------------------------------------------------
BSTART
BSF PORTB,SDA ; make sure data is high
MOVLW b'11000001' ; SDA=OUT SCL=OUT
TRIS PORTB ;
BSF PORTB,SCL ; set clock high
NOP ;
BCF PORTB,SDA ; data line goes low during
GOTO BC_END ; high clock for start bit

; STOP BIT SUBROUTINE
;--------------------------------------------------------------
BSTOP
BCF PORTB, SDA ; make sure data line is low
MOVLW B'11000001' ; SDA=OUT SCL=OUT
TRIS PORTB ;
NOP ;
BSF PORTB, SCL ; set clock high
NOP ;
BSF PORTB, SDA ; data goes high while clock high

B_END
NOP ;
BC_END
BCF PORTB, SCL ; set clock low again
RETURN ;

; BITOUT ROUTINE , SEND BIT
;--------------------------------------------------------------
BITOUT ; SDA=OUT SCL=OUT
movlw b'11000001'
tris PORTB
BITO0
BTFSS STATUS, C ; check for state of data bit to xmit
BCF PORTB, SDA ; set data line low
BTFSC STATUS, C ;
BSF PORTB, SDA ; high? set data line high
BSF PORTB, SCL ; set clock line high
; tu je B_end po originalu vrati ako nepomaze
GOTO BC_END ;

; BITIN ROUTINE
;--------------------------------------------------------------
BITIN
MOVLW b'11000101' ; SDA=IN SCL=OUT
tris PORTB
BITI0
BSF PORTB, SCL ; set clock line high
NOP ;
BSF STATUS,C ; assume input bit is high
BTFSS PORTB, SDA ; read the data bit
BCF STATUS,C ; input bit was low ,clear CARRY
GOTO BC_END ;

;<<<<<<<<<<<<<<<<<<<< end komunikacija I2C <<<<<<<<<<<<<<<<<<<<<<<<<<<