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 

Termostat z ATMEGA16/32, 3x DS1820, LCD 16*2 ter 3x Tipka

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



Pridružen-a: Pon 16 Nov 2009 23:33
Prispevkov: 40
Aktiv.: 0.21
Kraj: Beltinci

PrispevekObjavljeno: Sre Jan 05, 2011 2:23 pm    Naslov sporočila:  Termostat z ATMEGA16/32, 3x DS1820, LCD 16*2 ter 3x Tipka Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.68
Kraj: KOPER

PrispevekObjavljeno: Sre Jan 05, 2011 2:26 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.24
Kraj: Ig

PrispevekObjavljeno: Sre Jan 05, 2011 3:05 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Jan 05, 2011 3:13 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 3.78
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Sre Jan 05, 2011 3:50 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
hadik1
Član
Član



Pridružen-a: Pon 16 Nov 2009 23:33
Prispevkov: 40
Aktiv.: 0.21
Kraj: Beltinci

PrispevekObjavljeno: Sre Jan 05, 2011 8:05 pm    Naslov sporočila:   Odgovori s citatom

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



3 x DS1820 ATMEGA16.png
 Opis:
SHEMA
 Velikost datoteke:  71.74 KB
 Pogledana:  93 krat

3 x DS1820 ATMEGA16.png


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.24
Kraj: Ig

PrispevekObjavljeno: Sre Jan 05, 2011 11:34 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vilko
Član
Član



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

PrispevekObjavljeno: Čet Jan 06, 2011 12:43 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Profesor Einstein
Član
Član



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

PrispevekObjavljeno: Čet Jan 06, 2011 9:28 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 12.46
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Čet Jan 06, 2011 9:54 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
hadik1
Član
Član



Pridružen-a: Pon 16 Nov 2009 23:33
Prispevkov: 40
Aktiv.: 0.21
Kraj: Beltinci

PrispevekObjavljeno: Sre Feb 02, 2011 11:57 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
hadik1
Član
Član



Pridružen-a: Pon 16 Nov 2009 23:33
Prispevkov: 40
Aktiv.: 0.21
Kraj: Beltinci

PrispevekObjavljeno: Sob Feb 05, 2011 10:34 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



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

PrispevekObjavljeno: Sob Feb 05, 2011 11:00 am    Naslov sporočila:   Odgovori s citatom

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


Powered by phpBB © 2001, 2005 phpBB Group