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 

DS1820, Atmega8 in LCD - Koda ne deluje

 
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
lamela123
Član
Član



Pridružen-a: Sob 10 Mar 2012 15:15
Prispevkov: 232
Aktiv.: 1.58
Kraj: Celje

PrispevekObjavljeno: Ned Nov 02, 2014 9:49 am    Naslov sporočila:  DS1820, Atmega8 in LCD - Koda ne deluje Odgovori s citatom

Lep pozdrav!

Imam sledečo kodo, s katero želim zajemati temperaturo in jo prikazovati na LCD displayju:

Koda:

$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32




Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2 , Chipset = Ks077
Dim X As Byte
Dim A As Byte
Dim Tempdata(9) As Byte
Dim Temperature As Integer
 Cls
 Cursor On
 Locate 1 , 1
 Lcd "DS1820"
 
 Wait 2
 Cls


Meritev_temperature:
Config 1wire = Portc.5                                      'To pove ICju kje izkati DS18D20


 1wreset                                                    'Resetira in začne z komunikacijo
 1wwrite &HCC                                               'Preskoči oddajanje edinstvene ROM kode senzorja. Ta koda se potrebuje, ko je več kot eden senzor na žici.


 1wwrite &H44                                               'Začne A/D pretvornik v senzorju in shrane podatek v scratchpad.

 Waitms 750                                                 'Pretvorba traja do 750ms, zato počakamo preden začnemo brati podatek.

 1wreset
 1wwrite &HCC
 1wwrite &HBE                                               'Pove napravi, da želimo prebrati scratchpad.
 Tempdata(1) = 1wread(9)                                    'Beremo 9 bitov v tempdata(), začnemo pri tempdata(1).

 If Tempdata(9) = Crc8(tempdata(1) , 8) Then                'Preveri verodostojnost podatka in združi prva dva bita v število.
 Temperature = Makeint(tempdata(1) , Tempdata(2))

 Temperature = Temperature / 16                             'Število delimo z 16 in dobimo temperaturo v stopinj celzijah.

 End If
 Cls
 Locate 1 , 1
 Lcd "Temperatura:"
 Lowerline
 Lcd Temperature
 Goto Meritev_temperature


Težava je v tem, da mi na LCD ves čas kaže 0 stopinj. Kje je napaka oz. ima kdo delujočo kodo?

_________________
Lep pozdrav!
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: Ned Nov 02, 2014 10:12 am    Naslov sporočila:   Odgovori s citatom

Meni tako dela.
Koda:

   For I = 1 To 8
      Ar(i) = Lookup(i , Dta1)                              'branje kode za senzor
   Next I

   1wreset
   1wwrite &H55                                             'ukaz za pricakovanje kode
   1wwrite Ar(1) , 8                                        'posiljanje kode
   1wwrite &H44                                             'sprozitev merjenja
   Waitms 100                                               'meritev se vpise v notranji RAM

   1wreset                                                  'reset
   1wwrite &H55                                             '1Wire ukaz za pricakovanje kode
   1wwrite Ar(1) , 8                                        'posiljanje kode
   1wwrite &HBE                                             'ukaz za branje internega RAM-a
   Bd(1) = 1wread(9)                                        'branje RAM-a v polje
   1wreset                                                  'reset

   T2 = Makeint(bd(1) , Bd(2))                              'zruzevanje 1.in 2.byta iz polja v eno spremenjlivko
   T2 = T2 / 2                                              'T2 delimo z 2,da iznicimo decimalke

na koncu še tabela, s tem da moraš v tabelo vpisati naslov tvojega senzorja

Koda:

Dta1:                                                       'tabele s kodami
Data 0 , 16 , 157 , 93 , 141 , 0 , 8 , 0 , 75

_________________
- 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
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.83
Kraj: Mengeš

PrispevekObjavljeno: Ned Nov 02, 2014 2:26 pm    Naslov sporočila:   Odgovori s citatom

Tole mora delati brez branja UID senzorja:

