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 

Podprogrami in prekinitve v PIC asmju

 
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
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Pon Jan 10, 2005 1:13 pm    Naslov sporočila:  Podprogrami in prekinitve v PIC asmju Odgovori s citatom

Popolnoma začetniško vprašanje:

Ali je mogoče klicati podprograme iz prekinitvene rutine?
Če da, ali morajo biti podprogrami pred END ali RETFIE?
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: Pon Jan 10, 2005 2:58 pm    Naslov sporočila:   Odgovori s citatom

Seveda lahko iz prekinitvene rutine kličeš podprograme. Konec koncev ni pomembno a si v prekinitveni rutini ali izven nje. Omejen si le s skladom, ki je v večini pic-ev 8 nivojski. Z RETFIE se zaključuje prekinitvena rutina. PC se vrne v naslednjo vrstico mesta kjer se je prekinitev izvedla. Z END se označuje konec programa. Kar je napisano za END prevajalnik ne "vidi" več.
_________________
lp
Silvo
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: Pon Jan 10, 2005 9:12 pm    Naslov sporočila:   Odgovori s citatom

Še nekaj besed o samih prekinitvah. Zelo nelagodna zadeva pri malo večjih PIC-ih so strani ter bank-e
Nerodno je prav to, da v sklad shrani le PCL za vse ostalo moramo poskrbeti sami. Torej moramo pred prekinitvijo shraniti W, STATUS, PCLATH. Sicer se nam lahko po vrnitvi iz prekinitve zgodi kaka nelogična napaka katero je zelo težko ugotovit. Koliko se spomnim iz debate na forumu ali iz postov iz zasebne debate sta prav te težave imela Iztok ter Kroko
Primer kode kako shraniti potrebne registre
Koda:

movwf WTMP   ;shranimo W register
swapf STATUS,W   ;prepišemo STATUS register uporabimo SWAPF, ki ne vpliva na status bite
clrf STATUS      ;mapiramo se na BANK0
movwf  STMP   ;shranimo STATUS v splošno namenske registre v bank0
movf PCLATH,w   ;shranimo tudi PCLATH
movwf PCLTMP
clrf PCLATH      ;še premik na stran0
;sledi prekinitvena rutina
;po zaključku le te program nadaljujemo tukaj ter vrnemo vse shranjeno
movf PCLTMP,w
movwf PCLATH   ;vrnemo PCLATH
swapf STMP,W   ;vrnemo STATUS ter se ob enem postavimo na bank kjer smo shranili W
swapf WTMP,f
swapf WTMP,W   ;vrnemo še W
retfie         ;ter zaključimo prekinitveno rutino

_________________
lp
Silvo
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 Jan 10, 2005 9:40 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Seveda lahko iz prekinitvene rutine kličeš podprograme. Konec koncev ni pomembno a si v prekinitveni rutini ali izven nje. Omejen si le s skladom, ki je v večini pic-ev 8 nivojski. Z RETFIE se zaključuje prekinitvena rutina.


Čisto nepomembno pa vendarle ni. Ko si v prekinitveni rutini, moraš paziti, da ne kličeš podprograma, ki se je ravno izvajal pa ga je prekinitvena rutina prekinila, seveda če ni ta podprogram tako napisan, da se ga lahko večkrat kliče preden se izvede do konca ali pa si pred klicem poskrbel za to, da to lahko narediš (beri shranil in zatem ponovno nastavil vse potrebne registre, pa morda še kaj).

Primer: Ravno se je začel izvajati podprogram, ki čaka n sekund, kar dela tako, da odšteva od neke spremenljivke, shranjene v nekih registrih. Zgodi se interupt. V interuptu kličeš isti podprogram npr. za čakanje 1 sekunde. Če se ta podprogram izvaja tako, da uporabi iste registre za svoje izvajanje, bodo ti registri na koncu vsebovali druge vrednosti, kakor pred interuptom. In ko se interupt zaključi, ubogi podprogram ne ve, da si je sam v svoji drugi inkarnaciji zmešal registre in pavza bo verjetno vse kaj drugega, kakor 10 sekund.

LP, Oliver
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: Pon Jan 10, 2005 9:53 pm    Naslov sporočila:   Odgovori s citatom

Seveda iste rutine, ki jo uporabljaš zunaj prekinitve ne smeš klicati iz prekinitve ali obratno sicer bo zmešnava. V koliko pa je to res neizbežno potrebno pa je treba na začetku prekinitvene rutine vse registre, ki se uporabljajo v tej rutini shraniti v neke začasne (podobno kot zgoraj shranjujemo STATUS,W,PCLATH, kajti ravno ti registri se uporabljajo zunaj ter znotraj prekinitev ter imajo pomemben vpliv na izvajanje ter tok programa. Matjaževo vprašenje pa sem razumel, kot, če je iz prekinitve sploh možen klic.
_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Tor Jan 11, 2005 1:27 pm    Naslov sporočila:   Odgovori s citatom

Se pravi iz prekinitve lahko kličem podprograme, ki jih uporabljam samo v prekinitveni rutini (da ne pride do zapletov) in te podprograme postavim nekje v skupino podprogramov pred ukaz END.

Hvala vsem!
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