4 votos

Interrupción de temporizador siendo llamada cada vez - Pic16F877A y CCS PIC C

Actualmente estoy probando el siguiente ejemplo

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#INT_TIMER1
void TimerOverflow() 
{
    printf("Desbordamiento del temporizador\r\n");
}

void main() 
{
   long time;
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER1);

   set_timer1(8000); //contar hasta 8000 luego desbordar
   time = get_timer1();
     while(1)
     {
     }

}

Sin embargo, la función de interrupción se supone que se llama cada (casi) 8 segundos, pero se está llamando como si el retraso fuera de 0 segundos. ¿Qué estoy haciendo mal aquí?

5voto

Rob Stevenson-Leggett Puntos 13266

Creo que has malinterpretado las funciones del temporizador. De acuerdo a tu comentario, estás asumiendo que set_timer1 establecerá el valor al que cuenta el temporizador. Pero lo que realmente sucede es que estás configurando el temporizador 1 con el valor 8000. La interrupción del temporizador se activa cada vez que el temporizador se desborda. Dado que el temporizador 1 es un temporizador de 16 bits, esto sucede cuando el contador llega a 65535. Entonces, la primera vez el temporizador cuenta de 8000 a 65535, activa la interrupción, reinicia el contador a 0 y vuelve a contar hasta 65535, activando la interrupción, y así sucesivamente.

Sea \$f\$ la frecuencia del reloj, entonces el intervalo de tiempo \$T\$ en el que se activa tu interrupción es: $$ T = \frac{4\cdot2^{16}}{f} $$ Así que para una frecuencia de reloj de 1Mhz, tu interrupción se activa cada 262ms, para una frecuencia de 20Mhz se activa cada 13ms.

Lo que necesitas hacer para obtener un retraso mayor es aumentar un contador en software en tu rutina de interrupción. Pero con tu frecuencia de reloj de 20Mhz estás obteniendo estos extraños 13ms. Para obtener un número redondo, como 10ms, necesitas contar hasta 50000 (reorganiza la fórmula de arriba). Entonces lo que puedes hacer es inicializar el temporizador no en 0 sino en \$2^{16} - 50000 = 15536\$ (esta vez con la función set_timer1). La última cosa que necesitas hacer es aumentar el contador de software mencionado cada vez que tu interrupción se activa. Cuando tu variable alcance un valor de 8000, sabrás que han transcurrido 8 segundos.

Deberías leer la hoja de datos para el pic, especialmente el capítulo 6 'Módulo Timer1', para comprender mejor lo que está sucediendo y cómo usar tu microcontrolador pic.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X