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 

Ura in Temperatura - Bascom
Pojdi na stran 1, 2  Naslednja
 
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
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 893
Aktiv.: 3.77
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Jan 04, 2004 9:56 pm    Naslov sporočila:  Ura in Temperatura - Bascom Odgovori s citatom

Živjo
Prosim za nasvet kako popraviti program, da bom na displeju lahko imel uro in izpis temperature.
Sedaj program izpisuje uro temperatura pa ni točna, kar nekaj izpisuje.
Če onemogočim Timer, pa se temperatura pravilno izpisuje, ura pa seveda ne deluje.

LP.marko

'****************************************
' URA in temperatura
'Marko11
'****************************************
' $sim
Dim Pulse As Bit , Pavza As Bit , Pulse2 As Bit
Dim Clock As Byte , Clock1 As Byte , Clock2 As Byte , Mux As Byte
Dim Sekunde As Byte , Minute As Byte , Ure As Byte
Dim T2 As Integer , Pom_v As Byte
Dim Bd(9) As Byte
Dim Tmp As Byte
Dim T As Integer , T1 As Integer , T3 As Byte
Dim Crc As Byte
Dim Temp_1 As Byte , Temp_2 As Byte , Temp_3 As Byte

$large 'omogoča do 64k
$crystal = 12000000 'Kristal
$regfile = 89c4051.dat 'uProcesor
Declare Sub Beri1820
Declare Sub Temperatura

'P1.1 = RELE
Config 1wire = P3.7
Config Lcd = 16 * 1a
Cursor Off Noblink
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Timer_0_int
Load Timer0 , 250
Priority Set Timer0
Enable Interrupts
Enable Timer0
Start Timer0
Clock = 0
Clock1 = 0
Sekunde = 0
Minute = 0
Ure = 0
'--------------------------------------
Cls
Wait 1

Do
Locate 1 , 3 : Lcd ":"
Locate 1 , 6 : Lcd ":"

If P3.3 = 0 Then 'nastavi minute
Pulse = 1
Incr Minute
Locate 1 , 4 : Lcd Minute
Waitms 255
End If

If P3.4 = 0 Then 'nastavi ure
Pulse = 1
Incr Ure
Locate 1 , 1 : Lcd Ure
Waitms 255
End If

If Pulse = 1 Then
Pulse = 0
Incr Sekunde
Locate 1 , 7 : Lcd Sekunde : Lcd " "

If Sekunde > 59 Then
Sekunde = 0
Incr Minute
Locate 1 , 4 : Lcd Minute : Lcd " "
End If

If Minute > 59 Then
Minute = 0
Incr Ure
Locate 1 , 1 : Lcd Ure : Lcd " "
End If

If Ure > 23 Then
Ure = 0
End If
End If

Temperatura

Loop
End

'///////////////////////////////////////////////////////////

Sub Temperatura
1wwrite &HCC : 1wwrite &H44
Waitms 250
Waitms 250
Waitms 100
Waitms 250
Beri1820

If Err = 1 Then
Cls : Lcd "NI senz."
Else
If Crc = 0 Then
Locate 1 , 11 : Lcd T2 ; "." ; T3 ; Chr(223) ; "C" ; " "
Else
Locate 1 , 11 : Lcd "** " ; " "
End If
End If
End Sub

'/////////////////////////////////////////////////////////////

Sub Beri1820
1wreset
1wwrite &HCC
1wwrite &HBE
Bd(1) = 1wread(9)
1wreset

