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 

AVR>DS1820>ERR
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
stursc
Član
Član



Pridružen-a: Tor 08 Jun 2004 14:29
Prispevkov: 323
Aktiv.: 1.36

PrispevekObjavljeno: Sre Sep 10, 2008 8:38 am    Naslov sporočila:   Odgovori s citatom

@robika
Bom pripravil kodo (delujočo) in ti poslal - malo potrpljenja
Kaj pa jaz hočem doseči z tem branjem pa očitno ne razumeš.
Hočem med obratovanjem ugotavljat prisotnost oziroma pravilno branje temperatrnega senzorja.


LP, stursc
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: 3360
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Čet Sep 11, 2008 11:10 am    Naslov sporočila:   Odgovori s citatom

stursc je napisal/a:
@robika
Hočem med obratovanjem ugotavljat prisotnost oziroma pravilno branje temperatrnega senzorja.


Pozdravljen Srečko?
Ali ne bi bila v ta namen dovolj CRC8 preverka?
Prilagam primer, kjer je vgrajena crc8 preverka.
Imam občutek, da želiš ti nekaj drugega, saj s termometri imaš veliko izkušenj in to prav gotovo poznaš.

Koda:

Const Program = "DS18x20-test"
'(

Dallasovi termometri DS1820, DS18B20 in DS18S20 so zelo priljubljeni, ker so prijazni
in dajo temperaturo kar v stopinja, ni potrebna kalibracija.
1wire ukazi so prijazni, ko jih enkrat razumeš, in logični.
Nerodno pa je to, da DS18B20 termometri dajejo rezultat v drugačnem formatu kot
ostala dva tipa. Človek nepričakovano naleti na problem, ko hoče prebrati temperaturo,
ker take nedoslednosti od Dallas ni pričakoval.
Zato sem naredil podprogram DS18X20, ki sam ugotovi od katerega termometra je informacija
in jo ustrezno predela v stopinje Celzija.

Za slučajne napake in celo morebitno škodo ne odgovarjam. Uporaba je svobodna, a
na vašo lastno odgovornost.

Podprogram sem imenoval Centigradi, ker daje rezultat v spremenljivko tipa integer
v desetinkah stopinje, torej bo v njej število 50 kar pomeni 5 stopinj Celzija.
Vhodna informacija je 9-bajtno polje, v katerega ste prebrali ram iz termometra

')

$regfile = "m32def.dat"
$crystal = 11059200
$baud = 19200
$hwstack = 64
$swstack = 64
$framesize = 64
'splošne delovne spremenljivke - v vseh programih jih običajno definiram tako:
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim M As Byte
Dim W As Integer

' SWUART Output za pisanje PC Portd.2
Open "comd.2:9600,8,n,1" For Output As #2
Print #2 , Program ; " Reset."

' Definiramo pin za 1wire
Config Portc.7 = Output
Config 1wire = Portc.7
' Polje Termometer(9) uporabljamo tako za identifikacijo termometra
' kot tudi, da vanj beremo podatke iz termometra:
Dim Termometer(9) As Byte
' v sledeči spremenljivki dobim iz podprograma rezultat v desetinkah stopinje C
Dim Temperatura As Integer
' temperaturo pretvorim v spremenljivko tipa Single, da je lažje izpisati
Dim Tsingle As Single

Do
     ' vsem termometrom na 1wire bus-u damo ukaz, pretvori temperaturo v ram
     1wreset
     1wwrite &HCC                                           'skip ROM
     1wwrite &H44                                           'convert temperature
     1wreset

     Wait 1

         ' Identifikacijo prvega termometra prenesemo v polje
         For I = 1 To 8
           Termometer(i) = Lookup(i , Termid1)
         Next

         '  Beremo podatke prvega termometra v polje Termometer(9)
          1wreset                                           'reset
          1wwrite &H55                                      'match ROM
          1wwrite Termometer(1) , 8
          1wwrite &HBE                                      'READ Scratchpad
          Termometer(1) = 1wread(9)
          1wreset

          ' Prebrano prikažemo na ekranu PC-a:
               For J = 1 To 9
                  Print #2 , Hex(termometer(j));
               Next
               Print #2 , " ";
          If Crc8(termometer(1) , 9) = 0 Then
             Print #2 , "CRC8 OK ";
          Else
             Print #2 , "CRC8 NOT OK ";
          End If

          ' kličemo podprogram za prevod prebranega v stopinje C
          Gosub Ds18x20
          ' rezultat dobim v spremenljivki Temperatura
          Tsingle = Temperatura / 10
          Print #2 , "T1=" ; Tsingle ; "C"

         ' In še enako za drugi termometer:       -------------------------

         ' Identifikacijo drugega termometra prenesemo v polje
         For I = 1 To 8
           Termometer(i) = Lookup(i , Termid1)
         Next

         '  Beremo podatke drugega termometra v polje Termometer(9)
          1wreset                                           'reset
          1wwrite &H55                                      'match ROM
          1wwrite Termometer(1) , 8
          1wwrite &HBE                                      'READ Scratchpad
          Termometer(1) = 1wread(9)
          1wreset

          ' Prebrano prikažemo na ekranu PC-a:
               For J = 1 To 9
                  Print #2 , Hex(termometer(j));
               Next
               Print #2 , " ";
          If Crc8(termometer(1) , 9) = 0 Then
             Print #2 , "CRC8 OK ";
          Else
             Print #2 , "CRC8 NOT OK ";
          End If

          ' kličemo podprogram za prevod prebranega v stopinje C
          Gosub Ds18x20
          ' rezultat dobim v spremenljivki Temperatura
          Tsingle = Temperatura / 10
          Print #2 , "T2=" ; Tsingle ; "C"

  ' In nazaj v zanko
Loop

' Podprogram, zaradi katerega to objavljam in ki neodvisno od tipa termometra
' da pravilni rezultat v stopinjah je sledeč:

Ds18x20:
  ' vhodni podatki so v Termometer(9) tipa bajt,
  ' izhod v Temperatura tipa Integer v desetinkah stopinje C
   Temperatura = Makeint(termometer(1) , Termometer(2))
   If Termometer(5) = &H7F Then
      ' za termometer DS18B20
      Temperatura = Temperatura * 10
      Temperatura = Temperatura / 16
   Else
      ' za ostala dva tipa termometrov
      Temperatura = Temperatura * 5
   End If
Return

' Identifikaciji termometrov z dodanim bajtom 00 izpred za enostavno prenašanje
' z lookup ukazom:
Termid1:
Data &H00 , &H28 , &H1B , &HDB , &H53 , &H00 , &H00 , &H00 , &HC3
Termid2:
Data &H00 , &H10 , &H13 , &HC5 , &H4C , &H01 , &H08 , &H00 , &H26


Close #2[quote][/quote]

_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
stursc
Član
Član



Pridružen-a: Tor 08 Jun 2004 14:29
Prispevkov: 323
Aktiv.: 1.36

PrispevekObjavljeno: Pet Sep 12, 2008 12:33 pm    Naslov sporočila:   Odgovori s citatom

Vilko, bom na mail poslal moj test in razlago


LP, stursc
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 -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 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: 494 dni


Powered by phpBB © 2001, 2005 phpBB Group