Sida 2 av 2

Re: INTCON, GIE

Postat: 23 juli 2015, 14:45:34
av Erik M
Det är därför jag frågar, eftersom det står på ett visst sätt i projektbladen.

Som exempelvis att GPIF är en av de olika nnnIF (eller xxIF om så önskas) och följdaktligen sätts vid ändring av status på vilken GPIO-pinne det än är - oavsett om denna är satt som IOC.

Det är vad den noten säger.

Det är troligen inte så det menas, men det är vad som står skrivet i den.

Om det sedan anges annorstädes att GPIF endast sätts av IOC-satta pinnar, då är det givetvis just som det borde vara. Detta återfinner jag dock inte i texten, så därför frågar jag hur det förhåller sig.

Re: INTCON, GIE

Postat: 23 juli 2015, 14:54:45
av Erik M
9.4 Interrupts
Note 2: When an instruction that clears the GIE bit is executed, any interrupts that were pending for execution in the next cycle are ignored. The interrupts which were ignored are still pending to be serviced when the GIE bit is set again

Helt rätt - de som ignorerades under ISR finns kvar efter RETFIE, jag misstolkade hur och vad "ignore" ovan egentligen gjorde. Bra, tack.

Re: INTCON, GIE

Postat: 23 juli 2015, 15:35:07
av sodjan
> Som exempelvis att GPIF är en av de olika nnnIF (eller xxIF om så önskas)
> och följdaktligen sätts vid ändring av status på vilken GPIO-pinne det än är...

I princip rätt så långt...

> ... - oavsett om denna är satt som IOC.

Helt fel! Och det står det *INTE*.

> Det är vad den noten säger.

Nej, den säger att xxIF flaggorna sätts oberoende av xxIE ("mask bits")
och GIE. (Samt för vissa även GEIE, vilket kanske borde ha nämnts.)

Den noten säger ingenting specifikt om IOC.

Sen, *OM* en xxIF flagga sätts över huvudtaget beror ju på
de specificka vilkoren för respektive xxIF flagga. För t.ex. GPIE
gäller alltså att motsvarande IOC flagga också måste vara satt.

Det är ingen skillnad mot att en timer IF flagga bara sätts om
timern används och IF flaggan för ADCn sätts bara om ADCn
används. O.s.v. o.s.v. Inget speciellt med IOC i detta avseende.

Re: INTCON, GIE

Postat: 23 juli 2015, 15:48:10
av Erik M
OK.

Re: INTCON, GIE

Postat: 24 juli 2015, 21:04:47
av BJ
Dels vad gäller att använda CALL inom den.
Dvs är det bättre att använda GOTO än CALL i detta fall?


Om avbrotts-hanterarna är korta så kan man lägga in dom
direkt i avbrotts-rutinen, och hoppa förbi dom med goto
om dom inte ska köras, i stället för att anropa dom med
call om dom ska köras. Det sparar man en stack-nivå med.

Re: INTCON, GIE

Postat: 24 juli 2015, 22:29:36
av Erik M
Jo, visst blir det. Givetvis. Etc.
Frågan gällde om det fanns någon anledning inte använda just CALL.
I verkligheten kommer naturligtvis varken det ena eller andra användas om de inte absolut måste.

Men i grunden gällde det CALL och ISR.

Re: INTCON, GIE

Postat: 24 juli 2015, 22:37:07
av TomasL
Det beror väl helt och hållet på hur djup stacken är och hur många nestade anrop du har i programmet.
Om du redan utnyttjat stacken fullt ut i andra delar av programmet, så är det inte bra att använda Call i ISRen, eftersom du då riskerar att få overflow i stacken.
Dessutom, ju fortare ISRen körs, desto bättre.

Det finns en doktrin som säger att ISRen enbart skall ta reda på vilka interrupt som skett, sätta flaggor för exekvering utanför ISRen och låta normal programexekvering hantera det som behövs.
Men som sagt det beror ju på vad du vill göra med programmet.

Re: INTCON, GIE

Postat: 7 september 2015, 15:00:52
av Erik M
PIC 16F630 typ...

