I am not getting the time I expect from the following Interrupt Driven timer.
Controller is 16F887,internal OSC at 8MHz, expected interrupt every 25usec and I get every 101usec.
If I change the reload value to 63, the expected interrupt is 100usec and I get 146usec.
A check on the IntOSC with Clock out on RA6 prooves that the Clock is correct @ 2MHz (8MHz/4).
I tested also with the Timer2 w/o pre-post scalers with exactly the same results.
Here is the test code that is making me nervous:
I miss something here but ... what?Code:DEFINE OSC 8 OSCCON = %01110001 'SET SYSTEM CLOCK SWITCH BIT @Line1 = _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON @Line2 = _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT @ __CONFIG _CONFIG1, Line1 & Line2 @ __CONFIG _CONFIG2, _WRT_HALF & _BOR40V PORTA=0:PORTB=0:PORTC=0:PORTD=0:PORTE=0 TRISA=%00101101 TRISB=%00000000 TRISC=%10000000 TRISD=%00000011 TRISE=%00000000 OPTION_REG=00001111 WPUB = %00111111 ADCON0 = %11000001 ADCON1 = %00000000 'Set PORTA/E analog/digital, right justify result ANSEL = %00101101 'lower port A as Analog input ANSELH = %00000000 'all others Digital inputs DEFINE ADC_BITS 10 'Number of bits in Adcin result DEFINE ADC_CLOCK 3 'ADC clock source (rc = 3) DEFINE ADC_SAMPLEUS 50 pwm1 var portc.2 INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts '************************************************************************** '**** '**** Initialization '**** '************************************************************************** 't2con = %0000100 ;Fosc/4, no prescaler, no postscaler 't1con = %00110001 'Enable Timer1 (16bit) /8 prescaller, int. Fosc/4 clock '@ 20MHz times out every 104,86ms '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR0_INT, _UpdateTimer, PBP, yes ; INT_Handler AD_INT, _ADC_Sub, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @ INT_ENABLE TMR0_INT ; enable Timer 1 interrupts ;@ INT_ENABLE AD_INT ; enable ADC Interrupt CLEAR loop1: pause 100 goto loop1 UpdateTimer: 'This interrupt should happen every 25usec :( tmr0=213 toggle portc.2 @ INT_RETURN
Ioannis






Bookmarks