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



Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 893 Aktiv.: 3.77 Kraj: Dobrepolje
|
Objavljeno: Ned Jan 04, 2004 9:56 pm Naslov sporočila: Ura in Temperatura - Bascom |
|
|
Ž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( - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd( : 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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Jan 04, 2004 10:16 pm Naslov sporočila: |
|
|
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 |
|
 |
marko11 Član



Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 893 Aktiv.: 3.77 Kraj: Dobrepolje
|
Objavljeno: Ned Jan 04, 2004 10:47 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Jan 04, 2004 10:48 pm Naslov sporočila: |
|
|
Marko,
Filemanager je "ločen" od foruma. Tam se registriraj ponovno pa bo šlo
lp
Silvo
|
|
Nazaj na vrh |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Ned Jan 04, 2004 11:31 pm Naslov sporočila: |
|
|
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 |
|
 |
jurem Član


Pridružen-a: Tor 02 Dec 2003 15:53 Prispevkov: 408 Aktiv.: 1.72 Kraj: Ljubljana
|
Objavljeno: Pon Jan 05, 2004 8:56 am Naslov sporočila: |
|
|
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 |
|
 |
keops Neznanec

Pridružen-a: Sre 26 Nov 2003 20:31 Prispevkov: 6 Aktiv.: 0.03 Kraj: Ljubljana
|
Objavljeno: Pon Jan 05, 2004 1:32 pm Naslov sporočila: |
|
|
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 |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Tor Jan 06, 2004 12:06 am Naslov sporočila: |
|
|
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
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 |
|
 |
jurem Član


Pridružen-a: Tor 02 Dec 2003 15:53 Prispevkov: 408 Aktiv.: 1.72 Kraj: Ljubljana
|
Objavljeno: Tor Jan 06, 2004 9:04 am Naslov sporočila: |
|
|
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 |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Tor Jan 06, 2004 9:59 am Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Jan 06, 2004 10:28 am Naslov sporočila: |
|
|
Malo "Off -topic"
Fantje v assemblerju takih problemov ne poznamo
lp
Silvo
|
|
Nazaj na vrh |
|
 |
marko11 Član



Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 893 Aktiv.: 3.77 Kraj: Dobrepolje
|
Objavljeno: Tor Jan 06, 2004 8:34 pm Naslov sporočila: |
|
|
OK, Frenki pripni še kodo.
Hvala.
LP,marko
_________________ Če ne veš kam greš, se ne moreš zgubiti. |
|
Nazaj na vrh |
|
 |
frenki Moderator



Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6732 Aktiv.: 28.42 Kraj: Ljubljana (JN76GB)
|
|
Nazaj na vrh |
|
 |
marko11 Član



Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 893 Aktiv.: 3.77 Kraj: Dobrepolje
|
Objavljeno: Tor Jan 06, 2004 9:25 pm Naslov sporočila: |
|
|
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 |
|
 |
jurem Član


Pridružen-a: Tor 02 Dec 2003 15:53 Prispevkov: 408 Aktiv.: 1.72 Kraj: Ljubljana
|
Objavljeno: Sre Jan 07, 2004 3:27 pm Naslov sporočila: |
|
|
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...
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 |
|
 |
|
|
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
|