2db I2C busz lekérdezése egyszerre.

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

2db I2C busz lekérdezése egyszerre.

Hozzászólás Szerző: gerry »

szia Robert!

Szeretnék építeni egy termosztátot, ami majd kapcsolja a kazánunkat, meg a keringetőszivatyút.

Van egy alap kapcsolásom, ami egy DS1620-as I2c buszos hőszenzort olvas ki.

Ezzel semmi gond nincs, mert megadom neki a be és kikapcsolási hőmérséklet értéket és az egyik port lábbal vezérlem a kazánt.

De nekem kéne egy másik szenzort is olvasnom amivel a keringető szivattyút vezérlem, mert amíg van a rendszerben forróvíz addig nyugottan keringethetné, aztán meg lekapcsol, ha lehül

itt az alap program, ezt írnám át.

Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Th As Byte
Dim Tl As Byte
Dim Confg As Byte
Dim Count As Byte
Dim Slope As Byte

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.7 , Rs = Portb.6

Config Lcd = 16 * 2

Deflcdchar 0 , 14 , 17 , 17 , 17 , 14 , 32 , 32 , 32 'degree
Deflcdchar 1 , 4 , 14 , 31 , 32 , 32 , 32 , 32 , 32 'up
Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 31 , 14 , 4 'down
Deflcdchar 3 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32 'equal

Config Sda = Portd.1
Config Scl = Portd.0

Cls
Cursor Off

'write TH
I2cstart
I2cwbyte &H90
I2cwbyte &HA1
I2cwbyte 25
I2cstop
'--------------
'write TL
I2cstart
I2cwbyte &H90
I2cwbyte &HA2
I2cwbyte 20
I2cstop
'--------------
'read TH
I2cstart
I2cwbyte &H90
I2cwbyte &HA1
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Th , Nack
I2cstop
'--------------
'read TL
I2cstart
I2cwbyte &H90
I2cwbyte &HA2
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tl , Nack
I2cstop
'--------------
'read config
I2cstart
I2cwbyte &H90
I2cwbyte &HAC
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Confg , Nack
I2cstop
'--------------
Goto Loop
'read counter
Readcnt:
I2cstart
I2cwbyte &H90
I2cwbyte &HA8
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Count , Nack
I2cstop
Return
'--------------
'read slope
Readslp:
I2cstart
I2cwbyte &H90
I2cwbyte &HA9
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Slope , Nack
I2cstop
Return
'--------------

Loop:

'start convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'-------------
'read temperature
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
'read config
I2cstart
I2cwbyte &H90
I2cwbyte &HAC
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Confg , Nack
I2cstop
'--------------


Wait 1

If Templsb = 128 Then Templsb = 5 Else Templsb = 0
Locate 1 , 1
Lcd "**** " ; Tempmsb ; "," ; Templsb ; Chr(0) ; "C" ; " ****"
Locate 2 , 1
Lcd "L=" ; Tl ; " " ; "H=" ; Th ; " "
Locate 1 , 12
If Confg = 8 Then Lcd Chr(3)
If Confg = 72 Then Lcd Chr(1)
If Confg = 104 Then Lcd Chr(2)

Goto Loop

Meg lehet azt csinálni, hogy kiolvassa a második szenzort is vagy ne bonyolítsam túl, értem azt, hogy adok neki egy időzítést, hogy 20 perc múlva kapcsoljon ki aztán kész!

gerry
Robert

Hozzászólás Szerző: Robert »

Ha a 2 szenzornak más az I2C buszon a címe, akkor megoldható. Épp ez az I2C busz lényege.

Mintha itt a 90-es címen lenne...


Én hasonlót akarok most (ablak belső és külső hőfokregisztálás (mintapélda) és ot két I2C-s TCN75-s IC van a buszon. Különbözőa kettő címe. Én a két mérést javasolnám mindenképp, mert hideg illetve fagyos időben más a hűlési állandó....
És ha már olyanod van, akkor beépítenék egy olyat hogy napi ill heti hőprogram, illetve regisztrálni is fogyasztást hőfokot, miegyebet:))
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

Hozzászólás Szerző: gerry »

Szia Robert!

Vettem DS1621s tip hőszenzort, ami smd tok.
Ez ugyanaz mint a sima DS1621, és az"s" jelöli, hogy SMD.
Robert

Hozzászólás Szerző: Robert »

En a TCN75-s chippel játszom, hasonlóan az előzőhöz, ez is hőmérőchip és SMD:). Az I2C busz max 10 m lehet biztonsággal (illetve lejjebb véve a sebességet lehet nagyobb is).
Ki fofom próbálni mit szól a 20 m árnyékolt kábelhez és a 10kHz-s buszsebességhez:)

Appnotes a DS1631/1621 chiphez:
http://pdfserv.maxim-ic.com/en/an/app176.pdf


Mondjuk az 1 sec mérési időre vigyázz az adatlap szerint!
Robert

Hozzászólás Szerző: Robert »

A Wait 1 a programodban a 9 bites felbontás esetén igaz csak. Én kicsit ráhagynék, az adatlapja a hőmérőnek ír 1 sec mérési időről. Ennyire csak nem kritikus a mérés....

