DS 1820 hőmérő élesztés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
gergobmwe30
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2010. október 24. vasárnap, 6:00

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

Na akkor a leírást átolvasom még1x, pedig eddig is ebből merítettem a dolgokat, de lehet nem esett le....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Roviden:

1wire 8 byte-s azonositoja van. Ezt javasiolkt egy tombben kezelni, igy konnyebb megszolitani. Ha egy adott eszkozzel akarsz beszelgetni:

1wreset 'figyeljen mindenki
1wverify id(1) 'az 1...8 byte azonositoju eszkoz figyel a tobbieknek csond :)
.
.
.
.
'kibeszelgetted magadat az eszkozzel
1wreset
Avatar
gergobmwe30
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2010. október 24. vasárnap, 6:00

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

Na végre sikerült megoldani...

Rájöttem a kiolvasott kód tartalmára...
első 2 jegy: családkód, majd 12 jegy az ID, utána 2 a crc...

Lényeg hogy már megy, így tudok vele kisérletezni, próbálgatni mivel mit érek el...
Ezt összehozom még a menüvel, és kész a termosztátom...

OFF: azt azért még szeretném megkérdezni, bár nem ide tartozik, de: a menüt jó-e, ha külső megszakítással indítom el, majd abban meghívok különféle szubrutinokat, funkciókat? Más nem jut eszembe...

Köszi mindent!!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Hát...
Az 1Wire kommunikacio sebessegerzekeny. Max 5% hiba lehet benne.


INTben nem idozunk, csak fomenuben.... :)
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Sziasztok!
Rég nem voltam a fórumon annak ellenére hogy használgattam a procikat.
A napokban élesztettem volna egy fűtési rendszert amit csináltam már párat az elmúlt pár évben, de ilyen hibával még nem találkoztam.
ds18b20 1db egy előremenő csövön figyelne. Itthon atmega168 rá kötöm DQ és gnd waitms 750 a konverziónál 4,7k felhúzó és a 24 fokos szobában mér 24 fokot ha melegítem méri szabályosan ahogy kell és ahogy szokták.
Jogos a kérdés hogy akkor mi a bajom....
Elmentem oda ahova tenni kellene, bekábelezem, felszerelem, amit kell megcsináltam. Bemásoltam a 1W hőmérő programrész az ottani atmega8-ba, beállítottam portb.0 ra. és vártam hogy majd működik, DE NEM. --->RS232 debug---> -23 fok ott ahol 60nak kellene lennie. Itt a hiba.
Kérdésem: Ti futottatok bele ilyen hibába? ki milyen fügvényt a hőmérséklet konverzióra DS1820, DS1820S, és DS18B20 esetében?
Köszi


Jah és próbáltam úgy is hogy adok neki 5-v ot is de az nem befolyásolt semmit.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

1820 és 18b20 -> eltérő a kezelése.
Puska: www.mcselec.com duálhőmérője.

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

' This program demonstrate 1Wire dualthermometer DS1820/DS1820S/DS18B20!
' AN111 rewriten


$crystal = 16000000                                         'Sebesseg
$regfile = "M168pdef.dat"                                   'Chip
$baud = 9600
$swstack = 20
$hwstack = 64
$framesize = 80

'1Wire
Config 1wire = Portb.3                                      '1w lab

Declare Sub Init()
Declare Sub Convallt()                                      ' Convert T on ALL sensors
Declare Function Decigrades(byval Sc(9) As Byte , Byval Family As Byte) As Integer

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

'Temp variables
Dim B As Byte
Dim W As Word

Config Portb.5 = Output
Portb.5 = 1


'Program variables
'Implicit Err created by compiler
Dim Dg As Integer                                           'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Min1 As Integer
Dim Min2 As Integer
Dim Max1 As Integer
Dim Max2 As Integer

Dim Dsid1(8) As Byte                                        'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
'Dim Family As Byte
'When used like this : DsId(1) = 1wread(8)
'DsId(1) = family code 'Ds1820 10h, DS18B20 28h, Ds18s20 10h
'DsId(2) '48 Bits Serial, LSB
'DsId(3)
'DsId(4)
'DsId(5)
'DsId(6)
'DsId(7) '48 Bits Serial, MSB
'DsId(8) '8 CRC

