DS1621 hőmérés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

DS1621 hőmérés

HozzászólásSzerző: Ubul » 2009. december 28. hétfő, 19:51

Sziasztok!

Több napos adatlapolvasás, wiki, google után életre keltettem
a DS1621 hőmérő IC-t egy M16 al.

Használnám a termosztát funkcióját.

Az is működik.

De ha csak a DS1621 et használom egy tranzisztoron keresztül ventinlátor kapcsolgatásra, ahogy lehúzom a uC-ről, elfelejt mindent.

Az ACh regiszterben kikapcsoltam az One-Shot módot, bekapcsolam az EEpromot de mégsem jegyzi meg a beállításokat.

Tehát a kérdés az lenne hogy az ACh regiszterben mit álítsak ahoz hogy szólóban is működjön az IC.....

Köszi

Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00
Tartózkodási hely: Győr
Kapcsolat:

HozzászólásSzerző: Higgins » 2010. január 1. péntek, 15:26

Szólóban nem fog működni neked!
Csak a felső és alsó értéket tudod beállítani a ds1621 belső NVRAM-jában, hogy mikor kapcsoljon a termostat. A hőmérséklet kiolvasást, a konverziót az adott képlet alapján az AVR végzi.

Üdv: Higgins

ui: B.Ú.É.K :lol:

Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

HozzászólásSzerző: gerry » 2010. február 17. szerda, 20:12

Üdvözlet!

Nem tudom, hogy más is találkozott e már olyan problémával a DS1621-nél, mint amilyennel én küzdök.

Adott egy egyszerű hőmérséklet szabályozó program. Annyi a program feladata, hogy méri a hőmérsékletet és kapcsolgat egy relét, plusz kijelzi a mért hőmérsékletet.

Kód: Egész kijelölése

$regfile = "attiny2313.dat"
$crystal = 4000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
Config Pind.6 = Output
Config Sda = Portd.0
Config Scl = Portd.1

Dim Tempmsb As Byte
Dim Templsb As Byte

Declare Sub Convert
Declare Sub Readtemp
Declare Sub Lcdre
Declare Sub Szamol

Deflcdchar 0 , 14 , 17 , 17 , 17 , 14 , 32 , 32 , 32
Deflcdchar 1 , 10 , 32 , 14 , 17 , 17 , 17 , 14 , 32
Deflcdchar 2 , 2 , 4 , 14 , 17 , 31 , 16 , 14 , 32

Call Convert

Cursor Off
Cls

Do
Call Readtemp
Call Szamol
Call Lcdre
Wait 1
Loop

'-------------------------
Sub Szamol
If Templsb = 128 Then Templsb = 5 Else Templsb = 0
If Tempmsb >= 22 And Templsb = 0 Then Reset Portd.6
If Tempmsb <= 21 And Templsb = 0 Then Set Portd.6
End Sub Szamol
'-------------------------
Sub Lcdre
Locate 1 , 1 : Lcd "21 C: 22 C"
Locate 2 , 1 : Lcd "M" ; Chr(2) ; "rt h" ; Chr(1) ; "m. " ; Tempmsb ; "," ; Templsb ; Chr(0) ; "C "
End Sub Lcdre
'-------------------------
Sub Convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
End Sub Convert
'-------------------------
Sub Readtemp
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop

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


A program működik is rendesen már 2 éve használom, kapcsolgat 21 és 22 fok között.
A probléma csak az, hogy ha áramkimaradás van és a helység lehűl 21 fok alá és a feszültség(áram) visszajön, az áramkőr feléled, de nem kapcsolja be a fűtést. Ha kézzel felmelegítem a DS1621-et és az eléri a 21 fokot, ami a minimum érték kezdete, akkor bekapcsolja a fűtést(vezérlést).

Miért van ez, ha a programban a 21 fok alatti hőmérséklet is meg van határozva

Kód: Egész kijelölése

If Tempmsb <= 21 And Templsb = 0 Then Set Portd.6


valakinek valami ötlete?

köszönöm!

Ui.: Közben eszembe jutott, hogy először egy állítható hőfokú termosztátot akartam csinálni, de itt megbukott a project, amikor állítottam a hőfokot akkor sem akart kapcsolgatni. Na mind egy megemlítettem.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. február 18. csütörtök, 16:13

