Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Sre Jul 27, 2005 1:10 pm Naslov sporočila: Prekinitve--Pic |
|
|
Pozdravljeni.
Zanima me kako natančno bi se dalo narediti prekinitev pri PIC-ih. Kako natančna bi bila ura realnega časa?
Po teoriji sem izračunal prekinitev na 1ms vendar se ne ujema. Prekinitev pride na 987 us. Nato sem povečal timer in sem dobil 991us, če se povečam za 1 dobim 1,005 ms. Predvidevam da je posledica kondenzatorjev in kvarca. Potem tudi ponovljivosti v več izdelkih nebi bilo?
L.P. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Jul 27, 2005 1:33 pm Naslov sporočila: |
|
|
Navedel si premalo podatkov, da bi ti lahko karkoli svetoval. (kak pic, kak vir za časovnik?- notranji vir ure? - kateri časovnik domnevam TMR0 ? Preddelilnik? ) Vsekakor je natančnost odvisna od točnosti kristala.
Recimo sam sem naredil uro z 4Mhz kristalom. Uporabil sem TMR0 s preddelilnikom 1/16, ki je prožil TMR0 prekinitev. V prekinitveni rutini sem delal korekcijo TMR0 tako, da so se prekinitve izvajale točno vsake 4mS. Prekinitve sem štel. Ko se jih je zgodilo 250 je potekla 1s. Moram reči, da je ura tekla izredno točno. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Čet Jul 28, 2005 7:16 am Naslov sporočila: |
|
|
Imam kvarc 4Mhz in 16F876. Gre za TMR0. Preddelilnik nastavim npr. na 1/8 in TMR0=125. Prekinitev bi se morala zgoditi na 1ms. Kot si sam omenil moram narediti korekcijo TMR0. Tako moram timer nastaviti na 133 da dobom 1ms pa še to ni natančno na 1ms ampak je 0,991ms !!
Zanima me zakaj tako velika odstopanja? Program je v c-ju ima to kaj z netočnostjo? |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jul 28, 2005 7:38 am Naslov sporočila: |
|
|
Kar se hardwera tiče ne more priti do odstopanja - razen seveda koliko je toleranca kristala. Sumim, da ne delaš korekcijo v pravem času. Žal kar se tiče C-ja ti ne znam pomagat. Tukaj najdeš primer ure pisan v assemblerju. Del kjer se vrši korekcija TMR0 je sicer "odmaknjen" kot komentar. Lahko pa vidiš kje sem delal korekcijo. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Čet Jul 28, 2005 8:38 am Naslov sporočila: |
|
|
Bom še malo testiral pa poročal.
Poskušal sem z nekaj kvarci, ter zamenjal pic pa je enako torej bo moral problem biti v programu
Saj nerabim take natančnosti samo me pa zanima zakaj se teorija ne ujema z prakso
L.P. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jul 28, 2005 9:43 am Naslov sporočila: |
|
|
Ne vem kako C obravnava prekinitve. Pri korekciji TMR0 je potrebno upoštevat čas, ki poteče od trenutka ko se izvede prekinitev (torej od lokacije 0x04) Najbolje je, če je le možno korekcijo delat takoj na začetku prekinitvene rutine. Če, se pred korekcijo poganja še kaka rutina, je potrebno upoštevat trajanje le te. Pozor!! Problem lahko nastane, če se trajanje rutine med delovanjem spreminja!. TMR0 lahko "zavede" tudi kaka druga prekinitev, kajti ne glede na vrsto prekinitve kazalček ob prekinitvi skoči na 0x04. Procedura, ki je klicana od tam pa mora najprej ugotoviti vrsto prekinitve. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Čet Jul 28, 2005 12:13 pm Naslov sporočila: |
|
|
Poskušal sem spreminjati dolžino prekinitvenega programa pa se nič ne spremeni. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Jul 28, 2005 12:18 pm Naslov sporočila: |
|
|
Pripni del kode, da vidmo. Sam sicer nisem doma na "C"-ju. Mislim pa, da je kar nekaj takih na forumu, ki z njim delajo. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Čet Jul 28, 2005 1:14 pm Naslov sporočila: |
|
|
Da bo bolj razumljivo sem pripel le funkcijo in ne celega programa:
static void interrupt
intr(void)
{
TMR0=125;
if (T0IF==1) // prekinitveni flag
{
// tukaj pride prekinitveni program , ki naj bi se izvedel na 1ms!
//
// .....
}
T0IF=0; // brisanje prekinitvene zastavice
} |
|
Nazaj na vrh |
|
 |
Oliver Član