Dim Sc(9) As Byte                                           'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
'Sc(1)  'Temperature LSB
'Sc(2) 'Temperature MSB
'Sc(3) 'TH/user byte 1 also SRAM
'Sc(4) 'TL/user byte 2 also SRAM
'Sc(5) 'config  also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6) 'res
'Sc(7) 'res
'Sc(8) 'res
'Sc(9) '8 CRC

'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33 read rom - single sensor
'&H 55 match rom, followed by 64 bits
'&H CC skip rom
'&H EC alarm search - ongoining alarm >TH <TL
'&H BE read scratchpad
'&H 44 convert T


Initlcd
Cls
Initlcd
Cls


W = 1wirecount()
Print "1-Wire:" ; W
1wreset
If Err = 0 Then
   Dsid1(1) = 1wsearchfirst()
End If

If W > 1 Then
   Dsid2(1) = 1wsearchnext()
End If

If W > 0 Then
   If Dsid1(8) = Crc8(dsid1(1) , 7) Then                    ' Control that the received CRC match the calculated
    Locate 1 , 1
    Lcd "CRC OK Sensor 1 ID"
    Print "CRC OK Sensor 1 ID"
    Wait 1
    Locate 1 , 1
    For B = 1 To 8
    Lcd Hex(dsid1(b))
    Next
   End If
End If

' Second sensor
If W > 1 Then
   If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    Locate 2 , 1
    Lcd "CRC OK Sensor 2 ID"
    Print "CRC OK Sensor 2 ID"
    Wait 1
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
   End If
End If
Wait 1
Cls

Call Init()

' Main loop
Do
    Call Convallt()                                         'Convert ALL T on the 1w-bus
    Waitus 200
    Waitus 200
    Waitus 200
    Waitus 200                                              'if you use 2-wire, could be reduced to 200us

    1wverify Dsid1(1)                                       'issues The "Match ROM"
    Locate 1 , 1
    If Err = 1 Then
      Lcd "DsId1 not on bus "
      Print "DsId1 not on bus "                             'Err = 1 if something is wrong
      Elseif Err = 0 Then                                   'lcd " Sensor found"
         1wwrite &HBE
         Sc(1) = 1wread(9)                                  'read bytes into array
         If Sc(9) = Crc8(sc(1) , 8) Then
            Dg = Decigrades(sc(9) , Dsid1(1))
            If Min1 > Dg Then Min1 = Dg
            If Max1 < Dg Then Max1 = Dg
            Lcd Dg
            Locate 1 , 8
            Lcd Min1
            Locate 1 , 14
            Lcd Max1
            Print "ID1:" ; Dg
         End If
    End If

      1wverify Dsid2(1)
      Locate 2 , 1
      If Err = 1 Then
         Lcd "DsId2 not on bus "
         Print "DsId2 not on bus "
         Elseif Err = 0 Then                                ' lcd " Sensor found "
           1wwrite &HBE
            Sc(1) = 1wread(9)
            If Sc(9) = Crc8(sc(1) , 8) Then
               Dg = Decigrades(sc(9) , Dsid2(1))
               If Min2 > Dg Then Min2 = Dg
               If Max2 < Dg Then Max2 = Dg
               Lcd Dg
               Locate 2 , 8
               Lcd Min2
               Locate 2 , 14
               Lcd Max2
               Print "ID2:" ; Dg
         End If
      End If
      Wait 1
Loop
End                                                         'end program

Sub Init()
    Cls
    Lcd "    Min   Max"
    Locate 2 , 1
    Lcd "    Min   Max"
    Min1 = 999                                              ' to get a real value from start
    Min2 = 999
End Sub