Koda:


Declare Sub Read1820

$regfile "m32def.dat"
$crystal = 4000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pind.4 , Db5 = Pind.5 , Db6 = Pind.6 , Db7 = Pind.7 , E = Pind.3 , Rs = Pind.2

Config 1wire = Porta.2

Config Porta.6 = Output
'Temp variables
Dim Bd1 As Byte
Dim Bd2 As Byte
Dim Bd7 As Byte
Dim Bd8 As Byte

Dim I As Byte , Tmp As Byte
Dim T As Integer , T1 As Integer
Dim Bd(9) As Byte


' Main loop
Cls
Cursor Off
Do
   1wwrite &HCC : 1wwrite &H44                              ' start measure
   Waitms 400                                               ' wait for end of conversion
   Read1820
   Set Porta.6
   Wait 1
   Reset Porta.6
Loop
End                                                         'end program

'Read the DS1820 by skipping the ROM checking, since we are using only 1 sensor

Sub Read1820                                                ' reads sensor ans calculate                                               ' T for 0.1 C
   1wreset                                                  ' reset the bus
   1wwrite &HCC                                             ' read internal RAM
   1wwrite &HBE                                             ' read 9 data bytest
   Bd(1) = 1wread(9)
   Bd1 = Bd(1)
   Bd2 = Bd(2)
   Bd7 = Bd(7)
   Bd8 = Bd(8)
                                               ' read bytes in array
   1wreset                                                  ' reset the bus
      Tmp = Bd1 And 1
      If Tmp = 1 Then Decr Bd1                              ' 0.1C precision
          T = Bd1
          T = T * 50
          T = T - 25
          T1 = Bd8 - Bd7
          T1 = T1 * 100
          T1 = T1 / Bd8
          T = T + T1
          T1 = T / 100                                      'store tens
          T = T Mod 100                                     'store decimal number

          Locate 1 , 3
          Lcd "Temperature"
          Locate 2 , 7
          Lcd T1 ; "," ; T
End Sub

End
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
simeon
Član
Član



Pridružen-a: Pon 21 Maj 2007 21:55
Prispevkov: 118
Aktiv.: 0.58
Kraj: Šentjernej

PrispevekObjavljeno: Pon Nov 03, 2014 11:54 am    Naslov sporočila:   Odgovori s citatom

Če želiš zakasnitev 750ms ne smeš zapisati waitms 750, ampak:
Koda:
waitms 250
waitms 250
waitms 250


ker imaš 8 bitni procesor in gre do 255.

_________________
Sej bo bolš!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Obelix
Član
Član



Pridružen-a: Pon 19 Maj 2008 13:59
Prispevkov: 1862
Aktiv.: 9.64
Kraj: Maribor

PrispevekObjavljeno: Pon Nov 03, 2014 12:08 pm    Naslov sporočila:   Odgovori s citatom

Ukaz WAITMS ima argument od 1 do 65535.

Torej bo WAITMS 750 čisto v redu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.83
Kraj: Mengeš

PrispevekObjavljeno: Pon Nov 03, 2014 2:54 pm    Naslov sporočila:   Odgovori s citatom

Prvič slišim za to. Pa dostikrat semže tako pavzo napisal, pa gre vedno skozi. Mogoče imam samo jaz srečo... Mogoče pa tudi na 8 bitnem mlinčku obstajajo dvobajtne spremenljivke??

Si se ti resnično prepričal, preden si tole napisal?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
forest70
Član
Član



Pridružen-a: Ned 20 Jul 2008 1:00
Prispevkov: 588
Aktiv.: 3.08
Kraj: Koper

PrispevekObjavljeno: Pon Nov 03, 2014 3:00 pm    Naslov sporočila:   Odgovori s citatom

To je ta pravo:
'zaženeš meritev temperature
'DS1820 povleče Portc.5 na maso,
'ko opravi konverzijo dvigne nazaj Portc.5
while (! Portc.5 )
'prečitaš meritev .....
Izogibajte se nekih Waitms !!! Evil or Very Mad
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.83
Kraj: Mengeš

