Vai al contenuto
PLC Forum


I2c & Pic


1achy

Messaggi consigliati

Salve ragazzi sto faccendo a botte per interfacciare un pic con i2c. Vorrei sapere dove prelevare qualcosa in italiano sui9 comandi del pic per gestire la i2c.

Stavo lavorando su :

ADDR EQU 0x20

TREG EQU 0x21

TVAL EQU 0x22

cifra1 EQU 0X23

cifra2 EQU 0X24

cifra3 EQU 0X25

DBYTE1 EQU 0x26

DBYTE2 EQU 0x27

NUMERO EQU 0x28

segno EQU 0x29

SOS EQU 0x2A

PARIN EQU 0x2B

PAROUT EQU 0x2C

RIT EQU 0x2D

RIT2 EQU 0x2E

APP EQU 0x2F

CONTA EQU 0x30

PROVV EQU 0x31

C_VIS EQU 0x32

begin:

movlw 0x7F

movwf PROVV

ciccio:

decfsz PROVV

goto tarda

goto configura

tarda:

call ritardo

goto ciccio

;-----------------------CONFIGURAZIONE------------------------------

configura:

BANKSEL ADDR

movlw 0x91

movwf ADDR ; indirizzo dello slave+read

;--------------------------------------

; configuro il PIC per agire come

; un master sul bus I2C

;--------------------------------------

BANKSEL SSPCON

movlw b'00101000'

movwf SSPCON ; modalita' I2C master

BANKSEL SSPCON2

; movlw 0x00

; movwf SSPCON2

BANKSEL SSPADD

movlw 0x09

movwf SSPADD ; I2C data rate: SSPADD=(FOSC/BR)/4-1=4E6/1E5/4-1=9

BANKSEL SSPSTAT

bcf SSPSTAT,CKE ; imposto i livelli I2C

movlw b'00011000' ; i pin RC3 e RC4 servono per l'I2C

movwf TRISC ; RC5, RC6,RC7 pilotano i trasnistors

BANKSEL SSPCON

bsf SSPCON,SSPEN ; seleziono I2C mode

; ***************LETTURA DELLA TEMPERATURA****************

inizio:

;.............................................................................

; START CONDITION

;.............................................................................

BANKSEL SSPCON2

bsf SSPCON2,SEN ; genero lo START

btfsc SSPCON2,SEN ; attendo che il bit SEN

goto $-1 ; torni a zero (fine START)

;.............................................................................

; INVIO SLAVE ADDRESS

;.............................................................................

BANKSEL SSPBUF ; invio l'indirizzo dello slave

movlw 0x91 ; 1001 000 1 ossia 0x90+1 di lettura

movwf SSPBUF

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

; BANKSEL SSPCON2

; btfsc SSPCON2,ACKSTAT

; goto $-1

;.............................................................................

; RICEZIONE PRIMO BYTE

;.............................................................................

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento di

goto $-1 ; di ricezione

BANKSEL SSPBUF ; salvo il primo byte

movfw SSPBUF

BANKSEL DBYTE1

movwf DBYTE1

BANKSEL SSPCON2

bcf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; il master da l'acknowledge

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento di ACK

goto $-1

;.............................................................................

; RICEZIONE SECONDO BYTE

;.............................................................................

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento di

goto $-1 ; ricezione

BANKSEL SSPBUF ; salvo il secondo byte

movfw SSPBUF

BANKSEL DBYTE2

movwf DBYTE2

BANKSEL SSPCON2

bsf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; noack

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento di ACK

goto $-1

;.............................................................................

; STOP

;.............................................................................

BANKSEL SSPCON2

bsf SSPCON2,PEN ; STOP BIT

btfsc SSPCON2,PEN ; attendo la fine dell'evento di STOP

goto $-1

BANKSEL SSPCON2

bsf SSPCON2,PEN ; STOP BIT

btfsc SSPCON2,PEN ; attendo la fine dell'evento di STOP

goto $-1

;******************************

; SUBROUTINE DI RITARDO

;******************************

ritardo:

BANKSEL PORTA

movlw 0xFF

movwf RIT2

movlw 0x12

movwf RIT2

rit_loop1:

decfsz RIT,1

goto rit_loop1

fine_rit:

