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 

attiny2313 in točen delay

 
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
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Pet Jul 16, 2010 10:31 am    Naslov sporočila:  attiny2313 in točen delay Odgovori s citatom

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
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.67
Kraj: KOPER

PrispevekObjavljeno: Pet Jul 16, 2010 10:57 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Pet Jul 16, 2010 11:03 am    Naslov sporočila:   Odgovori s citatom

u hvala to je bilo pa hitro

si bom moral čas vzet pa pregledat kako je sestavljeno tukaj

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



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3387
Aktiv.: 15.99

PrispevekObjavljeno: Pet Jul 16, 2010 11:11 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Pet Jul 16, 2010 11:31 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3387
Aktiv.: 15.99

PrispevekObjavljeno: Pet Jul 16, 2010 11:39 am    Naslov sporočila:   Odgovori s citatom

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... Think
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Pet Jul 16, 2010 11:44 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Ned Jul 25, 2010 8:01 am    Naslov sporočila:   Odgovori s citatom

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
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.67
Kraj: KOPER

PrispevekObjavljeno: Ned Jul 25, 2010 9:05 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Ned Jul 25, 2010 9:33 am    Naslov sporočila:   Odgovori s citatom

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
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.67
Kraj: KOPER

PrispevekObjavljeno: Ned Jul 25, 2010 9:51 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkn
Neznanec
Neznanec



Pridružen-a: Pet 16 Jul 2010 10:09
Prispevkov: 7
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Ned Avg 15, 2010 1:55 pm    Naslov sporočila:   Odgovori s citatom

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


Powered by phpBB © 2001, 2005 phpBB Group