Vai al contenuto
PLC Forum


I2c & Ds1629


1achy

Messaggi consigliati

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


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

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

  • 4 weeks 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...