Mert rossz a feltétel vizsgálat!
Csak ennyi kel: „ If Tempmsb <= 21 Then Set Portd.6”

„És Templsb = 0” hatására csak minden egész fokon kapcsol neked!
Vagyis csak: 18, 19, 21°-on
:roll:

Avatar
Hegemon
Biztosítékgyilkos
Hozzászólások: 58
Csatlakozott: 2009. március 13. péntek, 6:00
Tartózkodási hely: Klárafalva

HozzászólásSzerző: Hegemon » 2010. február 18. csütörtök, 19:15

Kód: Egész kijelölése

 If Tempmsb <= 21 Then Set Portd.6 else Reset Portd.6


így elkerülhető a katyvasz is, hogy ne maradjanak ki eseménytelen hőfokok, vagy a második feltételnél nem kell egyenlőség.

Ha kell a fél fokos pontossogág:

Kód: Egész kijelölése

Hatarho = 215
Temptemp = Tempmsb * 10
If Templsb = 128 Then Temptemp = Temptemp + 5
If Temptemp <= HatarHo Then Set Portd.6 Else Reset Portd.6

Avatar
Hegemon
Biztosítékgyilkos
Hozzászólások: 58
Csatlakozott: 2009. március 13. péntek, 6:00
Tartózkodási hely: Klárafalva

HozzászólásSzerző: Hegemon » 2010. február 18. csütörtök, 19:30

Ja elnéztem bocsánat :-D Akkor csak a második felét vedd figyelembe a hsz nek :-D

viszont akkor is inkább case t használnék :-)

Kód: Egész kijelölése

MinHatarho= 215
MaxHatarho   = 225

Temptemp = Tempmsb * 10
Select Case Temptemp
    Case Is <= MinHatarho  : Set Portd.6 
   'Case MinHatarho  To MaxHatarho  : nop
    Case Is >= MaxHatarho  : ReSet Portd.6 
End Select
[/code]

Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

HozzászólásSzerző: gerry » 2010. február 19. péntek, 23:34

kapu48 írta:Mert rossz a feltétel vizsgálat!
Csak ennyi kel: „ If Tempmsb <= 21 Then Set Portd.6”

„És Templsb = 0” hatására csak minden egész fokon kapcsol neked!
Vagyis csak: 18, 19, 21°-on
:roll:


Üdv!

Ha nem teszem bele a

Kód: Egész kijelölése

And Templsb = 0

akkor 22 foknál kikapcsol a fűtés, de rögtön vissza is kapcsol 21,5 nél, mivel a félfokot nem veszi figyelembe!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. február 20. szombat, 0:01

Akkor legyen csak ennyi:

Kód: Egész kijelölése

Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Tempi As Single

'-------------------------
Sub Szamol
If Templsb = 128 Then Templsb = 5 Else Templsb = 0
Tempi = Templsb / 10
Tempi = Tempi + Tempmsb                                     'Tizedes törtre váltjuk

If Tempi >= 22 Then Reset Portd.6
If Tempi <= 21 Then Set Portd.6
End Sub Szamol

Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

HozzászólásSzerző: gerry » 2010. február 24. szerda, 0:13

kapu48 írta:Akkor legyen csak ennyi:

Kód: Egész kijelölése

Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Tempi As Single

'-------------------------
Sub Szamol
If Templsb = 128 Then Templsb = 5 Else Templsb = 0
Tempi = Templsb / 10
Tempi = Tempi + Tempmsb                                     'Tizedes törtre váltjuk

If Tempi >= 22 Then Reset Portd.6
If Tempi <= 21 Then Set Portd.6
End Sub Szamol


Szia!

A probléma még midig az hogy ha feszültség alá helyezem a kapcsolást és a hőmérséklet teszem azt 20,5°C, akkor sem kapcsol a relé.

De, ha nem melegítem, hanem hűtöm egy jégdarabbal a szenzort, akkor a következő fél fokos lépésnél már meghúzza a relét.
Szóval ha egész nap nem változik a hőmérséklet a helységben, akkor nem fogja felfűteni, mer nem kapcsol a kapcsolás, pedig kijelzi az adott hőmérsékletet, de mindig csak akkor működik, ha az első mérés után egy változás következik be. Ez végül is program szempontból egyfelöl érthető is mert az első méréshez képest a következő változást figyelembe véve kapcsolgat?! De hiszen nem így van programozva. Lehet hogy a konvertálás előtt kiírt 196 zavarja meg? Vagy a DS1621 belső termosztátját kéne programozni? Használjak TC75-öt hátha azzal jó? Vagy LM35-öt?