return

rit_loop2:

decfsz RIT2,1

goto rit_loop2

goto rit_loop1

;********************************

; SUBROUTINE PER VISUALIZZAZIONE

; DL MESSAGGIO DI ERRORE

;*******************************

errore:

BANKSEL SSPCON2

bsf SSPCON2,PEN

btfsc SSPCON2,PEN

goto $-1

BANKSEL PORTA

movlw 0x73

movwf cifra1

movwf cifra3

movlw 0x60

movwf cifra2

return

;**********************************

; FINE

;**********************************

fine:

end

Ma non sono riuscito a leggere nulla dal bus i2c.Ho provato pure con il maestro di microchip il qusale crea direttamente i moduli di cui hai bisogno ma non sono riuscito a metterlo in opera. Per non farvi perdere tempo vorrei sapere dove reperire del materiale possibilmente in italiano per capire meglio interfacciamento fra un pic e un dispositivo i2c.

Salutoni

Link al commento
Condividi su altri siti


Un paio d'anni fa ho tribolato un po' per interfaciare un pic 16F876 con in a/d in SPI che è molto simile ad I2C. Il problema era causato dal non chiaro data sheet dell'a/d, perchè se usi le funzioni standard di SPI e di I2C del PIC non ci sono problemi.

Link al commento
Condividi su altri siti

Sto cercando di collegare un DS1629 sarebbe un termometro con calendario interno che communica tramite i2c

Leggendo il Datasheet per leggerne la temperatura dovrei seguire questa sequenza:

-- START Bus Master initiates a START condition

-- Bus Master sends DS1629 address; R/W = 0

ACK DS1629 generates acknowledge bit

-- Bus Master sends read temperature protocol

ACK DS1629 generates acknowledge bit

START Bus Master initiates a Repeated START condition

-- Bus Master sends DS1629 address; R/W = 1

ACK DS1629 generates acknowledge bit

-- DS1629 generates MSB of temperature

ACK Bus Master generates acknowledge bit

-- DS1629 generates LSB of temperature

-- NACK Master generates no-acknowledge bit

HO CERCATO DI REALIZZARLA CON

ADDR EQU 0x20

TREG EQU 0x21

TVAL EQU 0x22

cifra1 EQU 0X23

cifra2 EQU 0X24

cifra3 EQU 0X25

DBYTE1 EQU 0x26

DBYTE2 EQU 0x27

NUMERO EQU 0x28

segno EQU 0x29

SOS EQU 0x2A

PARIN EQU 0x2B

PAROUT EQU 0x2C

RIT EQU 0x2D

RIT2 EQU 0x2E

APP EQU 0x2F

CONTA EQU 0x30

PROVV EQU 0x31

C_VIS EQU 0x32

ADDW EQU 0x33

begin:

;......................................................................

.......

; INIZIO COMMUNICAZIONE I2C

;......................................................................

.......

;--------------------------------------

; configuro il PIC per agire come

; un master sul bus I2C

;--------------------------------------

BANKSEL SSPCON

movlw b'00101000'

movwf SSPCON ; modalita' I2C master

BANKSEL SSPCON2

; movlw 0x00

; movwf SSPCON2

BANKSEL SSPADD

movlw 0x09 ; usando un clock a 20mhz=fosc

e scegliendo una communicaz i2c a 100khz=br

movwf SSPADD ; I2C data rate:

SSPADD=(FOSC/BR)/4-1=20E6/1E5/4-1=9

BANKSEL SSPSTAT

bcf SSPSTAT,CKE ; imposto i livelli I2C

BANKSEL TRISB ; la portaB è di uscita per

movlw 0x00 ; pilotare i segmenti

movwf TRISB

movlw b'00011000' ; i pin RC3 e RC4 servono per

l'I2C

movwf TRISC ; RC5, RC6,RC7 pilotano i

trasnistors

BANKSEL SSPCON

bsf SSPCON,SSPEN ; seleziono I2C mode(attivo sda

e scl) ovvero setto ad 1 il bit SSPEN

; ***************LETTURA DELLA TEMPERATURA****************

inizio:

;......................................................................

.......

; START CONDITION

;......................................................................

.......

BANKSEL SSPCON2

bsf SSPCON2,SEN ; genero lo START

