1achy Inserito: 2 agosto 2003 Segnala Share Inserito: 2 agosto 2003 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 0x20TREG EQU 0x21TVAL EQU 0x22cifra1 EQU 0X23cifra2 EQU 0X24cifra3 EQU 0X25DBYTE1 EQU 0x26DBYTE2 EQU 0x27NUMERO EQU 0x28segno EQU 0x29SOS EQU 0x2APARIN EQU 0x2BPAROUT EQU 0x2CRIT EQU 0x2DRIT2 EQU 0x2EAPP EQU 0x2FCONTA EQU 0x30PROVV EQU 0x31C_VIS EQU 0x32begin: movlw 0x7F movwf PROVVciccio: decfsz PROVV goto tarda goto configuratarda: 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 RIT2rit_loop1: decfsz RIT,1 goto rit_loop1fine_rit: returnrit_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 More sharing options...
Livio Orsini Inserita: 2 agosto 2003 Segnala Share Inserita: 2 agosto 2003 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 More sharing options...
1achy Inserita: 4 agosto 2003 Autore Segnala Share Inserita: 4 agosto 2003 (modificato) Sto cercando di collegare un DS1629 sarebbe un termometro con calendario interno che communica tramite i2cLeggendo 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 bitHO CERCATO DI REALIZZARLA CON ADDR EQU 0x20TREG EQU 0x21TVAL EQU 0x22cifra1 EQU 0X23cifra2 EQU 0X24cifra3 EQU 0X25DBYTE1 EQU 0x26DBYTE2 EQU 0x27NUMERO EQU 0x28segno EQU 0x29SOS EQU 0x2APARIN EQU 0x2BPAROUT EQU 0x2CRIT EQU 0x2DRIT2 EQU 0x2EAPP EQU 0x2FCONTA EQU 0x30PROVV EQU 0x31C_VIS EQU 0x32ADDW EQU 0x33begin:;.............................................................................; 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: 4 agosto 2003 da 1achy Link al commento Condividi su altri siti More sharing options...
1achy Inserita: 5 agosto 2003 Autore Segnala Share Inserita: 5 agosto 2003 Inoltre volevo sapere quale resistenza di pull-up consigliate sulla linea SDA per vdd di 5v. SUlla scl se ne puo' fare a meno? Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 5 agosto 2003 Segnala Share Inserita: 5 agosto 2003 Volevo sapere quale resistenza di pull-up consigliate sulla linea SDA per vdd di 5v. Link al commento Condividi su altri siti More sharing options...
bit Inserita: 6 agosto 2003 Segnala Share Inserita: 6 agosto 2003 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 More sharing options...
1achy Inserita: 7 agosto 2003 Autore Segnala Share Inserita: 7 agosto 2003 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 More sharing options...
Livio Orsini Inserita: 7 agosto 2003 Segnala Share Inserita: 7 agosto 2003 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 More sharing options...
1achy Inserita: 8 agosto 2003 Autore Segnala Share Inserita: 8 agosto 2003 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 0X23cifra2 EQU 0X24cifra3 EQU 0X25begin: ;-----------------------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 dbyte2fine: 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 More sharing options...
1achy Inserita: 8 agosto 2003 Autore Segnala Share Inserita: 8 agosto 2003 Un altra domanda ma la resistenza sulla linea SCL posso eliminarla? Io la toglerei che ne dite? Link al commento Condividi su altri siti More sharing options...
1achy Inserita: 8 agosto 2003 Autore Segnala Share Inserita: 8 agosto 2003 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 More sharing options...
1achy Inserita: 8 agosto 2003 Autore Segnala Share Inserita: 8 agosto 2003 2-WIRE INTERFACE (-55°C to +125°C; 2.2V VDD 5.5V)PARAMETER ------- SYMBOL----- CONDITION ----MIN ----TYP ---MAX UNITS NOTESSCL Clock Period --------t1 ---------------------------2.5 µsData In Setup Time toSCL High ------------------ t2 -------------------------100nsData Out Stable afterSCL Low------------------- t3 ---------------------------- 0 nsSDA Low SetupTime to SCLLow (START)---------------t4----------------------------100 nsSDA High HoldTime After SCLHigh (STOP)----------------t5 ----------------------------100 nsCapacitance Load foreach Bus Line------------- Cb --------------------------------------------400 pF Input Capacitance--------- CI------------------------ 5 pFCrystal Capacitance-------- CC ----------------------12.5 pF IRITARDI DA INSERIRE SONO QUELLI DA 100ns ? come si inseriscono e dove? Link al commento Condividi su altri siti More sharing options...
1achy Inserita: 12 agosto 2003 Autore Segnala Share Inserita: 12 agosto 2003 Qualcosa non va.... porca misseriaccia ho bruciato due pic16f877.... Link al commento Condividi su altri siti More sharing options...
1achy Inserita: 12 settembre 2003 Autore Segnala Share Inserita: 12 settembre 2003 nessuna dritta..... ancora non riesco a trovare i tempi giusti.... Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora