 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Pon Jan 10, 2005 1:13 pm Naslov sporočila: Podprogrami in prekinitve v PIC asmju |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Jan 10, 2005 2:58 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Jan 10, 2005 9:12 pm Naslov sporočila: |
|
|
Š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 |
|
 |
Oliver Član

Pridružen-a: Sre 27 Okt 2004 13:36 Prispevkov: 39 Aktiv.: 0.16 Kraj: Ljubljana
|
Objavljeno: Pon Jan 10, 2005 9:40 pm Naslov sporočila: |
|
|
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Jan 10, 2005 9:53 pm Naslov sporočila: |
|
|
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 |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Tor Jan 11, 2005 1:27 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|