Pridružen-a: Sre 27 Okt 2004 13:36 Prispevkov: 39 Aktiv.: 0.16 Kraj: Ljubljana
|
Objavljeno: Čet Jul 28, 2005 1:32 pm Naslov sporočila: Re: Prekinitve--Pic |
|
|
tibi je napisal/a: |
Pozdravljeni.
Zanima me kako natančno bi se dalo narediti prekinitev pri PIC-ih. Kako natančna bi bila ura realnega časa?
Po teoriji sem izračunal prekinitev na 1ms vendar se ne ujema. Prekinitev pride na 987 us. Nato sem povečal timer in sem dobil 991us, če se povečam za 1 dobim 1,005 ms. Predvidevam da je posledica kondenzatorjev in kvarca. Potem tudi ponovljivosti v več izdelkih nebi bilo?
L.P. |
Ura bo tako natančna, kot je natančen vir, ki proži povečevanje števca. Kvarci, ki se ponavadi uporabljajo za oscilator za mikrokontroler, običajno niso preveč natančni. Tipična natančnost je nekaj deset nihajev preveč ali premalo v miljonu nihajev, kar v enem dnevu znese kar nekaj sekund. Je pa to še zmeraj za velikostni razred natančneje, kot si izmeril. Verjetno si naredil napako pri nastavljanju timerja. Če pripneš kodo, bo veliko lažje dati kakšen komentar.
LP, Oliver |
|
Nazaj na vrh |
|
 |
Petek Član

Pridružen-a: Sre 27 Jul 2005 19:07 Prispevkov: 37 Aktiv.: 0.16
|
Objavljeno: Čet Jul 28, 2005 1:44 pm Naslov sporočila: |
|
|
Ce te se vedno zanima, lahko pobrskam, ker sem tudi sam nekoč delal nekaj podobnega (prekinitev na 1ms). Skoraj preprican sem, da si naredil napako v kodi.
Ce gres po korakih (debug), bos videl da ti manjka se kaksen "nop" ukaz in prekinitev bo točna.
Drugače pa so zunanji kvarci kar zelo natančni in taka odstopanja niso možna!
 |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Čet Jul 28, 2005 5:29 pm Naslov sporočila: |
|
|
Ne vem sicer koliko izkušenj imaš s programiranjem v C-ju, vendar je za natančne čase pa tudi za optimiziranje kode, pametno vedeti v kaj bo C prevajalnik pretvoril kodo. Kaj pa če bi namesto C kode poizkusil vriniti ASM kodo? Skoraj vsak prevajalnik to omogoča (če je težava res v programu). _________________ If in doubt about performance disassemble your code and try to follow it. If you get bored then the CPU probably will too... |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Pon Avg 01, 2005 11:09 am Naslov sporočila: |
|
|
Pa mi je uspelo program zdaj zgleda takole:
static void interrupt
intr(void)
{
if (T0IF==1) // prekinitveni flag
{
asm("nop"); // stevilo ukazov po potrebi
asm("nop");
TMR0=134;
// tukaj se program zvaja natančno na 1ms neodvisno od dolžine
// seveda nesme trajati več kot 1ms!
//
// .....
}
T0IF=0; // brisanje prekinitvene zastavice
}
Nazadnje urejal/a tibi Tor Avg 02, 2005 7:29 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
Oliver Član

Pridružen-a: Sre 27 Okt 2004 13:36 Prispevkov: 39 Aktiv.: 0.16 Kraj: Ljubljana
|
Objavljeno: Pon Avg 01, 2005 9:39 pm Naslov sporočila: |
|
|
tibi je napisal/a: |
Pa mi je uspelo program zdaj zgleda takole:
Koda: |
static void interrupt
intr(void)
{
if (T0IF==1) // prekinitveni flag
{
asm("nop"); // stevilo ukazov po potrebi
asm("nop");
// TMR0=134;
// tukaj se program zvaja natančno na 1ms neodvisno od dolžine
// seveda nesme trajati več kot 1ms!
//
// .....
}
T0IF=0; // brisanje prekinitvene zastavice
}
|
|
Ali želiš interupte točno na 1ms ali pa v povprečju na 1ms? Kako točno mora to biti? Ali imaš še kakšen drug vir interupta kot T0? Ali ti ta tvoj C sam shrani ustrezne registre, ko izvaja interupt rutino?
V vsakem primeru mislim, da ima tale koda pomanjkljivosti, če drugega ne, si pozabil odkomentirati vrstico TMR0=134;
O ostalem več po odgovorih na vprašanja.
LP, Oliver |
|
Nazaj na vrh |
|
 |
tibi Član

Pridružen-a: Tor 16 Dec 2003 11:08 Prispevkov: 253 Aktiv.: 1.07 Kraj: bukovje
|
Objavljeno: Tor Avg 02, 2005 7:40 am Naslov sporočila: |
|
|
Oliver je napisal/a: |
Ali želiš interupte točno na 1ms ali pa v povprečju na 1ms? Kako točno mora to biti? Ali imaš še kakšen drug vir interupta kot T0? Ali ti ta tvoj C sam shrani ustrezne registre, ko izvaja interupt rutino?
|
Sem popravil seveda vrstica TMR0=134; nesme biti zakomentirana.
Drugega vira prekinitve nimam.
Zanimalo me je kako se najbolj natančno kar je mogoče da narediti interupt.
Sedaj z tem programom sem dobil natančno 1,000ms, nevem pa kakšna je stabilnost(temperatura,staranje elementov...)
C shrani registre in se po končanju rutine sam vrne in nadaljuje glavni program. |
|
Nazaj na vrh |
|
 |
|