PrispevekObjavljeno: Pon Nov 03, 2014 3:07 pm    Naslov sporočila:   Odgovori s citatom

Glej... Eno je test, drugo realnost. Najprej mu mora oživeti testno, šele nato se ukvarjaš s tem. Pa spet ne tako, kot si napisal, ampak tako, da pač izvajaš svoj program in občasno preverjaš temperaturo. Takoj, ko prebereš spet poženeš konverzijo, tako da je ob naslednjem branju zadeva pripravljena.
Če si ujet v while zanki je skoraj isto kot wait ukaz...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
forest70
Član
Član



Pridružen-a: Ned 20 Jul 2008 1:00
Prispevkov: 588
Aktiv.: 3.08
Kraj: Koper

PrispevekObjavljeno: Pon Nov 03, 2014 3:21 pm    Naslov sporočila:   Odgovori s citatom

protoncek je napisal/a:
Glej... Eno je test, drugo realnost. Najprej mu mora oživeti testno, šele nato se ukvarjaš s tem. Pa spet ne tako, kot si napisal, ampak tako, da pač izvajaš svoj program in občasno preverjaš temperaturo. Takoj, ko prebereš spet poženeš konverzijo, tako da je ob naslednjem branju zadeva pripravljena.
Če si ujet v while zanki je skoraj isto kot wait ukaz...

Že že, samo sem hotel nakazat, kdaj je konverzije konec, ker za različne ločljivosti so različni časi konverzije.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
joze
Član
Član



Pridružen-a: Pet 26 Jan 2007 10:27
Prispevkov: 200
Aktiv.: 0.96

PrispevekObjavljeno: Pon Nov 03, 2014 3:31 pm    Naslov sporočila:   Odgovori s citatom

LP!

Preveri še če imaš pullup upor iz 1wire pina na + napajanje (cca. 4.7k).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
protoncek
Član
Član



Pridružen-a: Sre 31 Jan 2007 9:41
Prispevkov: 9573
Aktiv.: 45.83
Kraj: Mengeš

PrispevekObjavljeno: Pon Nov 03, 2014 7:46 pm    Naslov sporočila:   Odgovori s citatom

Aha...tako sier res lahko preverjaš, ja. Sicer jaz tega nikoli nisem delal. Se mi zdi da je to uporabno samo takrat, ko se ti res gre za destinke, da boš odčital temperaturo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
HeBird
Član
Član



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

PrispevekObjavljeno: Pon Nov 03, 2014 10:25 pm    Naslov sporočila:  Re: DS1820, Atmega8 in LCD - Koda ne deluje Odgovori s citatom

lamela123 je napisal/a:
Lep pozdrav!

Koda:

...


 1wreset                                                    'Resetira in začne z komunikacijo
 1wwrite &HCC                                               'Preskoči oddajanje edinstvene ROM kode senzorja. Ta koda se potrebuje, ko je več kot eden senzor na žici.


 1wwrite &H44                                               'Začne A/D pretvornik v senzorju in shrane podatek v scratchpad.

 Waitms 750                                                 'Pretvorba traja do 750ms, zato počakamo preden začnemo brati podatek.

 1wreset
 1wwrite &HCC
 1wwrite &HBE                                               'Pove napravi, da želimo prebrati scratchpad.
 Tempdata(1) = 1wread(9)                                    'Beremo 9 bitov v tempdata(), začnemo pri tempdata(1).
...


Težava je v tem, da mi na LCD ves čas kaže 0 stopinj. Kje je napaka oz. ima kdo delujočo kodo?


Jaz imam ponavadi med "1wreset" in "1wwrite &HCC" še "Lcd Err"; včasih izveš, kaj je narobe, če kaj ne dela. Večinoma mi je pa 0°C kazalo, kadar sem narobe zvezal. Najbolje, da slikaš, kako si zvezal. Smile

_________________
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 -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group