 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
hadik1 Član

Pridružen-a: Pon 16 Nov 2009 23:33 Prispevkov: 40 Aktiv.: 0.21 Kraj: Beltinci
|
Objavljeno: Sre Jan 05, 2011 2:23 pm Naslov sporočila: Termostat z ATMEGA16/32, 3x DS1820, LCD 16*2 ter 3x Tipka |
|
|
Pozdravljeni
Potreboval bi malo vaše pomoči. Nameravam narediti termostat z ATMEGA16/32, LCD 16*2, 3xDS1820 v BASCOM AVR.
Pri merjenju treh temperatur s tremi senzorji na treh različnih portih ter izpis na LCD mi je uspelo napisati program. (T_zgoraj=PD0; T_spodaj=PD1; T_ zunaj=PD2).
Težave imam pa pri krmiljenju izhodnih relejev (Rele1=PD3 - gorilec; Rele2=PD4 - ventilator). Naredil bi pa rad tako, da ko bi recimo T_spodaj padla pod recimo 15˙C bi se naj vklopil rele1 in počakal 15s, nato bi se pa vklopil rele2. udi to mi je še nekak uspelo in sicer z ukazom »WAIT. Potem pa ko bi temperatura T_spodaj narasla nad recimo 25˙C bi se pa naj izklopil rele1 in počakal nekje 240s (4 minute), da se peč ohladi nato pa izklopil Rele2. Tudi to mi je še nekak uspelo in sicer z »wait«. Problem je pa v tem, ker med tem časom mi ne kaže oz. ne meri temperatur (v času izvajanja Wait). Sem gledal po forumih in bi naj uporabljal namesto Wait timer-je, vendar ne vem kje bi se lotil. Zato bi vas lepo prosil za pomoč. Sem že bolj začetnik v tem, in ne vem kako bi se lahko drugače lotil zadeve. Mogoče ima kdo celo kakšen podoben program napisan.
Pa lepo bi še prosil, če zna kdo mogoče kako bi se dodal tri tipke za nastavitev želene temperature vklopa in izklopa. (Tipka+; Tipka-; Tipka_potrditev) ter prikaz na LCD, v času nastavitve temperature.
Že v naprej se vam najlepše zahvaljujem, pa srečno in uspešno
|
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.68 Kraj: KOPER
|
Objavljeno: Sre Jan 05, 2011 2:26 pm Naslov sporočila: |
|
|
Pripni načrt ter kodo pa ti bomo lažje pomagali ! Tudi kraj od koder si zamenjaj.
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Sre Jan 05, 2011 3:05 pm Naslov sporočila: |
|
|
Ta problem boš res najlažje rešil s timerji. Tukaj ti bom razložil, kako v bascomu poženeš timer, in kaj moraš narediti, da ti bo stvar delovala.
Najprej moraš konfigurirati timer, to narediš takole (za Timer0):
Config Timer0 = Timer , Prescale = 1024
Tisti Prescale = 1024 ti pove, s koliko se bo delil takt mikrokontrolerja. Se pravi, če imaš zunanji kristal, ki ti teče na 11059200Hz, se bo vrednost timerja0 povečala vsakih 11059200/1024 = 10800 ciklov ali 0,0925ms.
Pol je potrebno Timer0 omogočiti:
Enable Timer0
S tem nisi dosegel še nič.
Moraš še omogočiti prekinitve:
Enable Interrupts
Pa še povedati moraš, kaj naj se zgodi ob določenem dogodku, recimo, ko 8 bitni timer0 prešteje do konca (255) se zgodi overflow, in ta dogodek bi ti rad izkoristil. Overflow se bo zgodil natanko po : 0,0925ms*255 = 23,6ms
On Ovf0 Napravi_to_pa_to
Sedaj lahko startaš timer0:
Start Timer0
Sedaj ti timer teče, vsakih 23,6ms se ti bo zgodila prekinitev, program bo avtomatsko skočil na subrutino Napravi_to_pa_to in ti moraš samo šteti število prekinitev, ki ustrezajo tvojemu času. Zraven ti prilagam še en program, ki počne prav to, malce ga boš moral pogledati, če pa ti kaj ne bo jasno, pa vrašaj.
LP G
Koda: |
$regfile = "attiny26.dat"
$crystal = 8000000
Deflcdchar 1 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 32
Deflcdchar 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 31
Deflcdchar 4 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16
Dim Clock As Word , Ura As Integer , Ura1 As Byte , Clock1 As Word
Dim A As Byte
Config Lcd = 16 * 2
Config Timer0 = Timer , Prescale = 256
Config Int0 = Falling
Cls
On Ovf0 Tim0_isr
On Int0 Int0_int
Enable Interrupts
Enable Timer0
Enable Int0
Lcd ">> (C) 2004 <<"
Lowerline
Lcd ">Rosbach Gorazd<"
Wait 1
For A = 1 To 16
Shiftlcd Right
Waitms 100
Next A
Cls
Start Timer0
Do
Ura = Clock1 / 122
Ura1 = Clock1 Mod 122
Lcd " Cas ciklusa "
Lowerline
Lcd " " : Lcd Ura : Lcd "," : Lcd Ura1 : Lcd " sekund "
Locate 1 , 16
Lcd Chr(1)
Waitms 150
Locate 1 , 16
Lcd Chr(2)
Waitms 150
Locate 1 , 16
Lcd Chr(3)
Waitms 150
Locate 1 , 16
Lcd Chr(4)
Waitms 150
Loop
Tim0_isr:
Incr Clock
Return
Int0_int:
Waitms 1
Disable Int0
Stop Timer0
Clock1 = Clock
Clock = 0
Start Timer0
Enable Int0
Return
|
_________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Jan 05, 2011 3:13 pm Naslov sporočila: |
|
|
Basoma ne poznam. Lahko pa opozorim na pasti, ji jih skriva sam senzor DS1820. Protokol 1Wire je časovno zelo odvisen. Torej v določenih trenutkih v času izvajanje NE SME biti prekinjen, sicer je lahko poslana ali sprejeta informacija napačna. Ne vem, kako to obravnavajo bascomove funkcije. V koliko same ne izključujejo interupotov potem je to potrebno storiti pred meritvijo.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
žrepko Član

Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 3.78 Kraj: Ptuj-Maribor
|
Objavljeno: Sre Jan 05, 2011 3:50 pm Naslov sporočila: |
|
|
Enkrat sem se lotil zadeve s Tiny2313, ki opravlja isto funkcijo kot tvoj primer.
LCD je bil na PORTB
3x DS1820 lahko daš na en sam pin,
4x tipka
2x rele
Vse skup torej 15 pinov.
Ne potrebuješ ATmega16 ali 32 za to aplikacijo.
Na protobordu mi je sicer nekaj že delalo ampak sem zaradi primanjkovanja časa vse skup opustil.
Pisal sem pa v C-ju.
|
|
Nazaj na vrh |
|
 |
