1achy Inserito: 25 ottobre 2003 Segnala Share Inserito: 25 ottobre 2003 Sto cercando invano di collegare un ds1629 (termometro i2c con calendario) a un pic 16F877a. Per adesso l'unico risultato è stato bruciare 3 pic .Il programma che ho realizzato si blocca in qualche punto, faccendo rimanere la linea SDA a 0 V .Se tolgo e rimetto alimentazione per 3-4 volte il programma a volte si sblocca e va avanti visualizzando sul dislpay numeri casuali. Da cosa puo' dipendere ..... allego il programma : goto INIT ;............................................................................. ; INIZIO FUNZIONI I2C ;............................................................................. ;............................................................................. ; START CONDITION ;............................................................................. ;=======Generate Start Bit Condition START BSF STATUS,RP0 ;SSPCON2: e nel Bank1 quindi seleziono bank1 (avrei potuto usare banksel) BSF SSPCON2,SEN I2C.Start.Wait BTFSC SSPCON2,SEN;Poll until end of start condition GOTO I2C.Start.Wait BCF STATUS,RP0 ;ripristino la selezione Bank0 RETURN ; torni a zero (fine START) ;............................................................................. ; ; RESTART ;............................................................................. ;=======Generate Start Bit Condition RESTART BSF STATUS,RP0 ;SSPCON2: is in Bank1 BSF SSPCON2,RSEN I2C.Restart.Wait BTFSC SSPCON2,RSEN ;Poll until end of restart condition GOTO I2C.Restart.Wait BCF STATUS,RP0 ;Restore Bank0 RETURN ;............................................................................. ; STOP ;............................................................................. ;=======Generate Stop Bit Condition STOP BSF STATUS,RP0 ;SSPCON2: is in Bank1 BSF SSPCON2,PEN I2C.Stop.Wait BTFSC SSPCON2,PEN;Poll until end of stop condition GOTO I2C.Stop.Wait BCF STATUS,RP0 ;Restore Bank0 RETURN ;............................................................................. ; TRASMISSIONE ;............................................................................. ;========================================== ; Quando I2C trasmete un byte ritorna ack nel W ; 1 - Acknowledge non ricevuto ; 0 - Acknowledge ricevuto ;========================================== ; Transmits a byte ;========================================== TX ;=======Transmit the value on W ;=======Moving a value to SSPBUF begins the transmission BCF PIR1 , SSPIF ;Clear the Interrupt Flag, this will be set at the end of the transmission MOVWF SSPBUF ;Move W to SSPBUF which will trigger the I2C module to begin transmitting ;=======Wait for I2C Transmit to complete BSF STATUS,RP0 ;SSPSTAT: is in Bank1 BTFSS SSPSTAT,BF ;CheckBufferIsActuallyFull GOTO I2C.TX.Error.ExpectedBufferFull BCF STATUS,RP0 ;Restore Bank0 I2C.TX.WaitForSSPInterrupt BTFSS PIR1,SSPIF GOTO I2C.TX.WaitForSSPInterrupt GOTO I2C.TX.Transmit.OK I2C.TX.Error.ExpectedBufferFull BCF STATUS,RP0;Restore Bank0 ;Insert Error Handling Here GOTO I2C.TX.Error.ExpectedBufferFull I2C.TX.Transmit.OK ;=======Test I2C ACK Result read from slave BSF STATUS,RP0 ;SSPCON2: is in Bank1 MOVLW .1 ;1 = Acknowledge was not received from slave BTFSS SSPCON2,ACKSTAT MOVLW .0 ;0 = Acknowledge was received from slave BCF STATUS,RP0 ;Restore Bank0 RETURN ;............................................................................. ; RICEZIONE ;............................................................................. RX ;=======Receive from I2C BCF PIR1,SSPIF ;Clear the interrupt flag before RX BSF STATUS,RP0 ;SSPCON2: is in Bank1 BSF SSPCON2,RCEN BCF STATUS,RP0 ;SSPCON2: is in Bank1 I2C.RX.WaitForSSPInterrupt BTFSS PIR1,SSPIF GOTO I2C.RX.WaitForSSPInterrupt MOVF SSPBUF,W RETURN ;............................................................................. ; MANDO ACK ;............................................................................. ACK ;=======ACK (Acknowledge) a Recieved Byte BCF PIR1,SSPIF ;Clear the interrupt flag before ACK BSF STATUS,RP0 ;SSPCON2: is in Bank1 BCF SSPCON2,ACKDT ;Clear ACKDT to Acknowledge Bit BSF SSPCON2,ACKEN ;Start Acknowledge Sequence BCF STATUS,RP0 ;SSPCON2: is in Bank1 I2C.ACK.WaitForEndSequence BTFSS PIR1,SSPIF ;Interrupt will be set at end of Acknowledge GOTO I2C.ACK.WaitForEndSequence RETURN ;............................................................................. ; MANDO NoACK ;............................................................................. NACK ;=======NACK (No Acknowledge) a Recieved Byte BCF PIR1,SSPIF ;Clear the interrupt flag before ACK BSF STATUS,RP0 ;SSPCON2: is in Bank1 BSF SSPCON2,ACKDT ;Set ACKDT to transmit an NACK Bit BSF SSPCON2,ACKEN ;Start Acknowledge Sequence BCF STATUS,RP0 ;SSPCON2: is in Bank1 I2C.NACK.WaitForEndSequence BTFSS PIR1,SSPIF ;Interrupt will be set at end of Acknowledge GOTO I2C.NACK.WaitForEndSequence RETURN ;............................................................................. ; TX RX INDIRIZZO ;............................................................................. ;======================================================== ; Sends the value on the Master Port (PortD) to the remote ; device on address ADDRESS ;======================================================== TransmitMyPort CALL START BCF ADDRESS,0 ;E un commando di scruttura quindi metto a 0 il bit meno significativo MOVF ADDRESS,W CALL TX ;Transmit the Address to establish a connection IORLW .0 ;Check that the expected acknowledge is received BTFSS STATUS,Z ;Expect 0 = Ack received GOTO TransmitMyPort.DeviceNotFound MOVF TXBYTE,W ;prendi il data da tramettere CALL TX ;lo mando CALL STOP RETURN TransmitMyPort.DeviceNotFound ;No device at the CALL STOP RETURN ;======================================================== ; Does a port exchange with the I2C device at address W ;======================================================== ReceiveRemotePort CALL START BSF ADDRESS,0 ;e una read ,quindi metto a 1 il Bit read/write MOVF ADDRESS,W CALL TX ;Transmit the Address to establish a connection IORLW .0 ;Check that the expected acknowledge is received BTFSS STATUS,Z ;Expect 0 = Ack received GOTO ReceiveRemotePort.DeviceNotFound CALL RX CALL NACK CALL STOP MOVF SSPBUF,W MOVWF PORTD RETURN ReceiveRemotePort.DeviceNotFound ;No device at the I2C Address CALL STOP RETURN ;======================================================== ; Does a port exchange with the I2C device at address W ;======================================================== doPortExchange MOVWF ADDRESS CALL TransmitMyPort CALL ReceiveRemotePort RETURN ;............................................................................. ; FINE FUNZIONI I2C ;............................................................................. INIT ;-----------------------CONFIGURAZIONE-i2c----------------------------- ;ritardo goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 ;ritardo ;========================================== ;Autogenerated configuration code PIC16F877 ;Config Wiz V0.1, www.virtualbreadboard.com ;========================================== ;======Begin PORT Configuration BSF STATUS, RP0;PORT TRIS Registers are on page 1 ;======PORT A MOVLW .63;PORTA Configuration Bits MOVWF TRISA ;======PORT B MOVLW .255;PORTB Configuration Bits MOVWF TRISB ;======PORT C MOVLW .255;PORTC Configuration Bits MOVWF TRISC ;======PORT D MOVLW .0;PORTD Configuration Bits MOVWF TRISD BCF STATUS, RP0;Restore Page0 ;========================================== ;Autogenerated configuration code PIC16F877 ;Config Wiz V0.1, www.virtualbreadboard.com ;========================================== ;=======I2C Master Mode Configuration MOVLW B'00101000' MOVWF SSPCON ;=======I2C Bit Rate Setup BSF STATUS,RP0;SSPADD is in Bank1 MOVLW 0x3F MOVWF SSPADD BCF STATUS,RP0;Restore Bank0 ;=======I2C Slew Rate Control BSF STATUS,RP0;SSPSTAT is in Bank1 BSF SSPSTAT,SMP BCF STATUS,RP0;Restore Bank0 ;=======SCL/SDA PIN DIRECTION SETUP BSF STATUS,RP0;TRISC is in Bank1 MOVLW B'00***000' ; setup value IORWF TRISC,F; SCL and SDA BCF STATUS,RP0;Restore Bank0 ;............................................................................. ; INIZIO COMMUNICAZIONE I2C ;............................................................................. ;ritardo goto $+1 ;ritardo MOVLW 0x9E MOVWF ADDRESS MOVLW 0xAA MOVWF TXBYTE CALL TransmitMyPort ;ritardo goto $+1 ;ritardo MOVLW 0x9F MOVWF ADDRESS CALL ReceiveRemotePort ;............................................................................. ; FINE COMMUNICAZIONE I2C ;............................................................................. Link al commento Condividi su altri siti More sharing options...
bit Inserita: 25 ottobre 2003 Segnala Share Inserita: 25 ottobre 2003 Non conosco la funzione i2c interna dei pic, ma ho comunque già utilizzato con successo dei pic per la gestione di bus i2c, sia tra loro che verso dispositivi a bus i2c come le eeprom seriali e il timekeeper 41T56.Semplicemente mi sono fatto tutto il controllo i2c via software!Utilizzavo un 16F84 che non ha la porta seriale i2c, poi passando al 16F876 ho mantenuto tutte le mie brave subroutine e non ho mai avuto problemi.Se vuoi posso mandarti le parti di programma che gestiscono il bus i2c, così puoi provarle....Un consiglio: se non vuoi bruciare i pic, metti una resistenza di basso valore in serie ai pin scl e sda del pic, in modo da limitare la corrente se il pic va in trasmissione e il periferico è cortocircuitato. Puoi usare due resistenze da 220 ohm in serie ad ogni pin, poi monti le resistenze di pull-up, un boun valore può essere 2,7 kohm.Ciao!!! Link al commento Condividi su altri siti More sharing options...
1achy Inserita: 27 ottobre 2003 Autore Segnala Share Inserita: 27 ottobre 2003 Bit ti ringrazio per la risposta esauriente, la prima cosa che faro' è usare la resistenza in serie per non bruciare i pic. Poi se puoi mandarmi le routine del i2c mi faresti un immenso piacere.achille[at]riardo.it Link al commento Condividi su altri siti More sharing options...
bit Inserita: 27 ottobre 2003 Segnala Share Inserita: 27 ottobre 2003 Ok! Te le mando in e-mail con le spiegazioni necessarie. Link al commento Condividi su altri siti More sharing options...
luciano Inserita: 28 ottobre 2003 Segnala Share Inserita: 28 ottobre 2003 scusami bit siccome queste routines interessano anche a meme le potresti postare ? ti ringrazio vivamente sea[at]ciaoweb.itciao luciano Link al commento Condividi su altri siti More sharing options...
Frank1313 Inserita: 21 novembre 2003 Segnala Share Inserita: 21 novembre 2003 Potete spedire anche a me le routine I2C.....grazie,sono disperato!!! 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