Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC16F84 & EEPROM I2C

Ciao a tutti,
so che l'oggetto di questo messaggio potrebbe sortire effetti indesiderati,
a causa dei vari pirati satellitari, ma non e' il mio caso.
Vorrei realizzare un dispositivo che mostri il Caller ID all'arrivo di una
telefonata, lo cerchi in una tabella gia "scritta" sulla EEPROM e, se
esiste, passi la chiamata, altrimenti la colleghi alla segreteria
telefonica.
La sezione dell'identificazione del chiamante l'ho gia teorizzata, adesso
vorrei un aiuto per interfacciare un PIC ad una EEPROM, ma per questo credo
bastino le Application Note della Microchip e, cosa piu importante,
realizzare un motore di ricerca sella EEPROM.
Spero qualcuno possa aiutarmi.
PaoloS
deus.m...@tin.it

 wrote in message
news:H0jU7.21293$o9.7...@news1.tin.it...

Premetto che non so utilizzare il protocollo I2cbus per interfacciare un pic ad
una
eeprom.
Per ricercare il dato sulla eeprom io faccio cosi: 
1) ogni informazione è contenuta in un numero definito di celle uguali per
tutti i dati;
2) a questo punto parto dal primo byte del dato che ho da confrontare e lo
confronto con la prima cella del
 primo dato; se sono uguali passo a confrontare la secondo byte e lo confronto
con la seconda cella dell' eeprom
3) se in dati sono diversi salto direttamente all'inizio del secondo pacchetto
di dati!
Spero di essere stato almeno un pochino chiaro... in ogni caso sono qui!
Ps se riesci ad interfacciare la eeprom potresti farmi vedere il listato? 
ciao!!! grazie
-- 
Posted from 
fulmine.adhoc.net
 [213.152.193.118] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 1) ogni informazione č contenuta in un numero definito di celle uguali per


 wrote in message
jqGU7.24560$o9.8...@news1.tin.it...
Per L'I2C vi posto delle routines in ASM che ho usato per leggere l'ora da
un RTC
Ho utilizzato PortA3 per il clock e PortA4 per i dati
ciao
Sergio
; Variabili
_N  res  1
I2C_BYTE res  1
I2C_LOOP res  1
; codice
;*****************************************************************
;* I2C
;*****************************************************************
I2C_IN_BYTE   ; read byte on i2c bus
  CLRF I2C_BYTE
  MOVLW .8
  MOVWF _N  ; set index to 8
  CALL I2C_HIGH_SDA ; be sure SDA is configured as input
I2C_IN_BIT
  CALL I2C_HIGH_SCL ; clock high
  BTFSS PORTA, 4  ; test SDA bit
  GOTO I2C_IN_ZERO
  GOTO I2C_IN_ONE
I2C_IN_ZERO
  BCF STATUS, C  ; clear any carry
  RLF I2C_BYTE, F  ; I2C_BYTE = I2C_BYTE << 1 | 0
  GOTO I2C_CONT_IN
I2C_IN_ONE
  BCF STATUS, C  ; clear any carry
  RLF I2C_BYTE, F
  INCF I2C_BYTE, F ; I2C_BYTE = (I2C_BYTE << 1) | 1
  GOTO I2C_CONT_IN
I2C_CONT_IN
  CALL I2C_LOW_SCL ; bring clock low
  DECFSZ _N, F  ; decrement index
  GOTO I2C_IN_BIT
  RETURN
;;;;;;
I2C_OUT_BYTE:    ; send I2C_BYTE on I2C bus
  MOVLW .8
  MOVWF _N
I2C_OUT_BIT:
  BCF STATUS,C  ; clear carry
  RLF I2C_BYTE, F  ; left shift, most sig bit is now in carry
  BTFSS STATUS, C  ; if one, send a one
  GOTO I2C_OUT_ZERO
  GOTO I2C_OUT_ONE
I2C_OUT_ZERO:
  CALL I2C_LOW_SDA ; SDA at zero
  CALL I2C_CLOCK_PULSE
  CALL I2C_HIGH_SDA
  GOTO I2C_OUT_CONT