Blir detta en funktionell väg se till att alla flaggade avbrott avhandlas inom en å samma avbrottshantering?

Kod: Markera allt

            ORG          0x4

; - - - - - - - - - - - - - - - - - - - - -

            MOVWF        W_TEMP
            SWAPF        STATUS, W
            BCF          STATUS, RP0
            MOVWF        S_TEMP

; - - - - - - - - - - - - - - - - - - - - -

if_GIE           ; Check that GIE is disabled.
            BTFSC        INTCON, 7
            GOTO         if_GIE

; - - - - - - - - - - - - - - - - - - - - -

do_GPIF          ; Check if GPIF set.
            BTFSS        INTCON, 0
            GOTO         no_GPIF
            include      "RAIF procedure.inc"
if_GPIF     BCF          INTCON, 0

; - - - - - - - - - - - - - - - - - - - - -

no_GPIF

; - - - - - - - - - - - - - - - - - - - - -

do_T0IF          ; Check if T0IF set
            BTFSS        INTCON, 2
            GOTO         no_T0IF
            include      "T0IF procedure.inc"
if_T0IF     BCF          INTCON, 2

; - - - - - - - - - - - - - - - - - - - - -

no_T0IF

; - - - - - - - - - - - - - - - - - - - - -

new_GPIF         ; Extra check on GPIF
            BTFSC        INTCON, 0
            GOTO         do_GPIF

new_T0IF         ; Extra check on T0IF
            BTFSC        INTCON, 2
            GOTO         do_T0IF

; - - - - - - - - - - - - - - - - - - - - -

            SWAPF        S_TEMP, W
            MOVWF        STATUS
            SWAPF        W_TEMP
            SWAPF        W_TEMP, W

; - - - - - - - - - - - - - - - - - - - - -

end_of_INT               RETFIE
(Förhoppningsvis utan slarv-/eller andra fel.)

Dvs att först se till GIE är avstängd och sedan kolla varje avbrottskälla var för sig och sedan göra det steget en extra gång till.

Det känns som onödigt, men om den första kollen, av GIE, rekommenderas så...?

Re: INTCON, GIE

Postat: 7 september 2015, 15:10:32
av sodjan
GIE nollas automatiskt då ett interrupt inträggar och sätt automatiskt av RETFIE.
Endast i undantagsfall behöver man fippla med GIE själv (och vid uppstart efter reset).

Skriv "INTCON, GPIE" istället för "INTCON, 0" o.s.v.

Dina "extra check" är egentligen onödiga, om något interrupt skulle
ha satts under tiden så kommer du tillbaka direkt efter RETFIE igen.

Re: INTCON, GIE

Postat: 7 september 2015, 15:28:48
av Erik M
Bra, det är så jag har förstått det skulle fungera.
Men då flaggorna sätts oavsett om GIE är satt eller ej skulle man plocka de avbrott som anropas så snart det bara går, utan att behöva ödsla tid med att returnera ut och direkt in igen. Oavsett om det är absolut nödvändigt tidsmässigt.

Jag håller med dig Janne om att bitens namn är bättre använda.
Dock kan bitars namn variera lite och tillåta varianter, dock inte sådär med en gång dess placering.
Så hur man än gör blir det både rätt och fel. Så länge man gör rätt alltså.
(Åsså är det fånigt att bitens namn, som är unikt, måste skrivas tillsammans med registrets namn...
...men inget att klaga på - man kan ju skriva en egen include för SFR definitionerna.)

Re: INTCON, GIE

Postat: 7 september 2015, 15:38:49
av sodjan
På en senare PIC16F1xxx så behövs inte de där SWAP'arna,
så tidsskillnaden blir inte så stor mot att köra de där extra testerna.
Men visst, det fungerar det också.

Och som sagt, använd de definierade namnen på register och bitar.

Re: INTCON, GIE

Postat: 7 september 2015, 16:47:48
av Erik M
Jo, jag har numera en eller annan dylik PIC liggande, tror jag, som gör så.
Vilket iofs inte påverkar nyttan med en omgång till när procedurerna för avbrott blir långa (stora).

Men då vet jag. Det behövs strängt taget inte, men fungerar att göra. Tack.