|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
lamela123 Član
Pridružen-a: Sob 10 Mar 2012 15:15 Prispevkov: 232 Aktiv.: 1.57 Kraj: Celje
|
Objavljeno: Ned Nov 02, 2014 9:49 am Naslov sporočila: DS1820, Atmega8 in LCD - Koda ne deluje |
|
|
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 |
|
|
kose19 Član
Pridružen-a: Sre 02 Mar 2005 19:37 Prispevkov: 1228 Aktiv.: 5.51 Kraj: okolica Kobarida
|
Objavljeno: Ned Nov 02, 2014 10:12 am Naslov sporočila: |
|
|
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 |
|
|
protoncek Član
Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 45.67 Kraj: Mengeš
|
Objavljeno: Ned Nov 02, 2014 2:26 pm Naslov sporočila: |
|
|
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 |
|
|
simeon Član
Pridružen-a: Pon 21 Maj 2007 21:55 Prispevkov: 118 Aktiv.: 0.57 Kraj: Šentjernej
|
Objavljeno: Pon Nov 03, 2014 11:54 am Naslov sporočila: |
|
|
Č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 |
|
|
Obelix Član
Pridružen-a: Pon 19 Maj 2008 13:59 Prispevkov: 1862 Aktiv.: 9.61 Kraj: Maribor
|
Objavljeno: Pon Nov 03, 2014 12:08 pm Naslov sporočila: |
|
|
Ukaz WAITMS ima argument od 1 do 65535.
Torej bo WAITMS 750 čisto v redu. |
|
Nazaj na vrh |
|
|
protoncek Član
Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 45.67 Kraj: Mengeš
|
Objavljeno: Pon Nov 03, 2014 2:54 pm Naslov sporočila: |
|
|
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 |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.07 Kraj: Koper
|
Objavljeno: Pon Nov 03, 2014 3:00 pm Naslov sporočila: |
|
|
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 !!! |
|
Nazaj na vrh |
|
|
protoncek Član
Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 45.67 Kraj: Mengeš
|
Objavljeno: Pon Nov 03, 2014 3:07 pm Naslov sporočila: |
|
|
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 |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.07 Kraj: Koper
|
Objavljeno: Pon Nov 03, 2014 3:21 pm Naslov sporočila: |
|
|
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 |
|
|
joze Član
Pridružen-a: Pet 26 Jan 2007 10:27 Prispevkov: 200 Aktiv.: 0.95
|
Objavljeno: Pon Nov 03, 2014 3:31 pm Naslov sporočila: |
|
|
LP!
Preveri še če imaš pullup upor iz 1wire pina na + napajanje (cca. 4.7k). |
|
Nazaj na vrh |
|
|
protoncek Član
Pridružen-a: Sre 31 Jan 2007 9:41 Prispevkov: 9573 Aktiv.: 45.67 Kraj: Mengeš
|
Objavljeno: Pon Nov 03, 2014 7:46 pm Naslov sporočila: |
|
|
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 |
|
|
HeBird Član
Pridružen-a: Ned 16 Avg 2009 16:36 Prispevkov: 79 Aktiv.: 0.44 Kraj: Domžale
|
Objavljeno: Pon Nov 03, 2014 10:25 pm Naslov sporočila: Re: DS1820, Atmega8 in LCD - Koda ne deluje |
|
|
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. _________________ Gašper |
|
Nazaj na vrh |
|
|
|
|
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: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|