If Crc = 0 Then
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(Cool - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(Cool : T = T + T1 : T = T / 10
T2 = T / 10
Pom_v = T2 * 10
T3 = T - Pom_v

End If

End Sub

'/////////////////////////////////////////////////////////////////

Timer_0_int:

Incr Clock
If Clock > 19 Then
Clock = 0
Incr Clock1

If Clock1 > 199 Then
Clock1 = 0
Pulse = 1
End If

End If

Return

'**********************************************


Nazadnje urejal/a marko11 Pon Jan 05, 2004 3:18 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Ned Jan 04, 2004 10:16 pm    Naslov sporočila:   Odgovori s citatom

Kar se bascoma tiče ti ne znam pomagat. Na Filemanager najdeš apilikacijo mapa "Vezja načrti"
(Ura,termometerTIV,ASM,HEXPIC16f84,SAA1064,DS1620,PCF8583)
Pisano sicer v assemblerju uporabljen mikrokontroler je pic

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



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 893
Aktiv.: 3.77
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Jan 04, 2004 10:47 pm    Naslov sporočila:   Odgovori s citatom

Hvala Silvo, toda jaz bi rad da ta moj program spravim v pogon.
O PIC-ih nimam pojma, niti o assemblerju nimam pojma, sem se šele začel ukvarjati s programiranjem v Bascomu in to samo iz hobija.
Zato bi rad da mi kdo da kak nasvet kje sem naredil napako.

Pa še to: kako iz filemenagerja downloudat nek primer, nikakor mi ne uspe.

Marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Ned Jan 04, 2004 10:48 pm    Naslov sporočila:   Odgovori s citatom

Marko,

Filemanager je "ločen" od foruma. Tam se registriraj ponovno pa bo šlo Wink



lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Ned Jan 04, 2004 11:31 pm    Naslov sporočila:   Odgovori s citatom

Po vsej verjetnosti ti timer_0_int rutina požre preveč. Poskusi jo skrajšat na minimum in vse kar ni nujno podelaj v glavni zanki. Tole lahko poskusim v prihodnjih dneh. Druga varianta pa bi bila uporaba zunanje ure s PCF8583 ali DS1307. Ta primer najdeš tukaj na forumu.

Mimogrede, malo gledam tole tvojo prekinitveno rutino. Sam bi v prekinitvi pocel nekaj takega:
Koda:
Timer_0_int:         'Vsakih 250 Usek
Incr Clock
If Clock > 99 Then   'ce vec od 99 / vsakih 0.25mili sek
   Clock = 0         'postavi ga na 0
   Incr Clock1       'povecaj clock1
End If
If Clock1 > 39 Then  'ce 40 (40*25 msek) pretekla je 1 sek
   Clock1 = 0        'vrni variablo na 0
   Incr Sekunde      'povecaj sekunde
End If
Return


Lp, Frenki
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
jurem
Član
Član



Pridružen-a: Tor 02 Dec 2003 15:53
Prispevkov: 408
Aktiv.: 1.72
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 05, 2004 8:56 am    Naslov sporočila:   Odgovori s citatom

Marko,

pri uporabi timerjev se časi pri ukazih Wait in Waitms podaljšajo. Če se prav spomnem DS1820 potrebuje 750ms za pretvorbo.

Na download-u revije Svet elektronike se nahaja popravljen program za merjenje temp. z DS1820.

Lp
Jure
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
keops
Neznanec
Neznanec



Pridružen-a: Sre 26 Nov 2003 20:31
Prispevkov: 6
Aktiv.: 0.03
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 05, 2004 1:32 pm    Naslov sporočila:   Odgovori s citatom

Zdravo!

Sicer mi ni jasno na koliko mikro sekund se izvaja prekinitev ampak to morda v tem hipu ni važno. Skrbi me sledeče (kot je napisal tudi Frenki) - pri branju DSja je precej pomembna časovna sinhronizacija branja vodila (ali bolje - pravi oziroma konstanten timing). Torej, če prekinitev oziroma prekinitvena rutina traja predolgo, se lahko zgodi, da branje DSja ni več sinhronizirano. Poskušaj skrajšati prekinitveno proceduro na minimum. Jaz bi jo definiral kot subrotino in jo iz prekinitve klical pod pogojem, da glavni program NE izvaja branja DSja. Seveda pa pri tem potem pride do napake v 'preračunavanju' ure.

Vse skupaj menda ima smisel, saj kot praviš, če izklopiš timer, potem branje DS-ja deluje.

Jaz sicer DSja še nisem priklopil na AVR oziroma uporabil Bascomove procedure, sem pa delal v assamblerju in s procesorji PIC in 68HC11, kjer sem moral 'timing' kar dobro preračunati.

LP
Andrej
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Tor Jan 06, 2004 12:06 am    Naslov sporočila:   Odgovori s citatom

Marko11 podobno varianto sem poskusil na svojem HW. Problem je dejansko interrupt med branjem dallas-a. Zadeva steče, če pred komunikacijo z DS1820 ustaviš timer0 in ga po koncu branja temperature spet poženeš. Izračunati bi moral čas, ki ga porabiš za komunikacijo in naredit ustrezno korekcijo da bi ura še vedno pravilno tekla. Če popraviš tole, mislim da bi morala zadeva teči:
Koda:
Sub Beri1820
stop timer0
1wreset
1wwrite &HCC
1wwrite &HBE
Bd(1) = 1wread(9)
1wreset
start timer0


Konkretno v mojem primeru - program sem znesel skupaj zelo na hitro Embarassed
Koda:
Sub Read1820                                                  'bere senzor 'T za 0.1 C
Stop Timer0
1wreset                                                       'reset
1wwrite &H55                                                  '1Wire ukaz
1wwrite 1820_id(1) , 8
1wwrite &HBE
Bd(1) = 1wread(9)
1wreset
Start Timer0
.
.
.
.


Kodo lahko tudi pripnem, če ti bo kaj pomagalo - nisem se ukvarjal z nastavitvami, ... Preveril sem samo ali stvar dela.

Lp, Frenki
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
jurem
Član
Član



Pridružen-a: Tor 02 Dec 2003 15:53
Prispevkov: 408
Aktiv.: 1.72
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jan 06, 2004 9:04 am    Naslov sporočila:   Odgovori s citatom

Hoj,

ja, Dallasi potrebujejo svoj cas za pretvorbo in kot pravi Andrej, se lahko zgodi, da se prekinitev sprozi ravno takrat, ko DS nekaj bere, posilja itd...

Frenki je zato ustavil timer, vendar na ta nacin ura ne bo tekla natancno... Resitev bi bila, da bi bila prekinitvena rutina napisana minimalisticno:


Timer_0_int:

Incr Clock

Return


Vse ostalo (If stavki itd.) naj bodo v glavni DO-LOOP rutini.

LP
Jure
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Tor Jan 06, 2004 9:59 am    Naslov sporočila:   Odgovori s citatom

Jurem pozdravljen,

Tale predlog z minimalno Timer_0_int rutino se ne obnese. Sem poskusil povsem enako, kot predlagaš vendar z dvomljivim rezultatom.

Glede točnosti ure se strinjam s teboj, čeprav mislim da ura implementirana na ta način v nobenem primeru ne bo vzor natančnosti. Če bi želel stvar izdelat robustno in natančno bi se vsaj jaz odločil za zunanjo uro s PCF ali DS čipom, ki mi mimogrede tudi razbremeni mikrokontroler za druga opravila.

Mislim pa, da je zadevo kot tako ne glede na ustavljen timer možno z ustrezno korekcijo (upoštevanjem časa, ko timer stoji) spravit v okvir uporabnega.

Lp, Frenki
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Tor Jan 06, 2004 10:28 am    Naslov sporočila:   Odgovori s citatom

Malo "Off -topic"

Fantje v assemblerju takih problemov ne poznamo Wink

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



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 893
Aktiv.: 3.77
Kraj: Dobrepolje

PrispevekObjavljeno: Tor Jan 06, 2004 8:34 pm    Naslov sporočila:   Odgovori s citatom

OK, Frenki pripni še kodo.
Hvala.
LP,marko

_________________
Če ne veš kam greš, se ne moreš zgubiti.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Tor Jan 06, 2004 9:02 pm    Naslov sporočila:   Odgovori s citatom

Si sploh poskusil predlagano spremembo Sad ? No kakorkoli, celoto imaš v prilogi.

Lp, Frenki



temp_ura.zip
 Opis:
Problem ure in branja DS1820 na 89C2051

Download
 Ime datoteke:  temp_ura.zip
 Velikost datoteke:  1.16 KB
 Downloadano:  85 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 893
Aktiv.: 3.77
Kraj: Dobrepolje

PrispevekObjavljeno: Tor Jan 06, 2004 9:25 pm    Naslov sporočila:   Odgovori s citatom

Hvala Frenki bom probal, zdajle nimam časa.

No tako sem jaz mislil, tako pomoč marsikdo rabi, z konkretnim primerom, ne pa ovinkarit, to , pa to...,če nekdo ne zna pač ne zna, če bi vedel nebi spraševal.
Še enkrat hvala, pa tako naprej pa bo verjetno zelo veliko obiskov in raznih projektov in debat itd...

LP, marko

_________________
Če ne veš kam greš, se ne moreš zgubiti.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jurem
Član
Član



Pridružen-a: Tor 02 Dec 2003 15:53
Prispevkov: 408
Aktiv.: 1.72
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 07, 2004 3:27 pm    Naslov sporočila:   Odgovori s citatom

Lep pozdrav!

Silvo, jasno da pri programiranju z ASM nimas tezav, ker pac prestejes vse impulze/milisekunde, ki jih potrebujes za branje/pisanje v DS1820, vmes pa lahko stejes impulze za uro in ce je cesa prevec/premalo, odstejes/pristejes in je...
Je pa taksen nacin mukotrpen - to se strinjas. Zato nekateri uporabljamo Bascom in kaksne druge visje jezike... Laughing

Resitev v Bascomu bi bila: najprej bi moral ugotoviti, koliko strojnih ciklov uporabi Bascom za branje/pisanje v DS1820. Ko je to znano, lahko za cas branja/pisanja ugasnes timer, preberes/pises v DS1820 in potem pristejes stevilo "izgubljenih" taktov k uri.

Ce tudi to ni sprejemljiva resitev, potem ostaja RTC (real time clock) cip, ki preko I2C posilja podatek v uC, kot predlaga Frenki.

Frenki, zakaj ne dela minimalisticna prekinitvena rutina?

LP
Jure
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 1, 2  Naslednja
Stran 1 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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group