Fórum témák
» Több friss téma |
LM75 hőmérő IC-t használok jó ideje BS2SX mikrovezérlővel. Most úgy alakult, hogy LM75A -IC-t kaptam. Ugyan úgy bekötöm, de ezzel nem működik. Ugyan azt az értéket küldi változatlanul, de minden bekapcsoláskor más az érték. (mindent lecseréltem már, akkor sem megy).
Mi lehet a gond? Szerintem valahogy másképp kell programozni...? Tud valaki segíteni? Hátha kiszúrná valaki a hibát, ami elkerülte a figyelmemet. Íme a program: ' {$STAMP BS2sx} ' BS2SX mikrokontrollert használunk ' {$PBASIC 2.5} ' A 2.5-ös nyelv utasításait használjuk I2CSCL CON 12 I2CSDA CON 13 I2CBuff VAR Byte I2CCommand VAR Byte I2CData VAR Byte I2CDA VAR Byte Reg_hi VAR Byte ' A felső regiszter Reg_lo VAR Byte ' Az alsó regiszter Buffer VAR Byte ' Ebben tároljuk majd az ideiglenes adatokat ' ------------------------------------ ujra: GOSUB Register_Read DEBUG "Homerseklet: ", DEC Reg_hi, " ", DEC Reg_lo, CR PAUSE 500 GOTO ujra ' --------------------------------------------------------------------------------------- Register_Read: GOSUB I2C_Start Buffer = %10010010 ' Slave address: 1001, Az LM75 címe:001, Írási művelet: 0 GOSUB I2COutByte ' Kiküldjük a Buffer értékét Buffer = %00000000 ' Pointer beállítása:az utolsó 2 bit:00 => hőmérséklet-leolvasás GOSUB I2COutByte ' Kiküldjük a Buffer értékét GOSUB I2C_Start ' Restart következik, mivel egy újabb címet küldünk. Buffer = %10010011 ' Slave address: 1001, Az LM75 címe:001, Olvasási művelet: 1 GOSUB I2COutByte ' Kiküldjük a Buffer értékét GOSUB I2CInByte ' Beolvasunk egy byte-ot, és Reg_hi=Buffer ' elmentjük azt a Reg_hi - ban. LOW I2CSDA ' Nyugtázik, hogy vettük az adatot. Ack-jel: I2CSDA alacsony. HIGH I2CSCL ' Ezt egy órajelciklussal kivisszük: Először 1-re majd LOW I2CSCL ' 0-ra állítjuk az SCL-vonalat. GOSUB I2CInByte ' Beolvasunk egy újabb byte-ot, Reg_lo=Buffer ' s ezt a Reg_lo - ban tároljuk. HIGH I2CSDA ' Mivel mind a két regiszter olvasása megörtént, nem küldünk HIGH I2CSCL ' Ack jelet az LM75-nek. LOW I2CSCL ' GOSUB I2C_Stop ' STOP állapotba térünk át... RETURN ' --------------------------------------------------------------------------------------- I2C_Start: ' A hőmérő STOP állapotának megszakítása. OUTPUT I2CSDA ' Az I2CSDA vonalat és OUTPUT I2CSCL ' az I2CSCL vonalat is kimenetre állítjuk. PAUSE 300 ' A két egymást követő mérés között várunk HIGH I2CSDA ' Mindkét vonalat magas szintre állítjuk. Ha az IC STOP állapotban HIGH I2CSCL ' volt, akkor eddig is magasak voltak, ami nem baj... LOW I2CSDA ' A START állapot előállításához előbb az SDA, LOW I2CSCL ' majd az I2CSCL vonalakat állítjuk 0-ra. RETURN ' --------------------------------------------------------------------------------------- I2C_Stop: ' Az I/O műveletek vége után a STOP állapotba váltunk OUTPUT I2CSDA ' Az I2CSDA vonalat kimenetre állítjuk HIGH I2CSCL ' Az I2CSCL vonalat, majd pedig HIGH I2CSDA ' az I2CSDA vonalat is 1 re állítjuk. RETURN ' --------------------------------------------------------------------------------------- I2CInByte: ' Egy byte beolvasása I2C-n SHIFTIN I2CSDA, I2CSCL, MSBPRE, [Buffer] ' Az I2C-n érkező adatok Buffer-be mentése OUTPUT I2CSDA ' Az I2CSDA vonalat kimenetre állítjuk, hogy Ack jelet küldhessünk RETURN ' --------------------------------------------------------------------------------------- I2COutByte: ' Egy byte kiküldése I2C-n SHIFTOUT I2CSDA, I2CSCL, MSBFIRST, [Buffer] ' A Bufferben tárolt byte kiküldése I2C-n LOW I2CSDA ' I2CSDA vonalat 0-ra állítjuk INPUT I2CSDA ' Bemenetre váltunk, mert az IC Ack jelet fog adni HIGH I2CSCL ' Előállítunk egy órajelciklust LOW I2CSCL ' 1-re, majd 0-ra állítjuk az órajel-vonalat RETURN
Töltsd le mindkét adatlapot és hasonlítsd össze , majd a különbségek megmutatják mit kell változtatnod a programon
Azon már túl vagyok! Összehasonlítottam. Nem látok különbséget.
Csak majd a beolvasott adatot kell máshogy átszámítani. De attól még a beolvasott adatnak változnia kellene a hőmérsékletre...
Kell még egy harmadik is: I2C Bus Specification
Mekkora sebességgel megy az a BS2SX? Mennyi idő telik el pl. az I2C_START subrutinben a HIGH I2CSCL és a LOW I2CSDA között? A sopecifikáció szerint standard módban min. 4 .. 4.7uS -nek kell lennie az SCL magas ill. alacsony szint idejének, min. 4.7 us -nak a START előkészítési idejének,...
Nem túl gyors, a 1 wire IC-ket nem is tudom vele kiolvasni...
A régi LM75 IC-ket a fenti program gond nélkül olvassa. Csak az LM75A (kínából rendelteket) nem. Most betettem minden sor elé egy 10 mS -os késleltetést. Az LM75 továbbra is megy az LM75a továbbra sem... Kiír két számot és az változatlanul marad...
Te, ez mér!
Ha bekapcsolom 21 192 -őt ír ki. Ha ráteszem az ujjamat akkor 26 160 -at. hagyom lehülni, megint 21 192 -őt. Csak nem mér újra a működése alatt. Mondom én, hogy szoftveres gond van, valamit másképp kell az A szériánál... De vajon mit? Tehát nem csinál újabb mérést a működése alatt.
Megvan!
A két kiolvasás és a stop között maradt ez: HIGH I2CSDA HIGH I2CSCL LOW I2CSCL Kiszedtem és működik! Érdekes, hogy az LM75 eltűrte a dolgot, de az A már nem... Köszönöm aki foglalkozott vele!
Sziasztok!
Csak az lenne a kérdésem, hogy az LM75-ből kiolvasott adatokból hogyan lesz valós kijelezhető decimális érték. A pozitív mérési adatokkal még csak tudnék valamit kezdeni, csak a negatív értékek átváltását nem értem. Lásd: LM75-ös adatlapján a 12. oldalon a táblázatot. ( Link. )
Nem tudom, válasz-e a kérdésedre, de ha jól megnézed, a negatív hőmérsékletek legfelső bitje 1.
Ezt levágod, megjegyzed "-" előjelnek, a maradék 8 bitet meginvertálod, hozzáadsz 1-et, és máris megvan az eredmény. Innentől azonos a dolog a pozitív értékekkel. Ezt kérdezted? A hozzászólás módosítva: Dec 25, 2018
|
Bejelentkezés
Hirdetés |