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?




.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