I2C_OUT_ONE:
  CALL I2C_HIGH_SDA ; SDA at logic one
  CALL I2C_CLOCK_PULSE
  GOTO I2C_OUT_CONT
I2C_OUT_CONT:
  DECFSZ _N, F  ; decrement index
  GOTO I2C_OUT_BIT
  RETURN
;;;;;;
I2C_NACK:    ; bring SDA high and clock
  CALL I2C_HIGH_SDA
  CALL I2C_CLOCK_PULSE
  RETURN
I2C_ACK:
  CALL I2C_LOW_SDA
  CALL I2C_CLOCK_PULSE
  RETURN
I2C_START:
  CALL I2C_LOW_SCL
  CALL I2C_HIGH_SDA
  CALL I2C_HIGH_SCL
  CALL I2C_LOW_SDA ; bring SDA low while SCL is high
  CALL I2C_LOW_SCL
  RETURN
I2C_STOP:
  CALL I2C_LOW_SCL
  CALL I2C_LOW_SDA
  CALL I2C_HIGH_SCL
  CALL I2C_HIGH_SDA ; bring SDA high while SCL is high
  CALL I2C_LOW_SCL
  RETURN
I2C_CLOCK_PULSE:   ; SCL momentarily to logic one
  CALL I2C_HIGH_SCL
  CALL I2C_LOW_SCL
  RETURN
I2C_HIGH_SDA:    ; high impedance by making SDA an input
  BSF STATUS, RP0  ; bank 1
  BSF TRISA, 4  ; make SDA pin an input
  BCF STATUS, RP0  ; back to bank 0
  CALL I2C_DELAY_SHORT
  RETURN
I2C_LOW_SDA:
  BCF PORTA, 4
  BSF STATUS, RP0  ; bank 1
  BCF TRISA, 4  ; make SDA pin an output
  BCF STATUS, RP0  ; back to bank 0
  CALL I2C_DELAY_SHORT
  RETURN
I2C_HIGH_SCL:
  BSF STATUS, RP0  ; bank 1
  BSF TRISA, 3  ; make SCL pin an input
  BCF STATUS, RP0  ; back to bank 0
  CALL I2C_DELAY_SHORT
  RETURN
I2C_LOW_SCL:
  BCF PORTA, 3
  BSF STATUS, RP0  ; bank 1
  BCF TRISA, 3  ; make SCL pin an output
  BCF STATUS, RP0  ; back to bank 0
  CALL I2C_DELAY_SHORT
  RETURN
I2C_DELAY_SHORT:   ; provides nominal 25 usec delay
  MOVLW .5
  MOVWF I2C_LOOP
I2C_DELAY_SHORT_1:
  NOP
  DECFSZ I2C_LOOP, F
  GOTO I2C_DELAY_SHORT_1
  RETURN
; ESEMPIO
Read_RTC
  Call  I2C_START
                movlw 11010000B
  movwf I2C_BYTE
  call I2C_OUT_BYTE
  call I2C_NACK
                movlw   01h
  movwf I2C_BYTE
  call I2C_OUT_BYTE
  call I2C_NACK
  call I2C_STOP
  Call  I2C_START
                movlw 11010001B
  movwf I2C_BYTE
  call I2C_OUT_BYTE
  call I2C_NACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 01111111B
  call BCD_to_BIN
  movwf mi
  Call  I2C_ACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 00111111B
  call BCD_to_BIN
  movwf ho
  Call  I2C_ACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 00000111B
  call BCD_to_BIN
  movwf ww
  Call  I2C_ACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 00111111B
  call BCD_to_BIN
  movwf gg
  Call  I2C_ACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 00011111B
  call BCD_to_BIN
  movwf mm
  Call  I2C_ACK
  call I2C_IN_BYTE
  movf I2C_BYTE,W
  andlw 11111111B
  call BCD_to_BIN
  movwf aa
  Call  I2C_STOP
  return

 un RTC
GRAZIE MILLE!!!!! 
roberto


Anche da parte mia, grazie mille.
PaoloS