Autor Tema: Contando tiempo  (Leído 1515 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
Contando tiempo
« en: 21 de Febrero de 2006, 08:36:00 »
Hola,

Tengo q usar los timers para contar un intervalo de tiempo bastante grande, alrededor del minuto (exageradamente). El problema es q no me alcanza con un timer de 6 bits, por lo q pense en poner dos de 16 bits.
Mi idea era q cuando el primero activara su interrupcion el otro contara uno, pero me parece tonto usar un segundo timer para eso. Me parece mas logico usar una variable como contador de los desbordamientos del timer.
Necesito una opinion al respecto, o si alguien sabe como implementarlo con dos timers.

Muchas gracias, Nyquist.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
RE: Contando tiempo
« Respuesta #1 en: 21 de Febrero de 2006, 11:45:00 »
Hola, si usas una frecuencia de 4Mhz, con el timer1 y rango de division 8 tienes una temporizacion maxima de : 4*(1/4Mhz)*65536*8=0.5243seg

Por lo que si pones un contador en la rutina del timer1, que cuente hasta : 60seg/0.5243 = 114, tienes un minuto.

Espero haberte ayudado en algo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: Contando tiempo
« Respuesta #2 en: 21 de Febrero de 2006, 14:23:00 »
aqui te dejo un pequeño programita que cuenta asta 30 segundos y prende un led en pin_a0 y cuando cuenta 60segundos lo apaga y vuelve el contador "tiempo " a cero.

saludos.

#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#byte port_a=5
#byte port_b=6

unsigned int32 tiempo=0;

#int_RTCC
RTCC_isr()
{
   tiempo++;

   set_rtcc(0);
}

void main() {

   int8 num=0;
   /* para calcular en periodo de cada interrupcion
      ((256-0)*4*256)/4000000=0,065536
      y
      30seg / 0,065536 = 457.7 --> 458 redondeado      
   */  
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(global);

   set_rtcc(0);

   set_tris_a(0);
   set_tris_b(0);

   port_a=0;
   port_b=0;

   while(true)
   {
      if(tiempo>=458) // cuando la variable tiempo llega a 458 an pasado 30 seg. aprox.
      {
         output_high(pin_a0);
      }
     
      if(tiempo>=916) // cuando la variable tiempo llega a 916 an pasado 60 seg. aprox.
      {
         output_low(pin_a0);
         tiempo=0;
      }
     
   }
}

aqui te dejo un ejemplo un poquito mas completo con proteus.
un contador de tiempo con rtcc activado por botones.
link: http://miarroba.com/foros/ver.php?foroid=348538&temaid=4235884

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
RE: Contando tiempo
« Respuesta #3 en: 22 de Febrero de 2006, 08:33:00 »
Escrito originalmente por micro_pepe
Hola, si usas una frecuencia de 4Mhz, con el timer1 y rango de division 8 tienes una temporizacion maxima de : 4*(1/4Mhz)*65536*8=0.5243seg

Por lo que si pones un contador en la rutina del timer1, que cuente hasta : 60seg/0.5243 = 114, tienes un minuto.

Espero haberte ayudado en algo.


Hola,
Ambas sugerencias me sirvieron mucho. En realidad no tenia eso del rango de division, lo q en la hoja de datos llaman "prescaler". Con esa idea puedo utilizar un prescaler de 256, con lo cual voy a tener una temporizacion de 16,77 seg (mejor aun).
Pero si necesito una presicion extrema para contar tiempo, el prescaler no me serviria porq en vez de contar un ciclo del u estaria contando cada 256 ciclos.
Podria usar una variable como contador, si un int tiene dos bytes (creo, si alguien me lo puede confirmar) podria contar hasta 65535, con lo cual =>
4*(1/4Mhz)*65536*65535=4294.83seg => podria contar hasta 4294.83 seg.

Muchas gracias por la ayuda, Nyquist.





 

anything