Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC 16F84A come Master in un bus I2C

Salve a tutti!!
Avrei la necessità di far comunicare un pic 16F84A con una eeprom
seriale, modello 24LC16B. Sapete indicarmi se esiste una libreria per
il controllo delle comunicazioni I2C su questo pic, che purtroppo non
dispone di un hardware apposito come invece è per altri modelli di
pic? 
Ho visto alcuni messagi più in alto che qualcuno utilizza il PicBasic
di cui purtroppo non dispongo, quindi se possibile mi servirebbe una
soluzione implementata in assembly, o quanto meno una libreria da
poter includere con l'MPASM :)
Ciao ciao!
- The Plash -
(No Fancy Signature Available)

Eccoti le subroutine e le macro che solitamente utilizzo per la lettura e
scrittura di una eeprom 24c65
dovrebbe funzionare  l'unica differenza  sta nel numero di bit di
indirizzamento a te  ne  servono solo 11
ciao  fammi sapere se funziona
di  EQU 4 ;Data in memory
do EQU 3 ;Data out memory
sda EQU 4 ;Data Memory
sck EQU 3 ;Clock Memory
PORT_I2C EQU PORTC
TRIS_I2C EQU TRISC
DEF_VAR_I2C MACRO
  addrh  RES 1
  addrl  RES 1
  eeprom  RES 1
  count_i2c RES 1
  dato_i2c RES 1
  dato_out_i2c RES 1
  tempo_i2c RES 2
ENDM
SUB_I2C  MACRO
;********************************************************************
;*   SCRITTURA Del Byte contenuto in dato_i2c NELLA MEMORIA 24c65   *
;********************************************************************
SCRIVI_EEPROM
 call BSTART_I2C
 movlw 10100000B
 movwf dato_i2c
 call TX_I2C
 movf addrh,w
 movwf dato_i2c
 call TX_I2C
 movf addrl,w
 movwf dato_i2c
 call TX_I2C
 movfw dato_out_i2c
 movwf dato_i2c
 call TX_I2C
 call BSTOP_I2C
 movlw 40
 call Ritardo_I2C
;********************************************************************
;*   LETTURA DI UN BYTE DALLA MEMORIA 24c65 lo carica in dato_i2c   *
;********************************************************************
LEGGI_EEPROM
 call BSTART_I2C
 movlw 10100000B  ; ID memory
 movwf dato_i2c
 call TX_I2C
 movf addrh,w
 movwf dato_i2c
 call TX_I2C
 movf addrl,w
 movwf dato_i2c
 call TX_I2C
 call BSTART_I2C
 movlw 10100001B
 movwf dato_i2c
 call TX_I2C
 call RX_I2C
 call BSTOP_I2C
 movlw 1
 call Ritardo_I2C
 retlw 0
;***********************************************
;*      BIT DI START                    *
;***********************************************
BSTART_I2C
 BANKSEL TRIS_I2C
 bcf TRIS_I2C,sda
 bcf TRIS_I2C,sck
 BANKSEL PORT_I2C
 bsf PORT_I2C,sda
 bsf PORT_I2C,sck
 nop
 nop
 nop
 nop
 bcf PORT_I2C,sda
 nop
 nop
 nop
 nop
 nop
 bcf PORT_I2C,sck
 nop
 nop
 nop
 nop
 retlw 0
;***********************************************
;*      BIT DI STOP                         *
;***********************************************
BSTOP_I2C
 BANKSEL TRIS_I2C
 bcf TRIS_I2C,sda
 bcf TRIS_I2C,sck
 BANKSEL PORT_I2C
 bcf PORT_I2C,sda
 bcf PORT_I2C,sck
 nop
 nop
 nop
 nop
 bsf PORT_I2C,sck
 nop
 nop
 nop
 nop
 bsf PORT_I2C,sda
 nop
 nop
 nop
 nop
 retlw 0
;***********************************************
;*      INVIO DI UN BIT (eeprom do)            *
;***********************************************
BITOUT_I2C
 BANKSEL TRIS_I2C
 bcf TRIS_I2C,sda
 bcf TRIS_I2C,sck
 BANKSEL PORT_I2C
 btfss eeprom,do
 goto BITLOW_I2C
 bsf PORT_I2C,sda
 goto CLKOUT_I2C
BITLOW_I2C
 bcf PORT_I2C,sda
CLKOUT_I2C
 bsf PORT_I2C,sck
 nop
 nop
 nop
 nop
 bcf PORT_I2C,sck
 nop
 nop
 nop
 nop
 retlw 0
;***********************************************
;*      RICEZIONE DI UN BIT  (eeprom di)       *
;***********************************************
BITIN_I2C
 bsf eeprom,di
 BANKSEL TRIS_I2C
 bsf TRIS_I2C,sda
 bcf TRIS_I2C,sck
 BANKSEL PORT_I2C
 bsf PORT_I2C,sck
 nop
 nop
 nop
 nop
 nop
 btfss PORT_I2C,sda
 bcf eeprom,di
 bcf PORT_I2C,sck
 nop
 nop
 nop
 nop
 nop
 retlw 0
;***********************************************
;*      INVIO DI UN BYTE (tx buf)              *
;***********************************************
TX_I2C
 movlw 8
 movwf count_i2c
TXLP_I2C
 bcf eeprom,do
 btfsc dato_i2c,7
 bsf eeprom,do
 call BITOUT_I2C
 rlf dato_i2c
 decfsz count_i2c
 goto TXLP_I2C
 call BITIN_I2C
 retlw 0
;***********************************************
;*      RICEZIONE DI UN BYTE (tx buf)          *
;***********************************************
RX_I2C
 clrf dato_i2c
 movlw 8
 movwf count_i2c
 bcf STATUS,0
RXLP_I2C
 rlf  dato_i2c
 call  BITIN_I2C
 bcf dato_i2c,0
 btfsc eeprom,di
 bsf dato_i2c,0
 decfsz count_i2c
 goto RXLP_I2C
 bsf eeprom,do  ; invio ack = 1
 call BITOUT_I2C
 retlw 0
;***********************************************
;*      RITARDO SEGNALI                        *
;***********************************************
Ritardo_I2C
 movwf tempo_i2c + 1
ritlp_i2c_0
 movlw 247
 movwf tempo_i2c
RitLP_I2C
 decfsz tempo_i2c
 goto RitLP_I2C
 return
 decfsz tempo_i2c + 1
 goto  ritlp_i2c_0
 ENDM

ciao  fammi sapere se funziona
Grazie mille!! :)
