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 

Prekinitve--Pic

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
tibi
Član
Član



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Sre Jul 27, 2005 1:10 pm    Naslov sporočila:  Prekinitve--Pic Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Jul 27, 2005 1:33 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Čet Jul 28, 2005 7:16 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Jul 28, 2005 7:38 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Čet Jul 28, 2005 8:38 am    Naslov sporočila:   Odgovori s citatom

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 Sad
Saj nerabim take natančnosti samo me pa zanima zakaj se teorija ne ujema z prakso Question

L.P.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Jul 28, 2005 9:43 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Čet Jul 28, 2005 12:13 pm    Naslov sporočila:   Odgovori s citatom

Poskušal sem spreminjati dolžino prekinitvenega programa pa se nič ne spremeni.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Jul 28, 2005 12:18 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Čet Jul 28, 2005 1:14 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 27 Okt 2004 13:36
Prispevkov: 39
Aktiv.: 0.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jul 28, 2005 1:32 pm    Naslov sporočila:  Re: Prekinitve--Pic Odgovori s citatom

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



Pridružen-a: Sre 27 Jul 2005 19:07
Prispevkov: 37
Aktiv.: 0.16

PrispevekObjavljeno: Čet Jul 28, 2005 1:44 pm    Naslov sporočila:   Odgovori s citatom

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!

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



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Čet Jul 28, 2005 5:29 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Pon Avg 01, 2005 11:09 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 27 Okt 2004 13:36
Prispevkov: 39
Aktiv.: 0.16
Kraj: Ljubljana

PrispevekObjavljeno: Pon Avg 01, 2005 9:39 pm    Naslov sporočila:   Odgovori s citatom

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; Wink
O ostalem več po odgovorih na vprašanja.

LP, Oliver
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tibi
Član
Član



Pridružen-a: Tor 16 Dec 2003 11:08
Prispevkov: 253
Aktiv.: 1.07
Kraj: bukovje

PrispevekObjavljeno: Tor Avg 02, 2005 7:40 am    Naslov sporočila:   Odgovori s citatom

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
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 -> Microchip PIC Č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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group