|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
bungee Član
Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.45 Kraj: Ljubljana
|
Objavljeno: Čet Mar 04, 2010 8:53 pm Naslov sporočila: |
|
|
Ti bom namignil ... 256-7 --> Interrupt se bo zgodil po 250 taktih timerja.
Timer ima nastavljen še prescaler 16
Torej če je kristal 4MHz ----> urni takt je 1us (+) prescaler --> 16us en takt timerja
Interrupt se zgodi vsakih 250*16us= 4ms in ker v tem timer interruptu šteješ še do 250 .... dobiš 1s interval
Bo dovolj natančno?
|
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Pon Mar 15, 2010 2:33 pm Naslov sporočila: |
|
|
Hvala.
lp, Domen
|
|
Nazaj na vrh |
|
|
Alex17 Član
Pridružen-a: Ned 28 Feb 2010 21:46 Prispevkov: 476 Aktiv.: 2.66 Kraj: Ljutomer
|
Objavljeno: Pon Mar 15, 2010 5:30 pm Naslov sporočila: |
|
|
@Pingi
Zato, ker je timerju nastavljen preddelilnik 1:16, kar pomeni, da za 1s rabimo 62500 impulzov, kar je ravno 250x250. Spremenljivka stevec se ob vsaki prekinitvi zmanjsa z začetne vrednosti 250 za 1, zato moramo prekinitev dobiti točno vsakih 250 impulzov. To bi dosegli tako, da bi v TMR0 vpisali 6 (timer šteje navzgor, v tem primeru je 8-bitni in torej do 255, pri 256 pa sproži prekinitev) in ko bi timer preštel do konca bi sprožil prekinitev. PIC pa ima to lastnost, da timer začne šteti šele 2 strojna cikla po tem, ko mu vpišemo vrednost, zato je treba to prišteti k času, ki ga mikrokontroler porabi za shranjevanja registrov in vhod v prekintev, torej vse ukaze, ki pretečejo od sprožitve prekinitve pa do ponovnega zagona timerja, kar znese okrog 10 strojnih ciklov. Pri 1:16 delilniku, ko se TMR0 povečuje le vsakih 16 strojnih ciklov (1 strojni cikel - 1 s pri 4MHz kristalu), je potrebno začetno vrednsot timerja že na začetki povečati za 1, da nadoknadimo čas, ki ga je mikrokontroler porabil, ki timer ni štel. Za še večjo natančnost bi bilo potrebno dodati še nekaj nop ukazov v prekinitev pred ponovnim zagonom timerja, tako da bi se timer ponovno zagnal res po 16 strojnih ciklih, za kokikor smo ga "skrajšali".
Če ima kdo boljšo razlago naj me prosim popravi.
Edit: nisem videl 2. strani
|
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Sre Mar 17, 2010 4:00 pm Naslov sporočila: |
|
|
Hvala še enkrat za odgovore.
Sicer sta malce zakomplicirala, bom poizkusil bolj enostavno razložit, če bi še kak tak "mutec" kot sem sam kdaj potreboval.
Torej 7 zato ker kot je že zgoraj napisano imamo nastavljen prescaler 1:16 in tako timer povečamo za 1 vsakih 16us, kar nam ob 250 ciklih da točno 4ms (16us*250=4000 us=4ms).
Zaradi tega ker potrebujemo samo 250 ciklov in ne 255 kolikor jih maksimalno naredi 8 bitni timer, moramo odšteti 5 ciklov od 255 da dobimo 250. Ob upoštevanju da pri PIC-u timer začne šteti šele po 2 ciklih po nastavitvi jih v tem primeru potrebujemo samo 248 za 4ms interupt. Od tod tudi izhaja da je potrebno timer nastaviti na začetno vrednost 7 (7+248=255).
@Alex17:
Kolikor sem računal v tem primeru ni potrebnega nobenega nop ali kakega drugega ukaza, saj se interupt proži natančno na 4ms, kar nam pri vrednosti števca 250 da natančno 1s (4ms*250=1000ms=1s). Ali se mogoče motim ?
Hvala še enkrat, ker brez vajine razlage verjetno ne bi razumel primera.
lp, Domen
|
|
Nazaj na vrh |
|
|
Alex17 Član
Pridružen-a: Ned 28 Feb 2010 21:46 Prispevkov: 476 Aktiv.: 2.66 Kraj: Ljutomer
|
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Pet Mar 19, 2010 12:48 pm Naslov sporočila: |
|
|
Ne vem sicer kje bi se naj zmotil pri računanju.
V teoriji je po moje tako kot sem zgoraj napisal.
Torej:
prescaler 1:16, kristal 4MHz (urni cikel 1us)-> TMR0 interupt vsake 16uS
iz tega sledi:
4ms = 4000us = 250 (interuptov) * 16us
1s = 250 (stevec) * 4ms = 1s
Taka je vsaj teorija, ni ravno neka raketna znanost.
Breakpoint si postavil takoj na začetku ? Ker prvič interupt nastavimo na 0 (clrf TMR0) in bi prvič moral stopwatch pokazati 4080 us.
|
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Pet Mar 19, 2010 4:01 pm Naslov sporočila: |
|
|
Imaš pa prav ja da MPLAB v simulaciji nameri 3995us. Seveda imaš prav tudi da 2 cikla po katerih začne šteti TMR0 ni enako 2*16us, ampak samo 2us.
|
|
Nazaj na vrh |
|
|
Alex17 Član
Pridružen-a: Ned 28 Feb 2010 21:46 Prispevkov: 476 Aktiv.: 2.66 Kraj: Ljutomer
|
Objavljeno: Pet Mar 19, 2010 4:36 pm Naslov sporočila: |
|
|
Breakpoint je samo eden, in sicer je lahko kjerkoli na začetku prekinitve, saj tako ugotovimo čas, po katerem se sproži prekinitvena rutina in znaša v mojem primeru točno 4ms.
Sicer pa nima veze, brez problemov bi delovalu tudi brez tistih 5 nop ukazov, samo sem moral preveriti, če imam prav, ker mi stvar ni dala miru
|
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Sob Mar 20, 2010 6:00 pm Naslov sporočila: |
|
|
Mogoče preveč kompliciram, ampak ni mi čisto jasno zakaj mora biti ravno 5 nop ukazov da je točno 4ms.
Pri utripanju LED diode se seveda teh 5 ciklov sploh ne opazi, bi pa bil problem v kolikor bi hotel uporabiti takšno štetje sekund za izdelavo ure.
Ali je za uro sploh primeren tak način štetja časa ?
|
|
Nazaj na vrh |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 5.86 Kraj: Koroška-Mežica
|
Objavljeno: Ned Mar 21, 2010 12:05 am Naslov sporočila: |
|
|
Kalkulator
_________________ return;
brake; |
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Ned Mar 21, 2010 2:42 pm Naslov sporočila: |
|
|
To je za delay in ne za interupt !
|
|
Nazaj na vrh |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 5.86 Kraj: Koroška-Mežica
|
Objavljeno: Ned Mar 21, 2010 4:13 pm Naslov sporočila: |
|
|
Ja kolikor sem videl, je tam tudi nek delay v programu. S temle lahko preprosto zgeneriraš pavzo..
_________________ return;
brake; |
|
Nazaj na vrh |
|
|
Pingi Član
Pridružen-a: Tor 13 Okt 2009 12:44 Prispevkov: 123 Aktiv.: 0.67 Kraj: Selnica ob Dravi - Maribor
|
Objavljeno: Ned Mar 21, 2010 11:24 pm Naslov sporočila: |
|
|
To poznam !
Govora je bilo o interrupt-u in ne pavzi !
|
|
Nazaj na vrh |
|
|
bungee Član
Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.45 Kraj: Ljubljana
|
Objavljeno: Pon Mar 22, 2010 1:37 am Naslov sporočila: |
|
|
Pingi je napisal/a: |
Ali je za uro sploh primeren tak način štetja časa ? |
Za generiranje ure se na splošno uporablja raje HW RTC ali dodatni čip ali pa interna RTC logika uC-ja. In ob tem se uporabi 32768Hz kristal, ki je ravno prava številka za dvojiško deljenje (2^16)
|
|
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: 265 dni
Powered by phpBB © 2001, 2005 phpBB Group
|