Valamint kell 1 secenként mérni? Én valamiféle szubrutinos dologba raknám be, hogy a


- főprogram fut
- mérés kell, megszakít a program, mérésindítás jel kiküld
- főprogramba vissza
- 1.1 sec letelt? ->mérés eredmény beolvasás
- főprogram, 1. pont....

Így a chipben a beállítást, regisztrálást egyebeket tudsz ezidő alatt vinni....
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

Hozzászólás Szerző: gerry »

Mondjuk azt nem értem, hogy minek kell ekkora program a szenzor beállításához, kiolvasásához, beállításához.
Mert láttam több programot is ami ilyen hőmérséklet szenzort használ de sokkal rövidebb a progija.

itt van egy, ami szegmens kijelzőhöz van és rövid, pedig a kijelzést is vezérli.

Dim Digit1 As Byte
Dim Digit2 As Byte
Dim N As Byte
Dim Teller As Byte
Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Confg As Byte
Dim Count As Byte
Dim Slope As Byte

Const Display1 = &B00000100
Const Display2 = &B00001000

Declare Sub Convert(number As Byte)
Declare Sub Readtemp(tempmsb As Byte)

Config Portb = Output
Config Portd = Output

Config Sda = Portd.1
Config Scl = Portd.0


Loop:
Call Readtemp(tempmsb)
For Teller = 1 To 20
Call Convert(tempmsb)
Waitms 5
Next Teller
Goto Loop
End 'end program

Digits:
Data &H02 , &H9E , &H24 , &H0C , &H98 , &H48 , &H40 , &H1E , &H00 , &H08


Sub Readtemp(tempmsb As Byte)

'start convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'-------------

'read temperature
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
End Sub Readtemp


Sub Convert(number)
N = Number Mod 10
Digit1 = Lookup(n , Digits)
Portd = Display1
Portb = Digit1
Waitms 5

N = Number \ 10
Digit2 = Lookup(n , Digits)
Portd = Display2
Portb = Digit2
Waitms 5

Portd = 0

End Sub Convert

Más:

Kipróbáltam a megszakítást is a 4 digites kijelzőmnél, de nem boldogulok vele.

Csináltam egy kijelzési ciklust, ami kiírja a szegmensekre egymás után a számokat, eddig jó. Az INT0 és INT1 lábakra csináltam meg a megszakítást.
Most csak azt próbáltam ki, hogy ha a kijelzőn világítanak a számok pl.: 0000, akkor, ha megnyomom a gombot megszakad a folyamatos kijelzés az egyik szám felvillan, ahol éppen járt a kijelzés és utána ment minden rendesen. Ez valahogy nem úgy működik, ahogy elképzeltem.

Én azt szeretném, hogy a számok folyamatosan világítsanak és gombnyomásra se szakadjon meg a folyamat.
De ha berágok teszek erre is egy LCD kijelzőt!
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

Hozzászólás Szerző: gerry »

Mondjuk azt nem értem, hogy minek kell ekkora program a szenzor beállításához, kiolvasásához, beállításához.
Mert láttam több programot is ami ilyen hőmérséklet szenzort használ de sokkal rövidebb a progija.

itt van egy, ami szegmens kijelzőhöz van és rövid, pedig a kijelzést is vezérli.

Dim Digit1 As Byte
Dim Digit2 As Byte
Dim N As Byte
Dim Teller As Byte
Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Confg As Byte
Dim Count As Byte
Dim Slope As Byte

Const Display1 = &B00000100
Const Display2 = &B00001000

Declare Sub Convert(number As Byte)
Declare Sub Readtemp(tempmsb As Byte)

Config Portb = Output
Config Portd = Output

Config Sda = Portd.1
Config Scl = Portd.0


Loop:
Call Readtemp(tempmsb)
For Teller = 1 To 20
Call Convert(tempmsb)
Waitms 5
Next Teller
Goto Loop
End 'end program

Digits:
Data &H02 , &H9E , &H24 , &H0C , &H98 , &H48 , &H40 , &H1E , &H00 , &H08


Sub Readtemp(tempmsb As Byte)

'start convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'-------------

'read temperature
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
End Sub Readtemp


Sub Convert(number)
N = Number Mod 10
Digit1 = Lookup(n , Digits)
Portd = Display1
Portb = Digit1
Waitms 5

N = Number \ 10
Digit2 = Lookup(n , Digits)
Portd = Display2
Portb = Digit2
Waitms 5

Portd = 0

End Sub Convert

Más:

Kipróbáltam a megszakítást is a 4 digites kijelzőmnél, de nem boldogulok vele.

Csináltam egy kijelzési ciklust, ami kiírja a szegmensekre egymás után a számokat, eddig jó. Az INT0 és INT1 lábakra csináltam meg a megszakítást.
Most csak azt próbáltam ki, hogy ha a kijelzőn világítanak a számok pl.: 0000, akkor, ha megnyomom a gombot megszakad a folyamatos kijelzés az egyik szám felvillan, ahol éppen járt a kijelzés és utána ment minden rendesen. Ez valahogy nem úgy működik, ahogy elképzeltem.

