prerušenie u PIC16Fxxx

Zdravím.
Chcem sa opýtať ako to je u PIC 16Fxxx keď počas výkonu prerušenia
napríklad od pinov RB7/4 dôjde k pretečeniu TMR0 a v reg.INTCON je povolené aj prerušenie od TMR0 aj od zmeny na pinoch RB7/4.
Potrebujem vedieť či je požiadavka na prerušenie od TMR0 odignorovaná alebo či bude spracovaná po ukončení toho prerušenia ktoré “prišlo skôr na rad”.Prípadne či je možné niekde nastaviť priority vo výkone rozličných prerušení.
Vopred ďakujem.Relatko.

cau. pokud nastane jakekoliv preruseni tak se ti zakaze globalni preruseni, takze se obslouzi to co prvni vyvolalo preruseni, a po navratu (RETFIE) z preruseni se vykona to druhy,

pokud bude mit 1 preruseni veci prijiritu nez to 2 tak je mozny preruseni v preruseni (vnoreny preruseni,tusim ze max 8, 8urovnovy STACK ) pri skoku na preruseni zozpoznat od ceho je preruseni : treba
1)je preruseni od RB7/4 (nizsi prijoryta) vynulovat priznak ,povolit glob.preruseni a obsluhovat RB7/4, pokud pri tyhle obsluze dojde k preruseni od TMR (vetsi prijoryta) tak se vykona
2) je preruseni od TMR (vyzsi prrijoryta ) probiha obslouzeni a je pozadavek na preruseni od RB7/4 nic se nedeje protoze je zakozano glob.preruseni to se obslouzi az po RETFIE ci GIE=1,

  • ulozeni registru W,SWR

u PIC 16Fxxx to nastavyt nejde, ale u tusim ze u 18 rady sou 2 druhy preruseny vetsi a mensi prijoryta preruseny

Řada 16 nemá hardwarově řešenou prioritizaci přerušení, prioritizaci je ale možné naprogramovat “ručně”.

muzes to nak blize popsat --> prioritizaci je ale možné naprogramovat “ručně”. jak rucne :question: nejak jeko sem popsal ja

Ano, přesně jak jsi to popsal. Neuvědomil jsem si, že jsi popsal přesný postup…

Zdravím.
Ďakujem za Vaše rady.Vďaka nim som pozliepal nasledovný testovací program.Pozrete sa naň prosím či by to mohlo fungovať.Som trochu zaskočený tým že po skončení obluhy druhého prerušenia ,sa dvakrát po sebe obnovujú registe zálohované na začiatku prerušenia.Keď sa obnovujú prvý krát,tak vďaka inštrukcii swapf sa zmení obsah W_save a pri druhom obnovení reg.ho takýto zmenený načíta do W reg.Program pokračuje na šťastie tam kde skončil v maine po vyvolaní prvého prerušenia.Tento stav sa udeje samozrejme len vtedy,keď počas jedného prerušenia príde požiadavka aj na druhé.Prioritu má prerušenie od TMR0
pred prer.od RB0.Platí to len dovtedy,kým nepríde na :
PRERUS BTFSC INTCON,2 ; bolo prerušenie od TMR0 ???
GOTO PRER01 ; bolo od TMR0 !!!
BTFSC INTCON,1 ; bolo prerušenie od RB0 ???
GOTO PRERO ;áno bolo od RB0 !!!
GOTO PRERKON ; nezname = nic

selekciu prirít.Pokiaľ aj príde požiadavka na prer.od TMR0 počas výkonu
obsluhy prer. od RB0,musí si počkať na ukončenie obsluhy vykonávaného prer.od RB0 a až po jej ukončení pokračuje obsluhou prer.od TMR0
Budem rád za prípadné rady ,ako vylepšiť tento program ako aj za vysvetlenie toho pre mńa záhadného dvojnásobného obnovovania reg. na konci prerušenia.
Relatko.
prerusenie.rar (13.1 KB)

CAU, tak sem to trochu poupravyl, a v simulatoru to funguje ,

na zacatek preruseni sem dal hnet test od ceho je preruseni ,kazdy preruseni ma svoje SAVE registry, kvuli prepisovani registru (W,SWR ,…), vetsi prijorytu ma TMR0
smaznul sem to "PRERKON BSF INTCON,7 " z duvodu jaky ti psal uz Chenzee
je to sice trochu narocnejsi na cas ale funguje to,

no koukni na to a kdyztak se ptej kdybys nevedel co mel basnik na mysli :laughing: ci sem tam neco spatne skopiroval

MALA OTAZKA PRO OSTATNI: je nutny ukladat PCLATH ? v nejakem pripade ?

PS: jestli budes pouzivat jenom 5 prikazu u preruseni od RB0 tak bych asi osobne prijorytu neresil
prerusenie_uprava.asm (2.83 KB)

Ďakujem za radu.V budúcom týždni sa dostanem k svojmu vývojovému kitu tak to vyskúšam na ostro.V MPLABe to ide podľa mojich predstáv.

Tých príkazov tam bude omnoho viac,pracujem na vývoji (aspoň pre mňa)zložitejšieho programu.
Opýtam sa ešte na použitie týchto prízov:
CBLOCK 0x24
W_SAVE ; zaloha pri preruseni , TMR
Sta_SAV
PCL_SAV
FSR_SAV
ENDC
Zaujíma ma či pri prechode do druhej banky musím použiť direktívu ENDC,a znova CBLOCK 0x24 alebo ju to automaticky rozpozná prechod do inej banky.
Vďaka,Relatko.

