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 

Pic in interupt

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Sani
Neznanec
Neznanec



Pridružen-a: Ned 14 Dec 2003 17:02
Prispevkov: 6
Aktiv.: 0.03

PrispevekObjavljeno: Tor Jan 27, 2004 6:22 pm    Naslov sporočila:  Pic in interupt Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-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: Tor Jan 27, 2004 6:40 pm    Naslov sporočila:   Odgovori s citatom

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
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 Jan 28, 2004 10:04 am    Naslov sporočila:   Odgovori s citatom

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 ... Wink )

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 Shocked Sad

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sani
Neznanec
Neznanec



Pridružen-a: Ned 14 Dec 2003 17:02
Prispevkov: 6
Aktiv.: 0.03

PrispevekObjavljeno: Čet Jan 29, 2004 1:29 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-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 Jan 29, 2004 4:55 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Sob Okt 30, 2004 9:34 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
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: Sob Okt 30, 2004 9:56 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Sob Okt 30, 2004 10:00 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Ned Okt 31, 2004 8:53 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
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: Ned Okt 31, 2004 9:56 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Ned Okt 31, 2004 11:25 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
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 Nov 01, 2004 11:48 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 26 Jan 2004 11:35
Prispevkov: 85
Aktiv.: 0.36
Kraj: Ljubljana

PrispevekObjavljeno: Ned Okt 30, 2005 8:19 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Ned Okt 30, 2005 11:53 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 26 Jan 2004 11:35
Prispevkov: 85
Aktiv.: 0.36
Kraj: Ljubljana

PrispevekObjavljeno: Pon Okt 31, 2005 12:45 am    Naslov sporočila:   Odgovori s citatom

Dela Very Happy Hvala za trik Wink
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 -> Osnove programiranja PIC-a v Assembler-ju Č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