desktop

Problema con las interrupciones del timer0 (ccs-pic16F876A)

Hola

Supuestamente con este codigo tendria tick de 1us y al cargar el timer con 255 desbordaria cada 1us .
Cuando lo simulo en proteus tengo un tiempo de desborde de 32us.
El codigo este es de prueva para despues implementarlo en otro, o se si es problema de proteus o la programacion.

Saludos

#include <16F876A.h>
#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)

long int cont=0;
#int_TIMER0
void TIMER0_isr(void)
{
output_toggle(PIN_C0);
set_timer0(0xff);
}
void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,2);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_timer0(0xff);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
do
{delay_ms(1);}while(1);
}
 
Tu problema es el siguiente cada instrucción en un pic requiere cuatro ciclos de reloj para ejecutarse en este caso 8.000.000/4 = 2.000.000 de instrucciones por segundo el periodo es de 1 / 2.000.000 = quiere decir una instrucción cada 0.5us .
La función de interrupción tiene varias instrucciones ................... void TIMER0_isr(void)
Las funciones en ensamblador son las siguientes :
.................... output_toggle(PIN_C0);
002F: BCF 27.0
0030: MOVF 27,W
0031: BSF 03.5
0032: MOVWF 07
0033: MOVLW 01
0034: BCF 03.5
0035: XORWF 07,F
.................... set_timer0(0xff);
0036: MOVLW FF
0037: MOVWF 01
.................... }
Todo esto necesita un tiempo para realizarse y aumenta la espera entre una interrupción y otra

suerte y soludos
 
Atrás
Arriba