hadik1 Član

Pridružen-a: Pon 16 Nov 2009 23:33 Prispevkov: 40 Aktiv.: 0.21 Kraj: Beltinci
|
Objavljeno: Sre Jan 05, 2011 8:05 pm Naslov sporočila: |
|
|
Ja vem, da bi lahko uporabil manjši mikrokontroler, vendar sem tega imel pri roki.
Prilgam program in shemo. Program je napisan za merjenje treh temperatur , tu se mi je pa ustavilo.
Koda: |
'Temperatura zgoraj = Portd.0
'Temperatura spodaj = Portd.1
'Temperatura zunaj = Portd.2
'Gorilec = Portd.6
'Ventilator = Portd.6
$regfile "m16def.dat"
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db7 = Porta.7 , Db6 = Porta.6 , Db5 = Porta.5 , Db4 = Porta.4 , E = Porta.2 , Rs = Porta.1
Cursor Off
Declare Sub Read1820_tz
Declare Sub Read1820_tv
Declare Sub Read1820_tg
Declare Sub Temperature_z
Declare Sub Temperature_v
Declare Sub Temperature_g
Dim Bd(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Integer , Tz As Integer , Tv As Integer , Tg As Integer
Dim V As Byte , A As Byte
Dim G As Byte
Dim Tz1 As Integer
Dim Tz2 As Integer
Dim Tv1 As Integer
Dim Tv2 As Integer
Dim Tg1 As Integer
Dim Tg2 As Integer
Portd = 0
Config 1wire = Portd.0
Config 1wire = Portd.1
Config 1wire = Portd.2
config portd.3=input
config portd.4=input
config portd.5=input
Config Portd.6 = Output
Config Portd.7 = Output
T_plus Alias Portd.3
T_minus Alias Portd.4
T_potrditev Alias Portd.5
Gorilec Alias Portd.6
Ventilator Alias Portd.7
Cursor Off Noblink
Cls
Lcd "***TERMOMETER***"
Locate 2 , 1
Lcd "*** z DS1820 ***"
Wait 3
For A = 1 To 16
Shiftlcd Left 'shift the text to the right
Waitms 150 'wait a moment
Next
Waitms 250
Cls
Lcd "*Tg* *Td* *Tz*"
Portc.3 = 0
Do
Zanka:
Temperature_z
Waitms 250
Temperature_v
Waitms 250
Temperature_g
Waitms 250
If Tv1 < 37 Then 'Tukaj je pogoj za celi del temperature
Portc.3 = 1
If Err = 1 Then Portc.3 = 0
Goto Zanka
Else
Portc.3 = 0
Goto Drugipogoj
End If
If Err = 1 Then Portc.3 = 0
Loop
Drugipogoj:
If Tv1 = 37 Then
Goto Tretjipogoj
Else
Goto Zanka
End If
Tretjipogoj:
If Tv2 < 9 Then 'Tukaj je pogoj za decimalni del temperature
Portc.3 = 1
Goto Zanka
Else
Portc.3 = 0
Goto Zanka
End If
End
'//////////////////////////////////////////////////////////////////////////////
Sub Temperature_z
1wwrite &HCC , 1 , Pind , 0
1wwrite &H44 , 1 , Pind , 0
Waitms 250
Read1820_tz
If Err = 1 Then
Locate 2 , 1 : Lcd "--- "
Else
Locate 2 , 1 : Lcd Tz1 ; "," ; Tz2 ;
End If
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Temperature_v
1wwrite &HCC , 1 , Pind , 1
1wwrite &H44 , 1 , Pind , 1
Waitms 250
Read1820_tv
If Err = 1 Then
Locate 2 , 7 : Lcd "--- "
Else
Locate 2 , 7 : Lcd Tv1 ; "," ; Tv2;
End If
End Sub
Sub Temperature_g
1wwrite &HCC , 1 , Pind , 2
1wwrite &H44 , 1 , Pind , 2
Waitms 250
Read1820_tg
If Err = 1 Then
Locate 2 , 13 : Lcd "--- "
Else
Locate 2 , 13 : Lcd Tg1 ; "," ; Tg2;
End If
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Read1820_tz
1wreset Pind , 0
Portd.0 = 1
1wwrite &HCC , 1 , Pind , 0
1wwrite &HBE , 1 , Pind , 0
Bd(1) = 1wread(9 , Pind , 0)
1wreset Pind , 0
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
Tz = T
Tz1 = Tz / 10
Tz2 = Tz Mod 10 : Tz2 = Abs(tz2)
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Read1820_tv
1wreset Pind , 1
Portd.1 = 1
1wwrite &HCC , 1 , Pind , 1
1wwrite &HBE , 1 , Pind , 1
Bd(1) = 1wread(9 , Pind , 1)
1wreset Pind , 1
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
Tv = T
Tv1 = Tv / 10
Tv2 = Tv Mod 10 : Tv2 = Abs(tv2)
End Sub
Sub Read1820_tg
1wreset Pind , 2
Portd.2 = 1
1wwrite &HCC , 1 , Pind , 2
1wwrite &HBE , 1 , Pind , 2
Bd(1) = 1wread(9 , Pind , 2)
1wreset Pind , 2
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
Tg = T
Tg1 = Tg / 10
Tg2 = Tg Mod 10 : Tg2 = Abs(tg2)
End Sub |
Opis: |
|
Velikost datoteke: |
71.74 KB |
Pogledana: |
93 krat |

|
|
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Sre Jan 05, 2011 11:34 pm Naslov sporočila: |
|
|
Prva stvar, ki mi pade v oči je to, da nimaš nikjer definiranega kristala?! Tako kompajler nima najmanjšega pojma, s kakim taktom naj operira in posledično se lahko zgodi, da wait 1 ni 1 s, ampak je lahko bistveno več ali manj. V svoj program vstavi na vrhu, kjer imaš definiran čip še tole $crystal = 1000000 za 1MHz kristal. Ti vstavi vrednost svojega kristala, potem pa uporabi timer. ČE ti zašteka, vprašaj.
LP G
_________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Čet Jan 06, 2011 12:43 am Naslov sporočila: |
|
|
RGorazd je napisal/a: |
Prva stvar, ki mi pade v oči je to, da nimaš nikjer definiranega kristala?! |
Ja, to je slaba razvada. Če frekvenca nihanja oscilatorja oziroma kristala ni definirana, Bacom prevajalnik privzame vrednost, ki ji je dana pod Options>communication>frequency, kar ni nujno tisto ta pravo.
Vendar je tako ta način, kot definicija $crystal v programu le informacija prevajalniku, da naj bi mikrokrmilnik nihal s tako in tako frekvenco. Prevajalnik potrebuje to informacijo za iizvajanje vseh ukazov, ki predvidevajo časovne ritme (bodne hitrosti komunikacije, wait ukaze in podobno).
S kakšno hitrostjo bo pa avr res nihal, se določa z Fuse and Lock biti. In ti naj bodo nastavljeni na isto hitrost, kot to predvideva po naših navodilih prevajalnik.
|
|
Nazaj na vrh |
|
 |
Profesor Einstein Član


Pridružen-a: Ned 24 Sep 2006 0:13 Prispevkov: 1437 Aktiv.: 6.30 Kraj: Rogaška Sl.
|
Objavljeno: Čet Jan 06, 2011 9:28 am Naslov sporočila: |
|
|
Zdravo
Jaz imam slabo izkušnjo s timerji in 1wire komunikacijo v bascomu.
Vedno je treba timer ustavit ko greš v čitanje temperature in ga nato ponovno aktivirati v kolikor delaš s timerji.
V primeru uporabe I^2C komunikacije pa ni težav pri uporabi timerjev.
Lp.
Darko
_________________ --
"Če bi volitve kaj pomagale, bi jih prepovedali." (Mark Twain) |
|
Nazaj na vrh |
|
 |
mucek4 Član


Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 12.46 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Čet Jan 06, 2011 9:54 am Naslov sporočila: |
|
|
Lahko rešiš tudi brez timerjev
Koda: |
ponoviš 240 krat {
pričneš konverzijo DS1820 temperatur;
počakaš eno sekundo;
zmeriš temperature;
prikažeš na display;
} ; |
|
|
Nazaj na vrh |
|
 |
hadik1 Član

Pridružen-a: Pon 16 Nov 2009 23:33 Prispevkov: 40 Aktiv.: 0.21 Kraj: Beltinci
|
Objavljeno: Sre Feb 02, 2011 11:57 am Naslov sporočila: |
|
|
pozdravljeni,
končno sem po dolgem času našel malo časa in nadaljeval z mojim projektom.
časovno zakasnitev sem rešil tako kot je predlagal Mucek4 (240 ponovitev).
v zanko sem dodal še pogoj za vklop in izklop.
Koda: |
Zanka:
Temperature_z
Waitms 250
Temperature_v
Waitms 250
Temperature_g
Waitms 250
if tv1 < 16 then
goto vklop
else
goto zanka
end if
if tv1 > 20 then
goto izklop
else
goto zanka
end if
|
Naslednji korak bi pa rad naredil, da bi s pomočjo treh tipk (Tipka+; Tipka-; Tipka_potrditev) nastavil željeno temperaturo vklop in izklopa, vendar nevem kako bi se lotil te zadeve.
Recimo, da bi na začetku rad na zaslono da se izpiše "Temperatura vklopa" XX in bi potem s tipko+ in tipko- nastavil željeno temeraturo in potem s pritiskom na tipko_potrditev shranil nastavljeno temperaturo v "tepm_vklopa" in jo nato primerjal z izmerjeno temperaturo. Torej bi v zanko vstavil namesto konstan (if tv1 < 16 then) vstavil nastavljene temperature (if tv1 < tepm_vklopa then).
Prav tako tudi za temperaturo izklopa.
Prosim za pomoč in nasvete kako, na kak način naj se lotim zadeve.
LP DENIS
|
|
Nazaj na vrh |
|
 |
hadik1 Član

Pridružen-a: Pon 16 Nov 2009 23:33 Prispevkov: 40 Aktiv.: 0.21 Kraj: Beltinci
|
Objavljeno: Sob Feb 05, 2011 10:34 am Naslov sporočila: |
|
|
Pozdrav,
Nihče ne ve, kako se vnešene podatke shrani v določeno spremenljivko?
Lepo prosim za pomoč.
Lep dan še naprej
|
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3358 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Feb 05, 2011 11:00 am Naslov sporočila: |
|
|
O, ja, samo v ta namen je potrebno malo več kode, kot bi jo lahko vpisal tukaj. Poleg tega je potrebna neka izhodna enota, ki ti pove, kje se trenutno nahaja spremenljivka, ki jo naslavljaš, da veš kako pritiskati tipke. Varianta je tudi, da imaš 12 tipk tipkovnico s številkami, kjer vsaka tipa definira svojo številko, podobno, kot tipkovnico, kot jo imaš na svojem mobitelu...
To je tema za celo poglavje neke knjige, recimo knjige Programiranje mikrokontrolera programskih jezikom Bascom. Tam je to opisano na straneh od 33 do 53. Saj razumeš, da tolikšne vsebine ne moremo natresti tukaj, kaj ne?
|
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|