btfsc SSPCON2,SEN ; attendo che il bit SEN

goto $-1 ; torni a zero (fine START)

;......................................................................

.......

; INVIO SLAVE ADDRESS di scrittura 9F

;......................................................................

.......

BANKSEL SSPBUF ; invio l'indirizzo dello slave

movlw 0x9E ; 9E di scrittura

movwf SSPBUF

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

; BANKSEL SSPCON2

; btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack

dallo slave

; goto $-1

;......................................................................

.......

; INVIO COMMANDO SCITTURA AA allo slave

;......................................................................

.......

BANKSEL SSPBUF

movlw 0xAA ;metto valore AA nel W

movwf SSPBUF ;lo mando al sspbuf

btfss SSPCON,WCOL ;aspetto che sia trasmesso

retlw 000h

BANKSEL SSPCON2

btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack

dallo slave

goto $-1

;......................................................................

.......

; RESTART CONDITION

;......................................................................

.......

BANKSEL SSPCON2

bsf SSPCON2,SEN ; genero lo START

btfsc SSPCON2,SEN ; attendo che il bit SEN

goto $-1

;......................................................................

.......

; INVIO SLAVE ADDRESS DI LETTURA 9F

;......................................................................

.......

BANKSEL SSPBUF ; invio l'indirizzo dello slave

movlw 0x9F ; 9E

movwf SSPBUF

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

BANKSEL SSPCON2

btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack

dallo slave

goto $-1

;......................................................................

.......

; RICEZIONE PRIMO BYTE

;......................................................................

.......

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento

di

goto $-1 ; di ricezione

BANKSEL SSPBUF ; salvo il primo byte

movfw SSPBUF

BANKSEL DBYTE1

movwf DBYTE1

BANKSEL SSPCON2

bcf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; il master da l'acknowledge

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento

di ACK

goto $-1

;......................................................................

.......

; RICEZIONE SECONDO BYTE

;......................................................................

.......

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento

di

goto $-1 ; ricezione

BANKSEL SSPBUF ; salvo il secondo byte

movfw SSPBUF

BANKSEL DBYTE2

movwf DBYTE2

BANKSEL SSPCON2

bsf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; noack

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento

di ACK

goto $-1

;......................................................................

.......

; STOP

;......................................................................

.......

BANKSEL SSPCON2

bsf SSPCON2,PEN ; STOP BIT

btfsc SSPCON2,PEN ; attendo la fine dell'evento

di STOP

goto $-1

BANKSEL SSPCON2

bsf SSPCON2,PEN ; STOP BIT

btfsc SSPCON2,PEN ; attendo la fine dell'evento

di STOP

goto $-1

;......................................................................

.......

; FINE COMMUNICAZIONE I2C

;......................................................................

.......

goto inizio

;********************************

; SUBROUTINE PER VISUALIZZAZIONE

; DL MESSAGGIO DI ERRORE

;*******************************

errore:

BANKSEL SSPCON2

bsf SSPCON2,PEN

btfsc SSPCON2,PEN

goto $-1

BANKSEL PORTA

movlw 0x73

movwf cifra1

movwf cifra3

movlw 0x60

movwf cifra2

return

;**********************************

; FINE

;**********************************

fine:

end

che ne dite.

Il problema e che mi si blocca tutto ..... come potrei cercare il problema.....

Modificato: da 1achy
Link al commento
Condividi su altri siti

Io ho fatto dialogare dei PIC con delle eprom seriali e tra loro tramite il protocollo i2c. Però non ho usato la funzione i2c interna, l'ho fatta tramite software e funziona benissimo. Se vuoi qualche aiuto magari scrivimi, sul forum vengo di rado perchè sono molto occupato. Ciao!

Link al commento
Condividi su altri siti

grazie ragazzi........ infatti con i miei calcoli venivano di 2k ......... ora ho la certezza..... ora il pic legge i due byte ma penso che siano casuali visto che si alternano fra 0 , 127 ,255 (valori decimali)...boooooooooo

Link al commento
Condividi su altri siti

