Sehnal jsem si teplotní čidlo MCP9800A0 a mám problém se čtením teploty s 16F877A. Komunikace funguje, data se s čidla vyčtou, ale po nějaké době se komunikace zhroutí a v PIE2 mi to hlásí kolizi na sběrnici, ale při tom to třeba 20 minut měřilo normálně.
V čidle chyba není, připojil jsem ho k PC přes LPT a meřilo to celou noc a bez problému.
Může mi někdo poradit, co se má správně udělat při kolizi na sběrnici nebo co mám špatně v programu?
[code]ReadTemp_4
banksel PIR2
bcf PIR2,BCLIF ; vymazat priznak kolize
;StartI2C
banksel PIR1
bcf PIR1,SSPIF ; vznulovat priznak dokonceni
banksel SSPCON2
bsf SSPCON2,SEN ; send i2c START [S] bit
banksel PIR2
btfsc PIR2,BCLIF ; doslo ke kolizi
goto $-12 ; Ano - znova START I2C
banksel PIR1 ;
btfss PIR1,SSPIF ; donkoncen START?
goto $-7 ; NE, tak pockat a testovat kolizi
;AdresaI2C write
banksel PIR1 ; START odeslan, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPBUF ;
movlw b’10010000’ ; adresa + WRITE do
movwf SSPBUF ; registru odesilani
banksel PIR1 ; dokonceno ?
btfss PIR1,SSPIF ; vcetne ACK od cidla?
goto $-1 ; NE, tak pockat a testovat a cekat
;Config
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPBUF
movlw b’00000000’ ; zapsat 0x00, cteni teploty
movwf SSPBUF ; zapsat do registru odesilani
banksel PIR1 ; dokonceno ?
btfss PIR1,SSPIF ; vcetne ACK od cidla?
goto $-1 ; NE, tak pockat a testovat a cekat
;Config
;Dalsi StartI2C
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPCON2 ;
bsf SSPCON2,RSEN; opakovany START,
banksel PIR1 ;
btfss PIR1,SSPIF ; dokonceno ?
goto $-1 ; NE, tak pockat a testovat a cekat
;Config
;AdresaI2C read
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPBUF
movlw b’10010001’ ; adresa + READ do
movwf SSPBUF ; registru odesilani
banksel PIR1 ; dokonceno ?
btfss PIR1,SSPIF ; vcetne ACK od cidla?
goto $-1 ; NE, tak pockat a testovat a cekat
;Prijem_I2C
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPCON2 ;
bsf SSPCON2,RCEN; zapnout prijem
banksel PIR1 ;
btfss PIR1,SSPIF ; precteno?
goto $-1 ; NE, tak pockat a testovat a cekat
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPBUF ;
movf SSPBUF,w ; precist bufer
movwf TeplotaH ; do nizsiho
banksel SSPCON2
bcf SSPCON2,ACKDT ; vyslat AKC
bsf SSPCON2,ACKEN ; nastavit odeslani ACK
btfss SSPCON2,ACKEN ; odeslan?
goto $-1
banksel PIR1 ; dokonceno ?
btfss PIR1,SSPIF ; vcetne ACK do cidla?
goto $-1 ; NE, tak pockat a testovat a cekat
;Prijem_I2C
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPCON2 ;
bsf SSPCON2,RCEN; zapnout prijem
banksel PIR1 ;
btfss PIR1,SSPIF ; precteno?
goto $-1 ; NE, tak pockat a testovat a cekat
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPBUF ;
movf SSPBUF,w ; precist bufer
movwf TeplotaL ; do nizsiho
banksel SSPCON2
bsf SSPCON2,ACKDT ; nevyslat AKC
bsf SSPCON2,ACKEN ; nastavit odeslani ACK
btfss SSPCON2,ACKEN ; odeslan?
goto $-1
banksel PIR1 ; dokonceno ?
btfss PIR1,SSPIF ; vcetne ACK do cidla?
goto $-1 ; NE, tak pockat a testovat a cekat
;StopI2C
banksel PIR1 ; Data odeslana, jinak bych sem nedosel
bcf PIR1,SSPIF ; vynulovat priznak operace
banksel SSPCON2
bsf SSPCON2,PEN ; odeslat STOP
banksel PIR1
btfss PIR1,SSPIF ; odeslan
goto $-1 ; ne
return ; navrat
[/code]