www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

DS18B20 v bascom avr
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Pobesneli
Član
Član



Pridružen-a: Sre 02 Jan 2008 1:24
Prispevkov: 1070
Aktiv.: 5.41
Kraj: Ajdovščina

PrispevekObjavljeno: Čet Sep 16, 2010 8:17 pm    Naslov sporočila:  DS18B20 v bascom avr Odgovori s citatom

Pozdravljeni!

Ima kdo slučajno napisan kakšen program za merjenje temperature s tem senzorjem?
Malce se mi mudi, pa ne bi rad tople vode izumljal. Ni pa to za kakšno šolo, rabim za hobi mudi se mi pa zato ker mi gre dopust h koncu in bi nekaj rad naredil Smile

Ima kdo kakšen link, kjer je razložen postopek merjenjena z senzorji ds18X20 v bascom? kakšen del kode z komentarji ali kaj podobnega.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kose19
Član
Član



Pridružen-a: Sre 02 Mar 2005 19:37
Prispevkov: 1228
Aktiv.: 5.53
Kraj: okolica Kobarida

PrispevekObjavljeno: Čet Sep 16, 2010 9:04 pm    Naslov sporočila:   Odgovori s citatom

to je na hitro
Koda:
For I = 1 To 8
   Ar(i) = Lookup(i , Dta3)
Next                                                        'branje kode za senzor 3
   I = 1


   1wreset
   1wwrite &H55
   1wwrite Ar(1) , 8                                   
   1wwrite &H44


   1wreset
   1wwrite &H55
   1wwrite Ar(1) , 8                                     
   1wwrite &HBE
   Bd(1) = 1wread(9)
   1wreset

      T = Makeint(bd(1) , Bd(2))
      Tz = T / 16                                           
      T1 = Tz * 16                                         
      T2 = T - T1                                         
      T3 = T2 * 100                                         
      Tz1 = T3 / 16     
kodo senzorja vpiši v tabelo
_________________
- Absens, carens -
- Tisti, ki ga ni, bo prikrajšan -
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pobesneli
Član
Član



Pridružen-a: Sre 02 Jan 2008 1:24
Prispevkov: 1070
Aktiv.: 5.41
Kraj: Ajdovščina

PrispevekObjavljeno: Pet Sep 17, 2010 8:15 pm    Naslov sporočila:   Odgovori s citatom

Kje je razlika v branju temperature med DS1820 in DS18B20?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Profesor Einstein
Član
Član



Pridružen-a: Ned 24 Sep 2006 0:13
Prispevkov: 1423
Aktiv.: 6.67
Kraj: Rogaška Sl.

PrispevekObjavljeno: Sob Sep 18, 2010 12:17 am    Naslov sporočila:   Odgovori s citatom

Za natančno analizo dogajanja bo potrebno proučiti datasheet in malo potestirati flow chart ki je priložen Smile

Lp.

Darko

_________________
--
"Če bi volitve kaj pomagale, bi jih prepovedali." (Mark Twain)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sob Sep 18, 2010 9:12 am    Naslov sporočila:   Odgovori s citatom

Pobesneli je napisal/a:
Kje je razlika v branju temperature med DS1820 in DS18B20?


Razlika je le, če hočeš meritev na desetinko stopinje natančno. Sicer ti ti termometri dajo podatek v 'polovičkah' stopinje v integer obliki (dva bajta s predznakom). Če ti je ta natančnost dovolj, potem sta v tem oba termometra enaka.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pobesneli
Član
Član



Pridružen-a: Sre 02 Jan 2008 1:24
Prispevkov: 1070
Aktiv.: 5.41
Kraj: Ajdovščina

PrispevekObjavljeno: Sob Sep 18, 2010 9:41 am    Naslov sporočila:   Odgovori s citatom

Nekaj mi je uspelo spravit skupaj, temperatura mi zgleda na lcdju dokaj realna, moram pa še danes z nečim primerjat.

Če že imam možnost na 0,1 stopinje natančnosti jo bom poskusil, sedaj moram ugotovit kako naredit 0,1 stopinje z DS1820, nekje sem prebral da se da z programom do doseči.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sob Sep 18, 2010 10:04 am    Naslov sporočila:   Odgovori s citatom

Pobesneli je napisal/a:
Če že imam možnost na 0,1 stopinje natančnosti jo bom poskusil, sedaj moram ugotovit kako naredit 0,1 stopinje z DS1820, nekje sem prebral da se da z programom do doseči.


Točno, in ravno v tem detajlu se oba termometra razlikujeta.
Težko si predstavljam aplikacijo, kjer je potrebna tolikšna natančnost. No, ja, če že ne meriš telesne temperature in po tem sklepaš o zdravju človeka..
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pobesneli
Član
Član



Pridružen-a: Sre 02 Jan 2008 1:24
Prispevkov: 1070
Aktiv.: 5.41
Kraj: Ajdovščina