Era il medesimo problema che avevo riscontrato io usando lo SBI. Como ho scritto in precednza il problema è stato risolto una volta che sono riuscito a capire quello che non era scritto sul data sheet del costruttore del dispositivo interfacciato. In quel caso era un A/D converter della BB; ho risolto il problema confrontandolo con l'equivalente Maxim; si trattava solo di mettere a posto i tempi di atesa.

Link al commento
Condividi su altri siti

Il dispositivo che sto usando è ds1629 della dallas (maxim) . E' un termometro rtc overo con calendario. Tale dispositivo necesita di un quarzo esterno per il funziopnamento delle operazioni del calendaio, il mio dubbio e e (ed come ho potuto capire dal datasheet) che tale quarzo gestisca anche il clock dei registri interni.Infatti nel datahett dice :

"An external 32.768kHz clock crystal is required for RTC operation.

The crystal input is divided internally and buffered for use as a microcontroller clock."

ovvero che il quarzo serve per le operazioni di rtc e poi puo essere usato su un pin del dispositivo essendo bufferizzato anche per un mc.

un altro passo del datasheet è :

"• No External Components Required to Measure Temperature"

ovvero che non sarebbe necessario il quatrzo per le misure di temperatura.

ANDANDO AL SODO :

1) Io il quarzo non l'ho messo ;

2) Ho inserito sulla linea SDA ed SCL 2 resistenze da 2 ohm verso i 5v;

3)Il software DEFINITIVO ultimato per la lettura che a volte legge valori casuali (0 , 127 , 255) o si impalla nel loop di attesa è:

;----------------------------------------------

; LETTURA TEMPERATURA I2C di DS1629

; PIC16F877

;

; ACHILLE DI SANO 2003

;----------------------------------------------

;

;

;

;----------------------------------------------

include

cifra1 EQU 0X23

cifra2 EQU 0X24

cifra3 EQU 0X25

begin:

;-----------------------CONFIGURAZIONE------------------------------

;.............................................................................

; INIZIO COMMUNICAZIONE I2C

;.............................................................................

;--------------------------------------

; configuro il PIC per agire come

; un master sul bus I2C

;--------------------------------------

BANKSEL SSPCON

movlw b'00101000'

movwf SSPCON ; modalita' I2C master

BANKSEL SSPCON2

; movlw 0x00

; movwf SSPCON2

BANKSEL SSPADD

movlw 0x31 ; usando un clock a 20mhz=fosc e scegliendo una communicaz i2c a 100khz=br

movwf SSPADD ; I2C data rate: SSPADD=(FOSC/BR)/4-1=20E6/1E5/4-1=49 in hex =31

BANKSEL SSPSTAT

bcf SSPSTAT,CKE ; imposto i livelli I2C

BANKSEL TRISB ; la portaB è di uscita per

movlw 0x00 ; pilotare i segmenti

movwf TRISB

movlw b'00011000' ; i pin RC3 e RC4 servono per l'I2C

movwf TRISC ; RC5, RC6,RC7 pilotano i trasnistors

BANKSEL SSPCON

bsf SSPCON,SSPEN ; seleziono I2C mode(attivo sda e scl) ovvero setto ad 1 il bit SSPEN

; ***************LETTURA DELLA TEMPERATURA****************

inizio:

;.............................................................................

; START CONDITION

;.............................................................................

BANKSEL SSPCON2

bsf SSPCON2,SEN ; genero lo START

btfsc SSPCON2,SEN ; attendo che il bit SEN

goto $-1 ; torni a zero (fine START)

;.............................................................................

; INVIO SLAVE ADDRESS di scrittura 9F

;.............................................................................

BANKSEL SSPBUF ; invio l'indirizzo dello slave

movlw 0x9E ; 9E di scrittura

movwf SSPBUF

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

; BANKSEL SSPCON2

; btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack dallo slave

; goto $-1

;.............................................................................

; INVIO COMMANDO SCITTURA AA allo slave

;.............................................................................

BANKSEL SSPBUF

movlw 0xAA ;metto valore AA nel W

movwf SSPBUF ;lo mando al sspbuf

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

BANKSEL SSPCON2

btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack dallo slave

goto $-1

;.............................................................................

; RESTART CONDITION

;.............................................................................

BANKSEL SSPCON2

bsf SSPCON2,SEN ; genero lo START