Avatar
Hegemon
Biztosítékgyilkos
Hozzászólások: 58
Csatlakozott: 2009. március 13. péntek, 6:00
Tartózkodási hely: Klárafalva

HozzászólásSzerző: Hegemon » 2010. február 24. szerda, 8:44

Mert már nem csak egészekkel számolsz, de ezért javasoltam a select case verziót mert azzal átláthatóan tartományokat is tudsz kezelni. Meg tehetsz be védelmet mondjuk ventillátoros hűtés esetén 22 fokhoz hogy nem hűt ventillátor (túlmelegedtünk). Én 10 el szoroztam De Kapu48 verziója hogy single vltozóba teszi át talán jobb.
'Case MinHatarho To MaxHatarho : nop (bekapcsoláskor a két érték közt nincs művelet de be lehet tenni hogy : Set Portd.6 , így bekapcsiláskor 21,5 foknál is bekapcsol a fűtésed.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. február 24. szerda, 10:29

Valószínűleg a hőmérőd később éled, mint a procid! És nem reagál az első utasításra.
Esetleg próbálj késleltetést berakni az indulásnál.

Deflcdchar 2 , 2 , 4 , 14 , 17 , 31 , 16 , 14 , 32

Wait 2 ’ Vár valamennyit, hogy a hőmérő feléledjen
Call Convert

Vagy tedbe a :
Do
Call Convert
………

Loop

Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00
Tartózkodási hely: Győr
Kapcsolat:

HozzászólásSzerző: Higgins » 2010. február 24. szerda, 20:26

Kapu48-nak igaza van, ugyanis a DS hőmérő szenzorok konverziós ideje kb. ~300ms körül van, szóval kis késleltetés nem árt az első mérés előtt!

Üdv: Higgins

Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

HozzászólásSzerző: kovacsna » 2010. február 24. szerda, 23:09

Hello.

A várakozás kell, mindenképp ezért:

Temperature Conversion Time 750 ms

Miért nem tizedes pontosággal mérsz?
Amúgy miért nem használod azt ami benne van?:)))
Beállítod az alsó és felső határt. Aztán hajrá mérés.

A megoldás...
The active state for the output is programmable by the user so that an active state may either be a logic
"1" (VDD) or a logic "0" (0V). This is done using the POL bit in the configuration reagister as explained
in the Operation and Control section of this datasheet.

POL = Output Polarity Bit. “1” = active high, “0” = active low. This bit is nonvolatile.

Az utolsó szó a lényeg!!!!
Szóval a relédet hőmérő kimenetével hajtsd.. Igaz Neked kell beírni a bitet, de ha visszajön a delej akkor kapásból tudja mi volt utoljára.

Érted?

két if kell, ha olvasod a status register.
Ha THF bit egy akkor elérte a felső szintet. Beállítod a pol bitet, meg törlöd a THF bitet. A TLF-el hasonlóan csak törlöd a pol bitet.

Sokkal egyszerűbb és átláthatóbb.

Tessen dokumentációt olvasni :lol:
Bár ez maximéknál néha nem olyan egyszerű....:)

By
KN

Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

HozzászólásSzerző: gerry » 2010. február 25. csütörtök, 21:57

Igen, nem olyan egyszerű kihámozni. Kellet, vagy egy nap, meg Robi "lecseszése", hogy megértsem a címzését a hőmérőnek, hogy többet párhuzamosan tudjak olvasni.

Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

HozzászólásSzerző: kovacsna » 2010. február 25. csütörtök, 22:05

Nem is olyan kozmikus.
A címben az a huligánság, hogy van benn egy bit is néha, vagy több, amivel megmondod az adat irányát, vagy egyebeket. De ez a doksikban benne van!
Vagy pl van mikor elég megadni az első register címet , ahová/ahonnan írni vagy olvasni akarsz. A többit nem kell, csak olvasni/írni kell az adatot, mert az eszköz inkrementálja a register pointert. Ez segítség, néha átok. Meg van amelyik tudja, van amelyik nem. Alapos doksi átolvasás. Ennyi a titok.
De a gondodra visszatérve használd amit írtam. Akkor bekapcsol a hőmérőd áram kimaradás után is.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég