TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: TOFLE en 24 de Enero de 2005, 15:00:00

Título: Problemas de temporización con la interrupción del TIMER0
Publicado por: TOFLE en 24 de Enero de 2005, 15:00:00
Buenas noches a todos y gracias por toda la ayuda prestada a todos los que dominan y empiezan (como yo) en esto de los PIC"s.

Les cuento, estoy preparando mi proyecto final de carrera y tengo pensado incluir dentro de él un metrónomo musical a partir del PIC16F84.
Pues bien, el siguiente código es cosecha propia, dicho programa debería encender/apagar unos led"s unas 150 veces por minuto, que es el tempo que he elegido para probar.
Comparando mi circuito en funcionamiento con un metrónomo comercial me he dado cuenta de que mi metrónomo retrasa, y retrasa tanto que se sincronizan entre mi metrónomo y el comercial si el comercial lo coloco a unos 130 ppm, siendo que el mío, se supone que va a 150 ppm.

Es aquí donde viene mi duda, ¿Alguien sabe el por qué de ésto y cómo solucionarlo?

Muchísimas gracias de antemano a todos los participantes del foro!

#include <16F84.h>
#use delay (clock=4000000)

#byte PORT_B=6

int32 Cte=240000; //Resultado de 60seg/tInterrup=60/250us=240000
int t256us=131; //Valor para recargar el TIMER0
int16 cont_int=0; //Contador de interrupciones


#int_RTCC
void interrupt_met(void) //Rutina que atiende a interrupción
{
   set_RTCC(t256us);
   cont_int++;
}

void main()
{
   int16 nCiclos; //Ciclo de interrupción para lograr el tiempo de Temporiz.
   int nTempo,nCompas,contCompas,e_LED; //Tempo,Compas,TiempoCompas,enableLED

   set_tris_b(0x00); //Puerto B como salida
   PORT_B=0x00; //Todo el puerto B a 0

   set_RTCC(t256us); //Cargamo y habilito el TIMER0
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2); //Pre-escaler de 2
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   nTempo=150; //Tempo=150
   nCiclos=Cte/nTempo; //Nºinterrupciones para el tiempo de temporización
   nCompas=2; //Tipo de Compás 2/4
   contCompas=0; //Tiempo dentro del compás
   e_LED=1; //Habilito el LED

   switch (nCompas)  //Switch para varios tipos de compas
   {
      case 2:  while (1) //Bucle infinito
               {
                  if ((e_LED==1)&&(cont_int==nCiclos))
                  {
                     contCompas++;
                     if (contCompas>nCompas)  
                     {
                        contCompas=0; //Si contCompas>2 (2/4) vuelvo a 0
                     }
                     if (contCompas==1)  //Tiempo fuerte del 2/4
                     {
                        cont_int=0;  //Recargo el contador de interrupciones
                        output_high(PIN_B7);  //Salida RB7 alta
                        output_low(PIN_B6);  //Salida RB6 baja
                     }
                     if (contCompas==2)  //Tiempo debil del 2/4
                     {
                        cont_int=0;  //Recargo el contador de interrupciones
                        output_high(PIN_B6);  //Salida RB6 alta
                        output_low(PIN_B7);  //Salida RB7 baja
                     }
                   }
                }
   }
}