btfsc SSPCON2,SEN ; attendo che il bit SEN

goto $-1

;.............................................................................

; INVIO SLAVE ADDRESS DI LETTURA 9F

;.............................................................................

BANKSEL SSPBUF ; invio l'indirizzo dello slave

movlw 0x9F ; 9E

movwf SSPBUF

BANKSEL SSPSTAT ; attendo la fine dell'evento

btfsc SSPSTAT,R_W ; di scrittura indirizzo slave

goto $-1

BANKSEL SSPCON2

btfsc SSPCON2,ACKSTAT ;aspetto finche non ricevo ack dallo slave

goto $-1

;.............................................................................

; RICEZIONE PRIMO BYTE

;.............................................................................

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento di

goto $-1 ; di ricezione

BANKSEL SSPBUF ; salvo il primo byte

movfw SSPBUF

BANKSEL DBYTE1

movwf DBYTE1

BANKSEL SSPCON2

bcf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; il master da l'acknowledge

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento di ACK

goto $-1

;.............................................................................

; RICEZIONE SECONDO BYTE

;.............................................................................

BANKSEL SSPCON2 ; metto il master in ricezione

bsf SSPCON2,RCEN

btfss SSPCON2,RCEN

goto errore

btfsc SSPCON2,RCEN ; attendo la fine dell'evento di

goto $-1 ; ricezione

BANKSEL SSPBUF ; salvo il secondo byte

movfw SSPBUF

BANKSEL DBYTE2

movwf DBYTE2

BANKSEL SSPCON2

bsf SSPCON2,ACKDT

bsf SSPCON2,ACKEN ; noack

btfsc SSPCON2,ACKEN ; attendo la fine dell'evento di ACK

goto $-1

;.............................................................................

; STOP

;.............................................................................

BANKSEL SSPCON2

bsf SSPCON2,PEN ; STOP BIT

btfsc SSPCON2,PEN ; attendo la fine dell'evento di STOP

goto $-1

;.............................................................................

; FINE COMMUNICAZIONE I2C

;.............................................................................

goto main

;********************************

; SUBROUTINE PER VISUALIZZAZIONE

; DL MESSAGGIO DI ERRORE

;*******************************

errore:

BANKSEL SSPCON2

bsf SSPCON2,PEN

btfsc SSPCON2,PEN

goto $-1

BANKSEL PORTA

movlw 0x73

movwf cifra1

movwf cifra3

movlw 0x60

movwf cifra2

return

;**********************************

; FINE

;**********************************

main

; PROGRAMMA DI VISUALIZZAZIONE dbyte1 e dbyte2

fine:

end

4) Sto cercando di capire i tempi di attesa... ma dove dovrei cercarli...... e inserirli ?

Ringrazio comunque tutti quelli che mi stanno aiutando sta cavolo di i2c mi sta faccendo impazzire, alla fine chi me lo fa fare....sara' la voglia di riuscirci ...alla fine speriamo che un giorno possa servirmi.... a

Link al commento
Condividi su altri siti

Infatti Livio grazie per il consiglio, credo che tu abbia perfettamentre ragione si traatta di un problema di sincronizzazione (tempi di attesa ) ... ma come devo provedere?

Link al commento
Condividi su altri siti

2-WIRE INTERFACE (-55°C to +125°C; 2.2V VDD 5.5V)

PARAMETER ------- SYMBOL----- CONDITION ----MIN ----TYP ---MAX UNITS NOTES

SCL Clock Period --------t1 ---------------------------2.5 µs

Data In Setup Time to

SCL High ------------------ t2 -------------------------100ns

Data Out Stable after

SCL Low------------------- t3 ---------------------------- 0 ns

SDA Low Setup

Time to SCL

Low (START)---------------t4----------------------------100 ns

SDA High Hold

Time After SCL

High (STOP)----------------t5 ----------------------------100 ns

Capacitance Load for

each Bus Line------------- Cb --------------------------------------------400 pF

Input Capacitance--------- CI------------------------ 5 pF

Crystal Capacitance-------- CC ----------------------12.5 pF

IRITARDI DA INSERIRE SONO QUELLI DA 100ns ? come si inseriscono e dove?

Link al commento
Condividi su altri siti

  • 1 month later...

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...