Čidlo tlaku SMD500, komunikace přes I2C, kalibrace

Ahoj,
chtěl bych vás poprosit o pomoc, protože si nevím rady. Nyní se snažím přijít na kloub čidlu tlaku SMD500. Toto čidlo je od firmy BOSCH a obsahuje sběrnici I2C. Principem měření tohoto čidla je PIEZO sensor, který přes ADC převodník má vyslat svůj údaj. Tento údaj se má pote kalibrovat přes kalibrační koeficienty, jenž má SMD500 uloženo v paměti PROM.

Nejdříve si tedy pokouším tyto koeficienty vyčíst, což se mi daří celkem úspěšně (jsou velice podobné příkladovým hodnotám z DS), nicméně když se pokouším vyčíst údaj z převodníku ADC, dostanu hodnotu 11111111 10000000, což je nesmyslné číslo, které se opět vůbec nemění. Sběrnici po každém ACK uvolňuji, čidlo rozumí příkazům (posílá ACKy) a když odpojím krystalový oscilátor, jenž taktuje ADC, tak se objeví samé nuly (což by mělo být v pořádku, poněvadž ADC není taktován).

Obávám se, že je čidlo rozbité, pokud nedělám nějakou obr pitomost :frowning: Přikládám muj ASM soubor, muzete mi prosim nekdo poradit?

Diky moc

:arrow_right: administrator: přejmenováno z “Cidlo tlaku SMD500”
cidloSMD500.asm (5.72 KB)

Tak jsem to zkousel nejak predelat a opravdu nevim, kde by mohla byt chyba. Doba SCL=1 je 7us, SCL=0 je 10us, tzn. ze se do parametru I2C vejdu v pohode.
Jediny co me napada, je, ze cidlo chce nejdriv vycist koeficienty a pote hned udaj z prevodniku, ale je to dost pochybny.
Pritom cidlo posila ACK hned pri prvnim adresovani, tzn. ze v zapisu na I2C by chyba byt nemela.
Kdyz ctu ze sbernice, tak nejdriv vezmu bit z I2C presunu do C a zarotuju zasobnikem. Dam puls na SCL a toto opakuju 8x.Poté uvolnim sbernici, dam ACK, jestlize jde o 1.cteny BYTE, jinak necham sbernici uvolnenou a potvrdim pulsem na SCL.
Nevidite nekdo nejakou chybu? Budu moc vdecny za jakoukoliv pripominku…
Diky

Koukals na str.9 na způsob čtení výsledku AD?
Je tam nejprve “prázdný zápis” na nastavení adresy registru a hned na to restart komunikace, tentokrát ovšem jako čtení. Máš toto správně?

Ja mylim, že ano… Toto je cast kodu z hlavni smycky…

    call	START
mov	A,#0EEh
call	ZAPISI2C

mov	A,#0F6h		;Adresa registru hodnoty UP
call	ZAPISI2C	        ;Zapis read registru

call	START		;RESTART

mov	A,#0EFh
call	ZAPISI2C	        ;Zapis ADRESY MODULU-Cteni

clr	poslednibyte
    call	READSMD
mov	P_H,A
setb	poslednibyte
call	READSMD
mov	P_L,A
call	STOP

A toto jsou subrutiny, jenz jsou volany…

ZAPISI2C:
mov R7,#8
DALSBIT:
rlc A ;rotuj bit do C
mov SDA,C ;vystav bit ACC.7 na SDA

setb 	SCL		        ;SCL=1 Hodiny
mov 	B,#CEKANI	
djnz 	B,$
clr 	SCL		        ;SCL=0
mov 	B,#CEKANI	
djnz 	B,$

djnz 	R7,DALSBIT	;další bit?
setb 	SDA		        ;uvolneni sbernice pro ACK

setb 	SCL		        ;SCL=1 Hodiny ACK
mov 	B,#CEKANI	
djnz 	B,$
jb	SDA,$
clr 	SCL		         ;SCL=0
mov 	B,#CEKANI	
djnz 	B,$

RET

READSMD:
mov R7,#8
MSB: mov C,SDA
rlc A

setb 	SCL		        ;SCL=1 Hodiny
mov 	B,#CEKANI	
djnz 	B,$
clr 	SCL		        ;SCL=0
mov 	B,#CEKANI	
djnz 	B,$	

djnz 	R7,MSB
setb	SDA
jb	poslednibyte,JEPOSL
clr	SDA		        ;ACK

JEPOSL:
setb SCL ;SCL=1 Hodiny
mov B,#CEKANI
djnz B,$
clr SCL ;SCL=0
mov B,#CEKANI
djnz B,$

setb	SDA
ret

Je to takhle mozne?

Hlavně mě zaráží, že když přečtu správně (alespoň doufám, hodnoty F1-F4 se podobají katalogovým hodnotám), že by byla chyba ve čtení, protože jak říkáš, dám prázdný zápis, kde nastavím adresu registru čtení, třeba F8 a vyčtu pohodlně F1. Opravdu nevim, co s tim je.

Tak čidlo bylo špatné. Dostal jsem jiné a to bezi. Tak kdyby to nekomu delalo tu samou chybu, at vi o co jde:-)