Én azt szeretném, hogy a számok folyamatosan világítsanak és gombnyomásra se szakadjon meg a folyamat.
De ha berágok teszek erre is egy LCD kijelzőt!
Robert

Hozzászólás Szerző: Robert »

Az I2C busz bizgetése is a interrupt alatt történik, fogadjunk:)

Amúgy a kijelző hogy ne vibráljon (ha időosztással több 7szegmensest vezérelsz, legalább 16Hz/kijelzővel kell menni. Ez 4 digit esetén 16*4 ~ 75Hz.
Ezt én a timerre raknám hogy _mindenképp_ ne szakadjon meg (ugyis 1 port állítás, így gyors lehet. Az interrupt részen csak 1 bitet billentenék be (jelzőbit) amit a fő programmagban le lehetne kezelni....

Az I2C esetén az ack után 80 msec várakozás van! (legalábbis a beépített I2C esetén). Nem próbáltam, mailban kaptam én is hogy ilyen márpedig van. Nálam ilyen kritikus még nem kellett....

De a Timeren lógjon a kijelzés és az inten csak jelzőbitállítás. Ha meg pofátlan vagy:) akkor egy Tiny2313 a kijelzőkkel elmolyolgat, és soros buszán át átküldöd mit írjon ki. Még mindíg olcsóbb mint egy LCD:).

És kétprocesszoros rendszered lesz:)
Robert

Hozzászólás Szerző: Robert »

Nos átrágtam a programodat, most épp 2 hőmérőIC-vel játszom.
A programodat végigolvasva, nagy része nincs is használva:)
A TCN75 IC alapértelmezetten (a TCN75A is) szépen kiolvasható I2C buszon, nem kell piszkálni a config biteket.

A lényeg:

I2Cstart
I2Cwrite chip_címe
i2cWrite Configbit 'ez &H00
i2cread msbbyte,ack 'Ez a felso bit
i2cread, lsbbyte,nack 'Ez az also bit
i2cstop

Szóval ennyi a program lényege (lefordítva ~300 byte). Nálam LCD kijelző(4*16)+8kbyte EEPROMba adatmentés+sorosport adatküldés esetén maga a program "csicsázva" ~1,5 kbyte.
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

Hozzászólás Szerző: gerry »

Megrágom ég én is csak most egy mágnesmotor project köti le az időmet.Köszi, hogy utánanéztél.

gerry
Robert

Hozzászólás Szerző: Robert »

Az új Bascomban a TWI részre is érdemes rákeresni. Ezzel a hardweres I2C használható némi kódsórolás mellett:).
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

Nem akarok beleugatni , de ajánlom az 1wire hőmérőszondát! A bascom kezeli alapból. Én kipróbáltam és megbízható. DS18S20 -9 bites felbontás
DS18B20 -12 bites felbontás. +125c -55c ig mér. Egy szál dróton több tíz eszköz is lehet.
A 64 bites egyedi azonosító sejtet valamit , nem? :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Én az árával nem békéltem meg.
A TCN75 chip (ill LM75/76/79) ~250-300 Ft. A DS1820-as ahol kapható 1200-ért láttam....

Mondjuk a M16 panelen ott a helye, de nem akarom beültetni. Ahhoz sztem draga egy kicsit a chip. Mondjuk 4-500 Ft amit max. ér. Mindjuk az 1Wire előnye, hogy 3 vezeték elég (+5V/GND/adat). Viszont hátrány pl ipari sorozatnál), hogy a felfűzöttek esetén tudni kell előre a sorozatszámot, mert az ugye chipenként változik:))). Így a bővítés/csere macerás lehet. vagy a programba bele kell írni, hogy lekérdezze a teljes buszt hogy ki van rajta.....(ez meg ugye kódpazarlás...) Ha az eepromba rakja a serialt, akkor valamivel előrébb lehet lenni....
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

Ez így van! Egyebet én sem tudok mondani ! Kérem kapcsolja ki! :D :D
Vendég

Hozzászólás Szerző: Vendég »

Robert írta:Én az árával nem békéltem meg.
A TCN75 chip (ill LM75/76/79) ~250-300 Ft. A DS1820-as ahol kapható 1200-ért láttam....

Mondjuk a M16 panelen ott a helye, de nem akarom beültetni. Ahhoz sztem draga egy kicsit a chip. Mondjuk 4-500 Ft amit max. ér. Mindjuk az 1Wire előnye, hogy 3 vezeték elég (+5V/GND/adat). Viszont hátrány pl ipari sorozatnál), hogy a felfűzöttek esetén tudni kell előre a sorozatszámot, mert az ugye chipenként változik:))). Így a bővítés/csere macerás lehet. vagy a programba bele kell írni, hogy lekérdezze a teljes buszt hogy ki van rajta.....(ez meg ugye kódpazarlás...) Ha az eepromba rakja a serialt, akkor valamivel előrébb lehet lenni....

Egy apró helyesbítés : az 1 wire az tényleg csak egy drót. (Na jó kettő, mert kell neki a gnd is) :)
Válasz küldése