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

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Pet Jul 16, 2010 10:31 am Naslov sporočila: attiny2313 in točen delay |
|
|
pozdravljeni,
sem začetnik pri programiranju nasploh in se trudim v bascomu...
prosim če mi lahko kdo pomaga
imam že narejen izdelek pri katerem se je kasneje pojavila potreba po 30 sekundnem čakanju.
(prelistal tudi ta forum, žal nisem razrešil težave)
definiran imam zunanji kristal (vrednost in fusebit) - 3686000
pri prebiranju raznih forumov, navodil... sem ugotovil da bi bilo lažje če bi bil kristal 4mhz...
ker ne potrebujem nujno zunanjega lahko uporabim tudi notranjega, želim samo da bo delay 30 sekund.
torej enostavno ne uspem iz podobnih primerov izluščiti kako in kaj in očitno ne razumem navodil iz helpa.
kako se definira in uporabi timer ali counter oziroma, kaj je najbolj enostavna rešitev?
del kjer bi potreboval delay izgleda nekako takole:
ukaz wait pri vrednosti 30 včasih traja 23sekund, včasih 40 in podobno
...
if pinxy=0 then
wait 30
else
...
če je vhod 0, glede na okoliščine uporabe izdelka, vem da traja dogodek pred končanjem 30 sekund, zato počakam če bo po tem času zopet 1 (zavrtim loop),
če je 0 se izvede drugi del
vhod v teh 30 sekundah lahko niha iz 0 v 1 in obratno nepredvidljivo, tako me zanima samo stanje po 30ti sekundi.
upam da je razumljivo.
hvala za pomoč |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Pet Jul 16, 2010 10:57 am Naslov sporočila: |
|
|
Priložena je ena od možnosti:
Dela pod interuptom.
Koda: |
$regfile = "attiny2313.dat"
$crystal = 4000000
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
In_0 Alias Pind.3
In_1 Alias Pind.4
In_2 Alias Pind.5
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Portb = 0
M0 Alias Portb.0
M1 Alias Portb.1
M2 Alias Portb.2
Dim A As Byte
Dim Timer_v0 As Word
Dim M_sek As Word
Dim Sek_f As Bit
Timer_v0 = 0
Const Timer0reload = 3
Config Timer0 = Timer , Prescale = 1024
Load Timer0 , Timer0reload
On Ovf0 Timer0_isr
Enable Ovf0
Start Timer0
Enable Interrupts
'------------------------------------------------------------
Do
If Timer_v0 = 0 And In_0 = 0 Then Timer_v0 = 1 'Tu postavimo pogoje,da timer prišteva
If Timer_v0 = 99 And In_0 = 1 Then Timer_v0 = 0 'po 100 milisekundah ponovno preveri stanje vhoda
If Timer_v0 = 100 And In_0 = 0 And M0 = 0 Then Set M0 'postavi izhod motor0
If Timer_v0 = 30100 Then Reset M0 'po 30000ms je trideset sekund + začetnih 100ms ugasni izhod motor0
If Timer_v0 > 31000 Then Timer_v0 = 0 'v casu od 30100ms do 31000ms ne mores brati vhoda.
Loop
'------------------------------------------------------------
Timer0_isr:
Load Timer0 , Timer0reload
If Timer_v0 > 0 Then Incr Timer_v0
If M_sek = 1000 Then Set Sek_f
Return
'------------------------------------------------------------
End
|
_________________ Lep pozdrav iz Kopra Rudi
Nazadnje urejal/a rudiP Ned Jul 18, 2010 1:26 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Pet Jul 16, 2010 11:03 am Naslov sporočila: |
|
|
u hvala to je bilo pa hitro
si bom moral čas vzet pa pregledat kako je sestavljeno tukaj
hvala |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3387 Aktiv.: 15.99
|
Objavljeno: Pet Jul 16, 2010 11:11 am Naslov sporočila: |
|
|
Glede na tvoje pisanje in če ga pravilno razumem, moraš ti čakati, da se zgodi nek dogodek, ki traja nekje do 30 sekund, pa to ni vedno točno.
Jaz bi raje v tem primeru preverjal, če se je dogodek že zgodil (kar že itak počneš - preverjaš pinxy) in bi mogoče raje uporabil while zanko (ali jo Bascom ima, jaz namreč uporabljam C). Torej bi v While zanki preverjal, če je tvoj pogoj izpolnjen, in ko je izpolnjen, sledi izstop iz while zanke in nadaljevanje programa.
Druga možnost je zopet uporaba prekinitev, ki se zgodi takrat, ko tvoj pinxy signalizira, da se je dogodek zgodil. Vmes med čakanjem pa mikro lahko počne kaj drugega... Glej poglavje "External interrupts" v datasheetu...
Če pa resnično potrebuješ štetje časa, pa poglej tudi uporabo timerja v Datasheetu od 2313 - poglavje "8 bit timer/counter....." Ker ima timer več možnosti uporabe. Lahko ga uporabljaš tudi (predvsem) v prekinitvi in medtem počneš kaj drugega... S prekinitvijo pa recimo šteješ sekunde in ko prideš do 30, pregledaš svoje pogoje.
Kot pa sem že rekel, ti s primerom ne znam pomagat, uporabljam C jezik...
Edit: ali si tole temo že pregledal? |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Pet Jul 16, 2010 11:31 am Naslov sporočila: |
|
|
če razširim razlago delovanja "naprave",
gre za 3 kanalni audio preklopnik, ki ima določene prioritete -
3.kanal je aktiven(če je signal prisoten) ne glede na preostale vhode,
2.kanal je aktiven kadar ima stanje 1 in če ni prisoten 3.kanal
1.kanal je aktiven če nista prisotna signala 3. in 2. kanala
na 3.kanalu je jukebox in pri menjanju CDja iz ene skrajne lege na drugo potrebuje cca 30sekund.
z tem delayom ki ga želim doseči bi rad preprečil nepotrebno preklapljanje med kanali. sedaj se dogaja da ko se menja cd ki ni na drugem koncu "seržerja"
potrebuje cca 15s in med tem je pač tišina, če pa recimo menja 20 s se občasno zgodi da preklopi na 1.kanal kjer je radio (in 2.kanal nima signala) in potem čez 2s nazaj na 3.kanal - ker je pač prioriteta višja.
prisotnost signala detektiram preko RCA konektorja z OPamp.
če ima komad vmes "tišino" potem tudi na vhodu nimam stanja 1, tako potrebujem počasno odzivnost - kar načeloma do sedaj deluje brez težav, problem je samo pri tem velikem "počakaj". |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3387 Aktiv.: 15.99
|
Objavljeno: Pet Jul 16, 2010 11:39 am Naslov sporočila: |
|
|
Mogoče pa detektiraš, da se je začela menjava (na enem vhodu - mogoče je to celo isti, ki ti pove, da je menjava CD končana) in v tem času prepoveš menjavo kanalov.
Torej dokler je menjava v teku, naj se suče v zaprti zanki...  |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Pet Jul 16, 2010 11:44 am Naslov sporočila: |
|
|
ker detektiram preko audio signala nevem ali je konec komada, tišina v komadu ali menjava cd-ja, zato v vsakem primeru počakam da se izteče 30s ker če po tem času še vedno ni signala pomeni da je konec komada, menjava je končana ali je sploh ni in lahko preklopi na drug kanal |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Ned Jul 25, 2010 8:01 am Naslov sporočila: |
|
|
tole zaenkrat kar gre, verjetno tudi malo nerodno sestavljeno.
ali je smiselno timer in interrupt imeti ves čas disablan (ga ne potrebujem) in ga vklopim samo takrat ko ga potrebujem?
ali pa je vseeno če neprestano teče?
Koda: |
' L fuse: 0xCD
' H fuse: 0xDF
$crystal = 3686000
$regfile = "attiny2313.dat"
Config Portd.5 = Output 'Zel
Config Portd.3 = Output 'Rd
Dim Sek As Byte
Config Timer1 = Timer , Prescale = 1024
On Ovf1 Tim1_isr
Load Timer1 , 3600
Enable Timer1
Enable Interrupts
Main:
Sek = 0
Portd.5 = 1
Portd.3 = 0
Waitms 500
Do
If Sek >= 25 Then
Goto Main
Else
Portd.3 = 1
Portd.5 = 0
End If
Loop
Tim1_isr:
Load Timer1 , 3600 ' 65535-(3686000/1024) = 61935.39 => 61935; 65535-61935=3600
Sek = Sek + 1
Return
End
|
|
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Ned Jul 25, 2010 9:05 am Naslov sporočila: |
|
|
Ko ne veš kako napisati , lahko napišeš tudi nerodno. Meni je nerodno, ko vidim da si iz BUTAL. Daj popravi kraj bivanja.
V primeru števec začne šteti, ko se spremeni vhod iz "1" v "0".
Koda: |
$crystal = 3686000
$regfile = "attiny2313.dat"
Config Portd.5 = Output 'Zel
Zelena Alias Portd.5
Config Portd.3 = Output 'Rd
Rdeca Alias Portd.3
Config Pind.4 = Input ' dodano nisem preverjal
Vhod Alias Portd.4 'aktiven je ko je na vhodu logična 0
Dim Sek As Byte
Config Timer1 = Timer , Prescale = 1024
On Ovf1 Tim1_isr
Load Timer1 , 3600
Enable Timer1
Enable Interrupts
Main:
Sek = 0
Set Zelena 'Set Portd.5 Portd.5 = 1
Reset Rdeca 'Reset Portd.3 Portd.3 = 0
Waitms 500
'-------------------------------------------------------------------------------
Do
If Vhod = 0 And Sek = 0 Then 'ko je vhod aktiven "0" in sek=0
Incr Sek 'Predpogoj, da se v interaptu inkrementira sek
Reset Rdeca 'Portd.3 = 0
Set Rdeca 'Portd.5 = 1
End If
If Sek = 25 Then 'Ko sesteje 25 sekund da sek na nulo , tako da se v int ne inkrementira vec
Sek = 0
Set Rdeca 'Portd.3 = 1
Reset Zelena ' Portd.5 = 0
End If
Loop
'-------------------------------------------------------------------------------
Tim1_isr:
Load Timer1 , 3600 ' 65535-(3686000/1024) = 61935.39 => 61935; 65535-61935=3600
If Sek > 0 Then Incr Sek 'Sek = Sek + 1
Return
'-------------------------------------------------------------------------------
End
|
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Ned Jul 25, 2010 9:33 am Naslov sporočila: |
|
|
sem se preselil...
jep, precej bolj berljivo.
ravno poskušam prenesti ta del timerja v obstoječo kodo..., sprašujem pa se če je uredu če imam timer in int ugasnjen dokler ga ne rebim in ga vklopim takrat ko je potrebno in sicer naprimer v delu programa označenega kot "izvajaj:"
vsekakor bom ugotovil prej ali slej.
hvala |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Ned Jul 25, 2010 9:51 am Naslov sporočila: |
|
|
Tajmer je ponavadi stalno aktiven. V tem primeru ne sešteva sekund, če ni stanje števca >0. Lahko pa ga Stop ali startas kadar hočeš. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
dkn Neznanec

Pridružen-a: Pet 16 Jul 2010 10:09 Prispevkov: 7 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Ned Avg 15, 2010 1:55 pm Naslov sporočila: |
|
|
tudi po nastavitvah timerja sem imel težave z točnim delayem ali vsaj vedno enakim pogreškom (ne glede zunanji ali notranji oscilator, nastavitvah fuse bitov,...).
po nekaj dneh sem nekje prebral da se audio masa in masa ohišja loči z uporom 2,2r in kondenzatorjem 470n. ker si ne lastim osciloskopa sem samo ugibal da zna biti to problem tudi pri moji škatli - audio in digitalna masa skupaj.
ko sem to ločil sem kar naenkrat dobil točen timer in tudi samo ukaz wait ima vedno enak pogrešek.
torej zaključek je takle da sem vsaj približno ugotovil uporabo timerja, nisem pa čisto prepričan o tem da sem masi pravilno ločil, izgleda pa da je škatla sedaj zadovoljna. |
|
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
|