PrispevekObjavljeno: Sob Sep 18, 2010 10:16 am    Naslov sporočila:   Odgovori s citatom

Pravzaprav se deloma tudi učim, tako da 0,1 stopinje ni zahteva, ampak le želja po tem da se nekaj naučim Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sob Sep 18, 2010 9:01 pm    Naslov sporočila:   Odgovori s citatom

To sem nekje našel, verjetno dela, nisem probal. Je pa pisano kot funkcija, ki jo pokličeš, ko si prebral odgovor termometra v Sc(od 1 do 9)

Koda:
'(
Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer

 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 Function
')
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
HeBird
Član
Član



Pridružen-a: Ned 16 Avg 2009 16:36
Prispevkov: 79
Aktiv.: 0.44
Kraj: Domžale

PrispevekObjavljeno: Tor Apr 30, 2013 1:46 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni,

mi je kar nerodno pisat, ker je tako veliko tem na forumu in drugje na internetu o branju podatka temperature s tega čipa. Vseeno vas prosim za pomoč.

Imam senzor DS18B20 in mikrokontroler ATmega16A PU 1224. Temperaturo bi prikazoval prek USART in USB na PC v programu Terminal. Senzor napajam posebej s 5V, zaporedno z DQ imam vezan 4,7k upor na napajanje. Komunikacija med mikrokrmilnikom in PC dela, med senzorjem in mikrokrmilnikom pa očitno ne, saj mi Terminal izpiše Error 1.

Slike vezave, fuse bitov in izpisa na terminalu sem uploadal na File Manager, vendar ne znam pripeti na forum albuma, ali pa ne morem, ker nisem aktiven uporabnik. Slike so tukaj: http://www.elektronik.si/phpATM/index.php?&direction=0&order=&directory=DS18B20%20Atmega16A%20Problem

Če naložim kodo:
Koda:
$regfile = "M16DEF.DAT"                                     'Atmega16
$crystal = 8000000

Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0       'PC

'when only bytes are used, use the following lib for smaller code

$lib "mcsbyte.lib"

Config 1wire = Portb.0                                     'use this pin

Dim Ar(8) As Byte  , I As Byte

Do

Wait 1
 1wreset                                                   'reset the device
Print Err                                                 'print error 1 if error
 1wwrite &H33                                             'read ROM command

For I = 1 To 8
   Ar(i) = 1wread()                                       'place into array
Next

For I = 1 To 8
    Print Hex(ar(i));                                     'print output
Next

Loop

Tukaj mi terminal izpisuje
Citiram:
1
FFFFFFFFFFFFFFFF


Če naložim kodo:
Koda:
$regfile = "M16DEF.DAT"                                     'Atmega16
$crystal = 8000000

Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0       'PC
Config 1wire = Portb.0                                     'use this pin

Dim T As Integer

'////////////////////////Glavni program/////////////////////////////////////////
Do

 1wreset
 Print Err
 1wwrite &HCC                                               'skip ROM – velja za vse, ki ste na liniji
 1wwrite &H44                                               'merite temperaturo

 Wait 2                                                     'dajem vam čas za merjenje

 1wreset                                                    'reset
 Print Err
 1wwrite &HCC                                               'skip ROM – velja za vse, a je samo eden na liniji
 1wwrite &HBE                                               'dajte podatke

 T = 1wread(2)

 Print T                                                    'Beremo podatke, prva dva bajta sta temperatura
                                                             ' T je tipa integer
 Print "USART OK"

Loop
'///////////////////////////////////////////////////////////////////////////////
End

Tukaj mi Terminal izpisuje:
Citiram:
1
1
-1
USART OK


Torej vedno mi piše napako "Unknown statement". Tudi ni mi jasno, zakaj mi v drugem primeru programa napiše za temperaturo "-1". Pri nekem tretjem in četrtem primeru programa mi pa napiše "0". Res sem izgubljen.

_________________
Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5327
Aktiv.: 24.78
Kraj: Domzale

PrispevekObjavljeno: Tor Apr 30, 2013 2:59 pm    Naslov sporočila:   Odgovori s citatom

Hmm, ne vem če gre tako enostavno ... Kje pa je konverzija, branje IDja itd?
Poskusi s spodnjo kodo. Je sicer za LCD, ne terminal, ampak boš že spremenil ...

LP, g

Koda:

'Konfiguracija za temperaturni senzor
Declare Sub Convallt                                        'Preračun temperature
Declare Function Decigrades(byval Sc(9) As Byte) As Integer

Config 1wire = Portc.0                                      'DS1820 imamo priklopljen na PC.0

'Temp spremenljivke
Dim B As Byte
Dim W As Word

'Spremenljivke
Dim Dg As Integer                                           'DECIgrades, I call it, cause I have no space for commas on the display...
Dim Dsid1(8) As Byte                                        'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte                                           'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20