Jestli se taky můžu ptát, tak proč ukládáš registry při přerušení od adresy 0x20h? Vznikne tak obecně možnost velice záludné chyby, kterou je pak hodně těžké odhalit. Registry bys měl ukládat spíš od 0x70h.

PCLATH nemusíte ukládat, používáte-li pouze jednu (nultou) programovou stránku.
STATUS je nutné uložit a obnovit pomocí instrukce SWAPF.
Pokud se načte STATUS instrukcí MOVF, změní to příznak Z na 0.
(jednička tam bude jenom v případě, že všechny bity STATUS jsou nulové)
Instrukce SWAPF nemění žádný příznakový bit STATUS, proto se použije i při závěrečném obnovení pracovního registru, musí se ale použít 2x.
Ukládat FSR má význam, jenom když se v přerušení používá.
Záložní registry_TEMP se běžně definují do Banky0
cblock 0x20
W_TEMP
STATUS_TEMP
PCLATH_TEMP
endc

Další definice do Banky1
cblock 0xA0

endc

Volné místo v Bankce2 je od 0x120, Banka3 od 0x1A0, vždy se musí použít CBLOCK a ENDC.

Uložení registrů při přerušení podle datasheetu 16F88:
MOVWF W_TEMP ;uložení pracovního registru
SWAPF STATUS,W ;načtení STATUS (s přemístěním horních a dolních 4 bitů)
CLRF STATUS ;přepnout na banku 0
MOVWF STATUS_TEMP ;uložení STATUS
MOVF PCLATH,W ;požadováno jen při používání prog. stránky 1
MOVWF PCLATH_TEMP ;uložení PCLATH
CLRF PCLATH ;přepnout na prog. stránku 0
:
:rutina obsluhy přerušení,
:která může libovolně měnit volbu banky registrů
:
MOVF PCLATH_TEMP,W ;načtení původní PCLATH
MOVWF PCLATH ;obnova PCLATH (původní prog. stránka)
SWAPF STATUS_TEMP,W ;načtení původní STATUS (s přemístěním horních a dolních 4 bitů)
MOVWF STATUS ;obnova STATUS včetně přepnutí původní banky
SWAPF W_TEMP,F ;přemístění horních a dolních 4 bitů
SWAPF W_TEMP,W ;obnova pracovního registru

lebo ked budes v banke 1 a vykonas prerusenie tak temp sa neulozi na adresu 20h …ale inu. Kdes to od adresy 70h je tych 16adries zdielanych vo vsetkych bankach tj umoznuje pristub be prepinania baniek

Musím konstatovat, že Atlan není sice silný v gramatice, ale přemýšlí a ve dvou větách specifikuje problém.
“movf STATUS,W” je naprosto v pořádku. Nutnost používat instrukci SWAPF si ondra.cer vymyslel. Problém je opravdu pouze v tom, že registr W musím uložit při přerušení do oblasti, která je sdílená všemi paměťovými bankami, protože nevím, v které bance se program při přerušení právě nalézá. A tuto podmínku obecně adresa 0x20h, kam registry při IRQ všichni umisťujete, nesplňuje.

Plně souhlasím s jankopem, když jsem začal používat BANKy a PAGEs, tak jsem strávil asi týden nad tím, proč mi program skolabuje na přerušení. Pak jsem přemístil, po důkladném přečtení datasheetu, zalohy W, STATUS, PCLATH, FSR na adresu 0x70 a bylo po problému.

myslim ze si to nevimyslel , v DStu a v Moderni ucebnici programovni PIC 2 pisou ze instrukce SWAP je pouzita proto ze neovlivnuje priznakovy bity SWR registru, MOVF ovlivnuje Z bit, pokud ti de o to zachovat SWR jako celej (vsechy bity) tak SWAP, nebudu se hadat ,muj nazor tvuj nazor, osobne pozivam SWAP

ohledne ty sdileny pameti ve vsech bankach , v DSu 16f87xa je na obrasku 2-3 nakreslena a na obrasku 2-4 uz ne ? to jako ze 876/877ji ma sdilenou pro 4 banky a 873/874 NE ??

Zdravím.
Upravil som v programe od teba zdroj prerušenia z pinu RB0 na piny RB7/4
a nechápem čím to je ale keď dôjde k prerušeniu od RB7/4 nedá sa zmazať príznak:
BCF INTCON,0 ; smazat priznak ,RB7/4
ani opäť globálne povoliť prerušenia :
BSF INTCON,7 ; povolenie všetkých prerusení
Neviem čím to môže byť,poraď prosím.
Ďakujem.Relatko
prero.rar (13.1 KB)

Cau, I kdyby si me roskrajel tak ti to nereknu, newim :blush: , je to naky zacarovany, ale pokud RBIF nastavis na 1 v jakoby hlavnim programu tak to normalne bezi ale jakmile vyvolas preruseni pres Fire Button tak uz to nejde (jakmile to udelas pres to FB tak to nejde,jinak jo), nechapu, skousel sem i misto nulovani v tom preruseni dat CLRF INTCON vynuloval se krome RBIF, no to my fakt nejde do hlahy, tak schvalne cim to bude az na to nekdo pride :laughing:

Před nulováním RBIF musíš přečíst PORTB!

banksel PORTB ; nastaven9 banky movf PORTB,w ; PORTB do W BCF INTCON,RBIF ; smazat priznak ,RB7/4
Jinak ho nevynuluješ

Ďakujem za super radu.Už to šlape ako má.Relatko.

pravda , staci se kouknout do DS, sice to chvilku trvalo nez sem to nasel ale nasel

Obrázek

EDIT: pisou to jenom v DS, v ucebnicich o tom ani zminka :imp:

:arrow_right: administrator: přiloženy externí soubory
datasheet_nulovani_rbif.jpg