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

Pridružen-a: Ned 14 Dec 2003 17:02 Prispevkov: 6 Aktiv.: 0.03
|
Objavljeno: Tor Jan 27, 2004 6:22 pm Naslov sporočila: Pic in interupt |
|
|
Imam 2 vprašanji:
1.)Kaj natanko se zgodi ob kakšnem koli interuptu, oz., kolikor predvidevam, bi se naj taktrat ves proces ustavil in shranil, procesor pa bi začel izvajat program na lokaciji 0004-interupt?
2.)opazil sem da imajo OPTION,STATUS in še nekateri registri več naslovov, vsakega v svojem "bank"-u,kateri naslov je pravi? |
|
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: Tor Jan 27, 2004 6:40 pm Naslov sporočila: |
|
|
Pravilno domnevaš;
Ko se izvede prekinitev se program neha izvajati, trenutna lokacija se shrane v "sklad" - žal se ne shrane STATUS ter W register. Tole je treba storiti sofwersko. Torej v začetku prekinitvene rutine shranimo omenjena registra ter ju vrnemo na koncu prekinitve. Prekinitev se zaključi z ukazom RETFIE takrat se z "sklada" prebere lokacija kjer se je prekinitev začela. Program se nadaljuje kjer je bil prekinjen. OPTION_REG se nahaja le v bank1 ostali nap STATUS se nahaja v vseh bankah torej je direkno dostopen z vseh bank. _________________ 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: Sre Jan 28, 2004 10:04 am Naslov sporočila: |
|
|
Zgoraj sem omenil, da se v sklad ne shranjuje STATUS ter W register. To moramo storiti ročno. Pa poglejmo kaj se lahko zgodi (lahko pogosto, mogoče enkrat v stotih letih ali nikoli ... )
primer kode:
glavna rutina;
Koda: |
.................
.................
clrw ;brišemo register W
;tukaj se je zgodila prekinitev
movwf PORTB ;obirsali smo port b
|
prekinitvena rutina kjer W nismo shranili
Koda: |
..............
..............
movlw 0x02 ;v W je 0x02
movwf PORTA
RETFIE ;nazaj na glavno rutino
|
Vrnili smo se nazaj na glavno rutino v W je 0x02  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Sani Neznanec

Pridružen-a: Ned 14 Dec 2003 17:02 Prispevkov: 6 Aktiv.: 0.03
|
Objavljeno: Čet Jan 29, 2004 1:29 am Naslov sporočila: |
|
|
Torej kar se interupta tiče, koliko razumem, bi naj takoj na začetku interupta, shranil W in STATUS reg. na posebno lokacijo, in ju na koncu spet naložil?
Torej, kar se registrov tiče, kot so STATUS, katei naslov naj potem uporabim za klic registra, kajti v datasheetu jih je podanih več, ali lahko katerega koli od podanih ali vedno tisti iz bank1 in ali podobno velja tudi za ostale reg., kot so: PCLATH, INTCON,FSR,...? |
|
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 Jan 29, 2004 4:55 pm Naslov sporočila: |
|
|
Sani,
Pravilno sklepaš:
Naj napišem primer prekinitvene rutine:
Koda: |
INT
movwf WTMP ;shranemo W register v register WTMP
swapf STATUS,W ;uporabimo instrukcijo "swapf" ker le ta ne vpliva na statusne bite
movwf STMP ;shranemo studi STATUS reguster
clrf STATUS
btfsc INTCON,. ; ugotavljamo vrsto prekinitve
goto .... ; skok na del procedure če se je le ta izvedla
.............
..............
END_IRQ ;konec izvajana prekinitvenih procedur
swapf STMP,W
movwf STATUS ;vrnem STATUS
swapf WTMP,F
swapf WTMP,W ;vrnem W
retfie ; konec prekinitve
|
Citiram: |
Torej, kar se registrov tiče, kot so STATUS, katei naslov naj potem uporabim za klic registra, kajti v datasheetu jih je podanih več, ali lahko katerega koli od podanih ali vedno tisti iz bank1 in ali podobno velja tudi za ostale reg., kot so: PCLATH, INTCON,FSR,...?
|
Za registre ki jih najdeš v vseh bankah nap. STATUS, FSR, INTCON ... se ne rabiš mapirat. Lahko ga naslavljaš od koder koli.
Primer:
Če želiš pisati OPTION_REG in si v bank0 se moraš prestaviti v bank1
bsf STATUS,RP0 ;smo v bank 1
tam je tudi STATUS register
za nazaj izvedemo spet pisanje v STATUS register:
bcf STATUS,RP0 ;sedaj smo na bank0 _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Okt 30, 2004 9:34 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
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: Sob Okt 30, 2004 9:56 am Naslov sporočila: |
|
|
V vsakem primeru se ob prekinitvi program nadaljuje 0x04. Postavijo se prekinitvene zastavice, katere je potrebno obrisati ročno. Kako boš prekinitve obdeloval je potem stvar potrebe. Lahko "vprašaš" če sta se zgodili obe "pošlješ" program "tja", če ne ugotavljaš katera se je zgodila. Če se v času prekinitve zgodi ponovna prekinitev se ob zaključku le te prekinitev ponovno izvee. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Okt 30, 2004 10:00 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Ned Okt 31, 2004 8:53 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
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: Ned Okt 31, 2004 9:56 pm Naslov sporočila: |
|
|
Čakaj malo prekinitev se bo izvedla ne glede kje si mapiran zunaj banka ter se bo tja tudi vrnila. Ravno zaradi tega se shranjuje STATUS register. Napaka pa se bo zgodila če se boš mapiral v drug bank v prekinitveni rutini ter potem shranil status ter se pri vrnitvi iz prekinitve vrnil ta status - torej nisi naredil nič oz. naredil si napako.
Pravilno naj bi prekinitvena rutina izgledala takole:
Koda: |
INT
movwf WTMP ;shranemo W register
swapf STATUS,W ;uporabimo ukaz swapf ki ne vplova na statusne bite
movwf STMP ;ter shranemo statusne bite
clrf STATUS ;obrišemo status - dejansko smo sedaj na bank 0
; kar seveda ni nujno a lahko nas zavede če se je
; prekinitev izvedla na kakem drugem bank-u
................... ;ugotavljamo vrsto prekinitve
....................... ;
END_IRQ
swapf STMP,W ;spret uporabimo swap, ki ne vpliva na statusne bite
movwf STATUS ;vrnemo status
swapf WTMP,f ;obrnemo polariteto bitov znotraj samega registra
swapf STMP,w ;ter pravilo obrnjene vrnemo v w
retife
|
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Ned Okt 31, 2004 11:25 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
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 Nov 01, 2004 11:48 am Naslov sporočila: |
|
|
Govora je vrjetno o 877 oz. o picu ki ima SNR na več bankah ? 84 ima vse SNR mapirane v bank0. Mislim, da bi za ta namen lahko uporabil zgornje 3 bite PCLATH registra, ki so prosti ter se nahajajo v vseh bankah. Tja bi, ko prideš v prekinitveno rutino shranil stanje RP0 ter RP1 STATUS registra. Tako bi vedel, s katerega "bank"-a si priletel v prekinitev sedaj se bi lahko mapiral v bank kamur boš shranjeval STATUS ter W. Preden da končaš prekinitev pa vrneš status, ter W iz PCLATH-a pa "pobereš" še stanje o bank-ah. Seveda v prekinitveni rutini ne smeš pisati v zgoranja dva bita PCLATH-a. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
gnioco Član