'Zacetek
Cls
Cursor Off

W = 1wirecount()

Dsid1(1) = 1wsearchfirst()

'Berem ID senzorja; če se izpišejo same ničle, senzor ni priklopljen (pravilno...)
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
 Locate 1 , 1
 Lcd "CRC1 OK"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If

Wait 1
Cls


' Glavna zanka

'**************************** M A I N ******************************************

Do

 Convallt

 1wverify Dsid1(1)
   If Err = 1 Then
      Lcd "Err1"                                            'Err = 1 če senzorja ni
   Elseif Err = 0 Then
      1wwrite &HBE
      Sc(1) = 1wread(9)                                     'berem podatkovne bite s senzorja v array
   If Sc(9) = Crc8(sc(1) , 8) Then
      Dg = Decigrades(sc(9))
   End If
 Lcd Dg : Lcd Chr(223)                                      'Pri mojem LCDju je to znak za stopinje; mogoče boš moral narediti sam preko Tools -> LCD designer
 End If
Loop
End

'*************************** M A I N   E N D ***********************************

'---------------------------------Podprogrami-----------------------------------


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


Function Decigrades(byval Sc(9) As Byte)
    Dim Tmp As Byte , T As Integer , T1 As Integer

    Tmp = Sc(1) And 1
    If Tmp = 1 Then Decr Sc(1)
    T = Makeint(sc(1) , Sc(2))
    'Print Hex(t)
    'Print T

    T = T * 50                                              'računamo na desetinko stopinje natančno
    T = T - 25
    T1 = Sc(8) - Sc(7)
    T1 = T1 * 100
    T1 = T1 / Sc(8)
    T = T + T1
    Decigrades = T / 10                                     'Tu nastavimo natančnost izpisa; 1/10 nam vrne natančnost na 0,1 stopinje, 1/100 pa na 1 stopinjo
End Function

_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
HeBird
Član
Član



Pridružen-a: Ned 16 Avg 2009 16:36
Prispevkov: 79
Aktiv.: 0.44
Kraj: Domžale

PrispevekObjavljeno: Tor Apr 30, 2013 6:10 pm    Naslov sporočila:   Odgovori s citatom

Hvala mucek, ampak spet error.

Trenutno imam mego na testni plošči minipin2, bom probal dati na protoboard in izpisovat na LCDju; mogoče ledica, ki se prižiga pri komunikaciji kaj zmoti časovne intervale.

_________________
Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
HeBird
Član
Član



Pridružen-a: Ned 16 Avg 2009 16:36
Prispevkov: 79
Aktiv.: 0.44
Kraj: Domžale

PrispevekObjavljeno: Tor Apr 30, 2013 10:23 pm    Naslov sporočila:   Odgovori s citatom

1 teden se že ukvarjam s tem in ne vem, kako se nisem prej spomnil tega, kar sem napisal. Neutral

ATmego sem dal dol z minipina2 na protoboard in izpisoval na LCD. Merjenje temperature sedaj dela že s prvim programom (saj uporabljam samo 1 senzor).

Očitno je povezavo s čipom nekaj motilo, ne vem pa kaj.

_________________
Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MadMax
Član
Član



Pridružen-a: Pet 09 Sep 2005 22:16
Prispevkov: 4743
Aktiv.: 21.36

PrispevekObjavljeno: Tor Apr 30, 2013 10:29 pm    Naslov sporočila:   Odgovori s citatom

Iz slik ni razvidno, imam pa občutek, da si z napajanji urejal bolj po šalabajzersko.
Minipin prek USBja iz PCja, DS prek ločenega usmernika. Skupna masa je pa kaj? Ozemljitev PCja in napajalnika? Ker vidim samo eno žico iz DS na Minipin. Šalabajz.

A DS vtaknit v predvideno mesto na minipin (in seveda ustrezno popravit program) pa nisi probal?
Pa ledice na minipin se tudi enostavno odklopi...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
HeBird
Član
Član



Pridružen-a: Ned 16 Avg 2009 16:36
Prispevkov: 79
Aktiv.: 0.44
Kraj: Domžale

PrispevekObjavljeno: Tor Apr 30, 2013 10:54 pm    Naslov sporočila:   Odgovori s citatom

MAdMax imaš prav glede vezave. PC in usmernik sta iz iste vtičnice oziroma razdelilca, pa sem mislil, da so potenciali potem isti.

Da, sedaj v končni fazi sem dal senzor v 1-wire priključke na minipinu in dela. Zakaj nisem prej tega naredil - ne vem, nikoli prej nisem tega uporabljal in delal, pa se mi je zdelo komplicirano.

Ledice sem izklopil, rezultat je bil podoben; brez veljavne temperature, ne pa isti. Pri branju ROM kode mi je enkrat kazal 16xF, drugič 16x0.

_________________
Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group