PIC16f84 + I2C + DS1624 ?
Masz problem? Zapytaj na forum elektroda.pl
From: "Tomasz Bednarz" <tb_at_nospam_internet.pl>
Subject: PIC16f84 + I2C + DS1624 ?
Date: Sun, 19 Jan 2003 22:05:55 +0100
Czy bawil sie ktos takim problemem ?
Mam procedurki I2C ktore dzialaja poprawnie z
PCF8574 ale za chiny z DS1624 nie chca dzialac :-(
A moze ktos ma jakes sprawdzone I2C prcedurki dla tego procka najlepiej
takie ktore beda sie petlily gdy nie ma ACK ze SLAVE
-- TB
From: "Tomasz Bednarz" <tb_at_nospam_internet.pl>
Subject: Re: PIC16f84 + I2C + DS1624 ?
Date: Tue, 21 Jan 2003 00:25:33 +0100
Problem rozwiazany
Znalazlem w sieci procedurki dla DS1621 a to podobny uklad do DS1624 >
http://www.phanderson.com/PIC/16C84/ds1621.html
Te procedurki dzialaja w przeciwiensteiw do tych od I2C z Ksiazki
wydawnictwa BTC! ::)
Te z BTC dzialja zas bezproblemowo z PCF8574 .... podejrzewam ze problem z
DS1624 dotyczyl wyczekiwania na ACK ....
From: "Tomasz Jabłoński" <tomasz.jablonski_at_nospam_ep.com.pl>
Subject: Re: PIC16f84 + I2C + DS1624 ?
Date: Tue, 21 Jan 2003 13:12:31 +0100
Użytkownik "Tomasz Bednarz" <tb_at_nospam_internet.pl> napisał w wiadomości
news:b0i0m0$394$1_at_nospam_portraits.wsisiz.edu.pl...
Problem rozwiazany
Znalazlem w sieci procedurki dla DS1621 a to podobny uklad do DS1624 >
http://www.phanderson.com/PIC/16C84/ds1621.html
Te procedurki dzialaja w przeciwiensteiw do tych od I2C z Ksiazki
wydawnictwa BTC! ::)
Te z BTC dzialja zas bezproblemowo z PCF8574 ....
Witam
ponieważ zostałem wywołany przez kolege do tablicy (w końcu to moje
procedurki) to odpowiem
W książce zostały zamieszczone procedury sekwencji start, stop, zapisywania
i odczytywania bajtów przez magistralę I2C. Każdy kto wykorzytywał tę
magistralę wie, że to tylko częśc rozwiązanego problemu - pozostaje jeszcze
warstwa "wyższa" czyli co i w jakiej kolejności ma się pojawić na magistrali
Skoro Koledze działało z PCF8574 to mniemam, że porcedury sekwencji startu,
stopu i transferu danych sa proawidłowe i problem tkwi gdzie indziej ...może
właśnie w warstwie wyższej ?, a jak mi wiadomo DS1624 nie był opisywany w
książce, bo wszak trudno opisywać wszystkie układy z I2C. Pozostało Koledze
mozolne wczytywanie się w dokumentację......
podejrzewam ze problem z
DS1624 dotyczyl wyczekiwania na ACK ....
też raczej nie.... bit potwierdzenia ACK jest 9-tym bitem odbieranym (lub
wysyłanym) w trakcie tramsferu bajtu i nie czeka się na niego jakoś
specjalnie. Być może chodziło Koledze o stan "wait"?.Jest to stan w który
Slave MOŻE (ale nie musi ) wejść po wysłaniu bitu potwierdzenia ACK(stan
niski wymuszny na linii SCL. Stan ten jest również uwzględniony w
procedurkach.
Z wielu postów jakie dostaję w związku z książką i nie tylko wynika że
szeregu błędów udałoby sie uniknąć gdyby czytelnicy uważniej czytali
wszystkie informacje zawarte w opracowanich. W wielu przypadkach nie
wystarcza przekopiować procedurkę do swojego programu i trąbić na lewo i
prawo NIE DZIAŁA!!!!. Ważne są procedury inicjalizacyjne, wartości rejestrów
po POR itp.
Procedury zamieszczone w książce i na serwerze wydawnictwa www.btc.pl były
szczegółowo sprawdzone z PCF8574, PCF8583 24c04 itp i działały bez
problemów.
Na koniec jeszcze jedna uwaga procedura i2xrxd wymaga by linia SDA była
linią portu PB0, w przeciwnym przypadku nie będzie działac. Jest to jednak
wyraźnie napisane (patrz rysunek 8.35)
Procedurę tę można łatwo zmodyfikować by usunąć tę drobną niedogodność -
można wtedy definiować dowolna linię jako SDA
--------------------------------------------------------------------
;podprogram odczytania bajtu ze SLAVE
;bajt odczytany umieszczony jest w TRdat
;bit potwierdzenia umieszczony jest w ACKF
;--------------------------------------------------------------------
i2crxd bsf RP0 ;bank1
bsf SDA ;SDA wejsciowy ->1
movlw .8
movwf bity ;licznik odbieranych bitow
bsf RP0 ;bank1
i2crx1 bsf SCL ;SCL wejsciowy ->1
bcf RP0 ;bank0
i2crx2 btfss SCL ;czy SCL osiąga 1(stan 'wait')
goto i2crx2
;W oryginale bylo tutaj rrf portb,w
bcf C ;c=0 ;W oryginale bylo tutaj rrf portb,w
btfsc SDA
bsf C
rlf TRdat,f
bsf RP0 ;bank1
bcf SCL ;SCL wyjściowy ->0
decfsz bity,f ;inkrementacja licznika bitów
goto i2crx1
btfsc ACKF ;ustawienie bitu potwierdzenia
bcf SDA ;SDA wyjsciowa ->0
bsf SCL ;SCL wejsciowa ->1
bcf RP0 ;bank0
i2crx3 btfss SCL ;czy SCL osiąga 1(stan 'wait')
goto i2crx3
bsf RP0 ;bank1
bcf SCL ;SCL wyjsciowy ->0
bcf RP0 ;bank0
return
Pozdrawiam
T.J.