hadv
Just find out what you like and let it kill you
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.
hadv
Just find out what you like and let it kill you
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.
hadv
Just find out what you like and let it kill you
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.