'WAIT 200-750 ms after issued, internal conversion time for the sensor''''''''''
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )
Sub Convallt()
    1wreset                                                 ' reset the bus
    1wwrite &HCC                                            ' skip rom
    1wwrite &H44                                            ' Convert T
End Sub

'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate
Function Decigrades(byval Sc(9) As Byte , Byval Family As Byte)
   Dim Tmp As Byte , T As Integer , T1 As Integer
   If Family = &H28 Then                                    '18B20
      Decigrades = 0
      Decigrades = Makeint(sc(1) , Sc(2))
      Decigrades = Decigrades * 10
      Decigrades = Decigrades / 16
   End If
   If Family = &H10 Then                                    '1820/1820S
      Tmp = Sc(1) And 1                                     ' 0.1C precision
      If Tmp = 1 Then Decr Sc(1)
      T = Makeint(sc(1) , Sc(2))
      'Print Hex(t)
      'Print T
      T = T * 50                                            'here we calculate the 1/10 precision like
      T = T - 25                                            'DS18S20 data sheet
      T1 = Sc(8) - Sc(7)
      T1 = T1 * 100
      T1 = T1 / Sc(8)
      T = T + T1
      Decigrades = T / 10
      'As integer, this routine gives T*10, with 1/10 degree precision
   End If
End Function
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

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

Adott egy D18B20-as sensor.
Atmega8 prociban fut az alábbi program.
CRC rendben de mindig csak 85,0C olvas ki mi lehet az oka.
Ugyanez a sensor egy másik mega8-al aminek sajnos nem ismerem a programját fut szépen.

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

$crystal = 4000000                                          'Sebesseg
$regfile = "m8def.dat"                                      'Chip

$baud = 9600

$swstack = 10
$hwstack = 32
$framesize = 40

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portb.2
Config Lcdmode = Port
Deflcdchar 3 , 2 , 4 , 14 , 17 , 30 , 16 , 14 , 32
Deflcdchar 2 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32
Deflcdchar 5 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 6 , 10 , 32 , 17 , 17 , 17 , 17 , 17 , 14
Deflcdchar 0 , 10 , 17 , 17 , 17 , 17 , 17 , 14 , 32
Initlcd
Cursor Off Noblink
Cls
Config 1wire = Portc.5



Declare Sub Convallt                                        ' Konvertálás
Declare Function Decigrades(byval Sc(9) As Byte) As Integer

Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Dsid1(8) As Byte                                        'DS18B20 sensor
Dim Sc(9) As Byte
Dim Ho As Single
Dim Hok As String * 5

W = 1wirecount()

Dsid1(1) = 1wsearchfirst()
Waitus 100


Cls
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       ' A beolvasott CRC egyeztetés
  Locate 2 , 5
  Lcd "Szenzor 1 OK"
  End If
Wait 1

Cls
Do
  Convallt                                                  ' Konvertálás
  Waitus 750
  1wverify Dsid1(1)

If Err = 1 Then
    Cls
    Locate 1 , 5
    Lcd "Szenzor Hiba"
   Elseif Err = 0 Then
    1wwrite &HBE
    Sc(1) = 1wread(9)
    If Sc(9) = Crc8(sc(1) , 8) Then
      Dg = Decigrades(sc(9))
      Cls
      Locate 1 , 5
      Lcd "H" ; Chr(002) ; "m" ; Chr(003) ; "rs" ; Chr(003) ; "klet"
      Locate 2 , 8
      Lcd Hok ; Chr(5) ; "C"
      End If
End If

Wait 1
Loop
End                                                         'end program



Sub Convallt
  1wreset
  1wwrite &HCC
  1wwrite &H44
End Sub


Function Decigrades(byval Sc(9) As Byte)
  Decigrades = 0
  Decigrades = Makeint(sc(1) , Sc(2))
  Decigrades = Decigrades * 10
  Decigrades = Decigrades / 16
  If Sc(9) = 1 Then
    Decigrades = 0 - Decigrades
  End If
  Ho = 0
  Ho = Dg / 10
  Hok = Fusing(ho , "00.0")
  Ho = Val(hok)
End Function
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

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

Megtaláltam a hibát!

A convertálás után egy kicsit alulméreteztem a várakozást.

Igy már tökéletesen működik.

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

$crystal = 4000000                                          'Sebesseg
$regfile = "m8def.dat"                                      'Chip

'$baud = 9600

$swstack = 10
$hwstack = 32
$framesize = 40

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portb.2
Config Lcdmode = Port
Deflcdchar 3 , 2 , 4 , 14 , 17 , 30 , 16 , 14 , 32
Deflcdchar 2 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32
Deflcdchar 5 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 6 , 10 , 32 , 17 , 17 , 17 , 17 , 17 , 14
Deflcdchar 0 , 10 , 17 , 17 , 17 , 17 , 17 , 14 , 32
Initlcd
Cursor Off Noblink
Cls
Config 1wire = Portc.5



Declare Sub Convallt                                        ' Konvertálás
Declare Function Decigrades(byval Sc(9) As Byte) As Integer

Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Dsid1(8) As Byte                                        'DS18B20 sensor
Dim Sc(9) As Byte
Dim Ho As Single
Dim Hok As String * 5

W = 1wirecount()

Dsid1(1) = 1wsearchfirst()
Waitms 100


Cls
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       ' A beolvasott CRC egyeztetés
  Locate 2 , 5
  Lcd "Szenzor 1 OK"
  End If
Wait 1

Cls
Do
  Convallt                                                  ' Konvertálás
 Waitms 750                                        'Itt volt a hiba
  1wverify Dsid1(1)

If Err = 1 Then
    Cls
    Locate 1 , 5
    Lcd "Szenzor Hiba"
   Elseif Err = 0 Then
    1wwrite &HBE
    Sc(1) = 1wread(9)
    If Sc(9) = Crc8(sc(1) , 8) Then
      Dg = Decigrades(sc(9))
      Cls
      Locate 1 , 5
      Lcd "H" ; Chr(002) ; "m" ; Chr(003) ; "rs" ; Chr(003) ; "klet"
      Locate 2 , 8
      Lcd Hok ; Chr(5) ; "C"
      End If
End If

Wait 1
Loop
End                                                         'end program



Sub Convallt
  1wreset
  1wwrite &HCC
  1wwrite &H44
End Sub


Function Decigrades(byval Sc(9) As Byte)
  Decigrades = 0
  Decigrades = Makeint(sc(1) , Sc(2))
  Decigrades = Decigrades * 10
  Decigrades = Decigrades / 16
  If Sc(9) = 1 Then
    Decigrades = 0 - Decigrades
  End If
  Ho = 0
  Ho = Dg / 10
  Hok = Fusing(ho , "00.0")
  Ho = Val(hok)
End Function
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

750 usec tényleg kevés:)
Avatar
kistigris
Biztosítékgyilkos
Hozzászólások: 62
Csatlakozott: 2012. január 19. csütörtök, 7:00

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

Sziasztok! Következő lenne a kérdésem.Az itt lévő minta programok ami 4 db ds18b20-as szenzorra lett írva.Az a gondom ,hogyan lehetne megcsinálni
hogyha 1db szenzort (vagy akár 2 db szenzort) akkor csak a rajta lévő szenzorokat mutassa?Ha megint rárakok négyet akkor megint mutassa mind a négyet.Mert olyan zavaró ha csak kettő rakok rá akkor mutatja mind a négyet.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Azt, hogy hány szenzorod van az 1Wcount utasítással tudod lekérdezni....
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Ha arra a kódra gondolsz amit 2007 körül raktam össze, ahol a dsid(x) változókba tölti az azonosítókat, akkor egyszerű. Ki írás előtt vizsgálod a "hiba(x) = 11 " változó értékét ha nincs hiba tehát látja a szenzort akkor írja ki ha nem látja tehát hibát ad vissza akkor ne írja ki. Azt hiszem abban benne kellett legyen a hibakezelés is ha nem akkor felteszem a komplett kódot.
Avatar
kistigris
Biztosítékgyilkos
Hozzászólások: 62
Csatlakozott: 2012. január 19. csütörtök, 7:00

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

Ha nem lenne nagy gond akkor felrakhatnád,mert elég sok itt a mintaprogi
és így nem tudom mire gondoltál.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Visszakérdezhetek?
A TE elképzelésed mi a programra? Hogyan oldanád meg?
Off: a pedagógus/tanító megszólalt belőlem...
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

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

Szervusztok!
Építettem énis egy 3 szenzorból álló hőmérőt. Tulajdonsága, hogy mindegyik szenzort ID alapján azonosít és kezel. Ha leválasztasz egy szenzort, vagy meghibásodik, akkor az LCD-n egyszerűen kihúzza a digiteket (--°C). Ha ez kell, bemásolom ide a megfelelő kódot, a visszafejtést és a körítést rád bízom.
Válasz küldése