Interruptrelaterat problem... LÖST

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7390
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Interruptrelaterat problem... LÖST

Inlägg av Marta »

Har råkat på ett besvärligt och motsägelsefullt interruptrelaterat problem.
Förutsättningarna är dessa:
Det finns inget grundprogram, bara en "bra @", alltså så och stampa på samma ställe.
TMR2 ger c:a 100Hz interrupts hela tiden.
TMR0 initieras från TMR2 isr och har mycket kortare gångtid än 10ms.

TMR2's isr avslutas normalt snabbt, men kan även vara _mycket_ (10s) lång. Programmet har en semafor som skall hindra den långa delen att dubbelstartas.

Ingenting sparas extra, endast den automatiska 1-nivå sparningen används. Eftersom grundprogram saknas bör detta räcka, tror jag...

Felet visar sig som att programmet tvärlåser. Stängs interrupt av bara precis när den tunga rutinen körs fungerar det. Körs en dummy som tar lika lång tid med interrupt igång så fungerar det.

Är interrupthanteringen feltänkt, så gammal och trött som jag är :(

Tillägg: Jag ÄR för gammal och trött. Ser Ni felet? :oops: :oops: :oops: :oops:

.or 0
jmp start
nop
nop
nop
jmp irqrtn

Kod: Markera allt

irqrtn
        lod bs,#0               set bank selects
        lod ph,#0
        stz ixadrh
        stz iyadrh

        sfc flag2.lowpwr        low power mode?
        jmp lpirq

        sfc t0if                pwm off?
        jmp fstirq

        sfc t2if                pwm on & main routine?
        jmp t2irq

        rti                     just in case...



******  turn off or preheat segments
*
fstirq
        lod a,#0                assume turn off
        sfs flag.preheat        preheat?
        jmp .set                no
        lod a,#245              preheat time
        lod tmr0,a
        lod a,#-1               turn all on

        *
.set    clf flag.preheat        flag preheat done
        lod porta,a             turn on/off all segments
        nop
        lod portb,a
        nop
        lod portc,a
        nop
        lod portd,a
        nop
        lod porte,a

        clf t0if                clear intflag & done
        rti


******  tmr2 interrupt, the main routine
*
t2irq
        sfs powerok             power ok?
        jmp .pwrlost            no, power lost, enter holdover mode

        lod a,#220              intens.value
        lod tmr0,a              start timer until preheat
        sef flag.preheat        nxt int is preheat on

        *                       pwm turn on digits
        lod a,pa
        lod porta,a
        lod a,pb
        lod portb,a
        lod a,pc
        lod portc,a
        lod a,pd
        lod portd,a
        lod a,pe
        lod porte,a


        lod bs,#1               test code
        lod a,pcon
        lod bs,#0
        sbr areg,7              stack overflow
        stz porta
        sbr areg,6              underflow
        stz portc


        sfc t1if                new clock tick?
        jsr timestep            yes, step timekeeping counter

        clf t2if                clear intflag
        sfc flag2.inlong        in long irq?
        rti                     yes-don't re-enter it

        sef flag2.inlong        begin long interrupt
        sef gie                 let it be interrupted
        jsr longirq             do long irq
        clf gie                 no int until after return
        nop
        clf flag2.inlong
        rti

.pwrlost
        jsr power.down          enter low power mode
        rti
tingo
Inlägg: 318
Blev medlem: 17 maj 2017, 17:55:40
Ort: Oslo, Norge

Re: Interruptrelaterat problem...

Inlägg av tingo »

ISR'en til TMR2 kan ikke bruke 10s - det er alt for lang tid ved den frekvensen. Du må fikse det.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7390
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Interruptrelaterat problem... LÖST

Inlägg av Marta »

Du har helt rätt angående den korta inledande delen. Den långa delen kan ta hur mycket tid som helst.

Felet uppstod vid interrupt medan den långa delen exekverades i ett annat block än där isr finns. pclath står ju kvar där den råkade vara, så "jmp irqrtn" hamnar fel...
Skriv svar