Beste mede-CO'ers,

Ik zit met een vraagje.
Het lijkt er op dat Timer2 alleen werkt als Timer0 ook werkt.


	ORG	0		;Reset vector address
	GOTO	INITPROG	; goto INTPROG routine
	ORG	H'0008'		; High Priority ISR address
	GOTO	ISR_HI

INITPROG
;       alleen mbt Timer0 en 2 (anders wordt het zo'n lap)
	; timer0
	movlw	b'00000000'		; T0PS2:T0PS0
	movwf	T0CON			; prescaler 1:2
	; the following settings should be set individually
;	bsf	T0CON, TMR0ON		; Timer0 enabled
	bcf	T0CON, TMR0ON		; Timer0 disabled
	bsf	T0CON, T08BIT		; 8 bit
;	bcf	T0CON, T08BIT		; 16 bit
	bcf	T0CON, T0CS		; internal clock
	bcf	T0CON, T0SE		; increment on low to high
	bsf	T0CON, PSA	        ; do not assign prescaler
;	bcf	T0CON, PSA		; assign prescaler
;	bcf	INTCON, TMR0IE		; disable Timer0 interrupt
	bsf	INTCON, TMR0IE		; enable Timer0 interrupt
	
	; timer2
	bsf	PIE1, TMR2IE		; enable interrupt
	clrf	T2CON
;	bcf	T2CON, TMR2ON		; Timer2 off
;	bsf	T2CON, TMR2ON		; Timer2 on

        goto    MAINPROG

ISR_HI
	movwf	w_temp                  ; hier zet ik een breakpoint
	movff	STATUS, status_temp
	movff	BSR, bsr_temp

	;	select source of interrupt
	btfsc	INTCON, TMR0IF
	bra	ISR_Timer0
	btfsc	PIR1, TMR2IF
	bra	ISR_Timer2
	goto	ISR_HI_EXIT		; exit

ISR_Timer0
	bcf	INTCON, TMR0IF		; clear interrupt bit, ook hier een breakpoint
	call	doe_15us
	movlw	.220
	movwf	TMR0L

	btfsc	PIR1, TMR2IF
	bra	ISR_Timer2
	bra	ISR_HI_EXIT

ISR_Timer2
	bcf	PIR1, TMR2IF		; clear interrupt bit, en hier een breakpoint
	decf	telT2
	call	irStates
;	bra	ISR_HI_EXIT
	
;
ISR_HI_EXIT
	movff	bsr_temp, BSR
	movf	w_temp, W
	movff	status_temp, STATUS
	retfie

irStates
;
;
        return

MAINPROG
; 	start hoofdprogramma
	bsf	T0CON, TMR0ON		; Timer0 enabled
	bsf	T2CON, TMR2ON		; Timer2 on
;       en verder nog wat code

Ik heb deze code uitgeprobeerd met zowel een 18F452 als een 18F25K20.
Omdat ik mijn programma eerst wou testen maak ik gebruik van Watch en Sim in MPLab. Breakpoints zoals in de code.

Als ik de settings gebruik zoals hierboven is het koekie, Timer0 en 2 overflowen vrolijk en de subroutines worden keurig aangereoepen.

Maar als ik Timer0 niet enable is het een heel ander verhaal:
PIR1, TMR2IF gaat prachtig van 0 naar 1, maar de PIC komt NIET in zijn interrupt.

Wat mij verder opvalt is dat als Timer0 overflowt de interrupt vrijwel onmiddelijk wordt aangeroepen terwijl als Timer2 overflowt hij rustig nog even doorgaat voordat de interrupt wordt aangeroepen.

Ik snap er niets van & kan in de datasheet niet vinden wat ik niet goed doe.

Maar ja, ik kan natuurlijk zomaar iets heel wezenlijks over het hoofd zien.

Daarom vraag ik jullie om je waardevolle inzichten en ervaringen.

Om timer2 interrupts te krijgen moeten GIE en PEIE ook geset worden.

GIE doe ik ook, was ik alleen vergeten in de copy/paste.
Ten aanzien van PEIE: "The PEIE bit must also
be set If the desired interrupt enable bit is in a PIE register."
Timer2 zit inderdaad in PIE1, maar dan vind ik het wel mal dattie wel werkt als Timer0 is enabled.
Ik ga het in ieder geval even uitproberen, bedankt.

Heb het net uitgetest en je hebt helemaal gelijk.
Het werkt nu zoals verwacht.
De vermoedelijke reden dat het alleen samen met Timer0 werkte was dat Timer0 wel de interrupt genereerde en dat TMR2IF sowieso aanstond waardoor de ISR het keurig afwerkte.
Jammer dat de rol van PEIE niet duidelijk wordt uitgelegd bij de bespreking van Timer2.