Pridružen-a: Pon 26 Jan 2004 11:35 Prispevkov: 85 Aktiv.: 0.36 Kraj: Ljubljana
|
Objavljeno: Ned Okt 30, 2005 8:19 pm Naslov sporočila: |
|
|
Imam problem z prekinitvijo na pinu RB7 mikrokontrolerja pic16f84a. Namreč to prekinitev(in še prekinitev na RB0) uporabljam za bujenje iz stanja SLEEP. Problem pa je ker ne morem pobrisati bita RBIF v registru INTCON v prekinitveni rutini, zato se mi prekinitev zacikla...Če se pic zbudi iz stanja SLEEP s pomočjo prekinitve na RB0 pa vse poteka ok (torej bit INTF lahko normalno zbrišem)
Program sem testiral v MPLAB v7.21.
Koda: |
org 0x004
Prekinitev
bcf INTCON,GIE
movwf work
swapf STATUS,w
movwf stat
bcf STATUS,RP0
bcf INTCON,RBIF ;ta hudic ne dela
bcf INTCON,INTF ;to pa dela
...
konec_prekinitve
swapf stat,w
movwf STATUS
swapf work,f
swapf work,w
retfie
;program za spanje
SPIM
bsf STATUS,RP0
movlw b'10000111'
movwf OPTION_REG
bcf STATUS,RP0
movlw b'10011000'
movwf INTCON
SLEEP ;pošljemo pic v sleep
nop
nop
|
Naj še povem da sem vse vsi pini PORTBja vhodi. |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Ned Okt 30, 2005 11:53 pm Naslov sporočila: |
|
|
Ta flag je lahko malo problematičen. Nujno moraš pred brisanjem flag-a prebrati vrednost na PORTB, ker ti v nasprotnem primeru ne pobriše flag-a. Za podroben opis poišči "PICmicro™ Mid-Range MCU Family Reference Manual", kjer so podrobno opisani vsi deli PIC-a. Sam sem imel iste probleme, ampak z 18F serijo (pri 16F je verjetno delovanje te prekinitve identično). |
|
Nazaj na vrh |
|
 |
gnioco Član

Pridružen-a: Pon 26 Jan 2004 11:35 Prispevkov: 85 Aktiv.: 0.36 Kraj: Ljubljana
|
Objavljeno: Pon Okt 31, 2005 12:45 am Naslov sporočila: |
|
|
Dela Hvala za trik  |
|
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
|