Nejasnosti u přerušení PIC
Moderátor: Moderátoři
Nejasnosti u přerušení PIC
2) pokud čtu stav intcon, objeví se mi na příznakových místech přerušení logické jedničky, tj. příznaky přerušení i když dané přerušení není nastaveno?, jenom toto přerušení není vykonáno?? ptám se protože chci obsluhovat dvě přerušení - jedním přepnout na přerušení druhé, např přerušení na rb4, po impulsu na rb4 zapni přerušení odtmr0 vypni přerušení na rb4a periodicky čti stav rb4. problém je, že pokud je gpie = 1 a rbie = 0 tak se mi stále zobrazuje po impulsu na rb4 příznak přerušení od změny stavu na rb4 a v rutině přerušení se tak stále vykonává if portb.4 = 1 then....
je to tak správně?? myslel jsem, že jak skok do přerušení tak příznakový stav přerušení v intcon se mohou měnit až po zapnutí toho daného přerušení...
děkuji za pošoupnutí správným směrem. Marek
- Přílohy
-
Nový textový dokument.txt- (1.73 KiB) Staženo 235 x
Neznám ten basic, ale napadlo mě, jestli bys před zápisem do option_reg neměl nastavit status.rp0 na 1 a hned potom zase zpátky na nulu.
Ale nevím, jestli to tím může být, spíš mi přijde, že nemůže.
A možná to ten basic dělá sám.
Taky bych zkotroloval, jestli nemáš náhodou zapnutý watchdog.
Taky mi ale přijde, že by se to takhle nechovalo.
Co mi přijde hloupý:
Uvnitř procedury interrupt povoluješ bit intcon.gie (tím intcon = ...).
To bys neměl, protože pak se ti můžou okamžitě vyvolat znovu přerušení ještě uvnitř toho právě obsluhovaného.
Pak by to mohlo dělat docela paseku, ale nedovedu domyslet, jestli právě takovouhle.
Víc mě nenapadá a nevím, jestli tohle může pomoci.
Ale určitě bych to prověřil.
Akorát se provedou, teprve až se i to GIE zapne.
A to je právě dobře.
Když dojde k přerušení, automaticky se GIE zakáže a teprve pak se provede přerušovací podprogram.
Ten něco provede, typicky taky smaže příznak přerušení, aby nenastalo hned znovu, a ukočí obsluhu instrukcí RETFIE, která je stejná jako RETURN, ale navíc zase povolí GIE.
Tím je zabezpečeno, že k přerušení nedojde, dokud není obsluha předcházejícího přerušení dokončena.
Pokud povolíš GIE už v přerušovacím podprogramu, může se ti opět přerušit.
Takže třeba může nastat:
1) Změna na RB - vyvolá se přerušení.
2) Provede se intcon=160 (přepnutí na timer).
3) Zde se znovu (rekurentně) zavolá obsluha přerušení, protože třeba zrovna doběhne časovač.
4) Obsluha načte bit a uloží ho do prijem.
5) Obsluha vnitřního přerušení skončí.
6) Pokračuje se v obsluze vnějšího přerušení, tj. provede se prijem=2. Tím se naprosto zpihní ten právě načtený první bit.
7) Ukončí se vnější přerušení. To možná ani nebude fungovat, protože basic si při vstupu určitě schoval hodnoty některých registrů, které teď má obnovit, ale to mu určitě mezitím přemazalo to vnitřní přerušení. Pochybuju totiž, že ta obsluha je v basicu navržena reentrantně - většinou tam bývá jen jedna pevná proměnná, do které se 2 hodnoty nevejdou. PIC na tohle nepoužívá zásobník. Takže tímto se pravděpodobně v hlavním programu budou občas měnit samovolně hodnoty některých registrů.
Zkrátka a dobře - uvnitř obsluhy nech GIE vypnuté.
Tedy všechny intcon=x uvnitř procedury interrupt změn - to x zmenši o 128.
On se ti ten GIE sám povolí, až ta rutina skončí.