Autor Tema: como pongo un timer?  (Leído 5147 veces)

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

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
como pongo un timer?
« en: 03 de Mayo de 2004, 10:56:00 »
Hola a todos:
Soy nuevo en esto y no entiendo bien los manuales a la hora de establecer un timer en un programa.
Podriais alguno enseñarme un ejemplo sencillo, gracias.

Mi programa +o- hace:

timer
leo (del puerto serie)
si hay algo lo guardo
si se pasa el tiempo del timer (2 segundos) sigo con el codigo
resto de codigo


Gracias otra vez a todos.

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
RE: como pongo un timer?
« Respuesta #1 en: 13 de Mayo de 2004, 10:06:00 »
Nadie me ha contestado y me gustaria poder realizar mi programa.....

Si no es molestia ...........¿¿¿¿¿alguien podria resolver mi duda??????

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: como pongo un timer?
« Respuesta #2 en: 13 de Mayo de 2004, 10:23:00 »
Primero:
No te enojes si alguien no responde de inmediato. hay varias razones para no contestar, y ademas si no quieren hacerlo no tienes nada que hacer al respecto.

Segundo:
Hay varias instrucciones para temporizar en C, depende la precision que necesites.

Ejemplo:
Delay_us(150); //esperara 150 microsegundos
Delay_ms(500)  //esperara 500 milisegundos, o medio segundo
Delay_ms(50000) //generara una pausa de 50 segundos

En todos el limite es de 65535, porque son de 16 bits.
Espero haber contestado tu pregunta, y que la proxima tengas mas paciencia.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
RE: como pongo un timer?
« Respuesta #3 en: 17 de Mayo de 2004, 10:24:00 »
Gracias por contestar, pero no es a eso a lo que me refiero.
Lo que me gustaria es poder usar la instruccion set_rtcc(0); pero no se como se hace de forma correcta. Muchas gracias.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: como pongo un timer?
« Respuesta #4 en: 17 de Mayo de 2004, 12:33:00 »
Escribe tu programa aunque creas que está mal, pégalo aquí y te diremos (si lo sabemos) donde estan los fallos. ¡Intentalo!

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
RE: como pongo un timer?
« Respuesta #5 en: 18 de Mayo de 2004, 09:16:00 »
Yo quiero leer de un puerto serie, pero si no hay nada que siga ejecutando código. Esto seria un ejemplo simple de lo que me gustaria hacer:

main()
{

......
    set_tris_d(0b00100000);
    #use rs32baud =19200,bits=8, parity=N, xmit=PIN_D4, rcv=PIN_D5)
   delay_ms(1000);

     //PONGO TIMER DE 3 SEG.

     aux=getc();

   //SI PASADOS LOS 3 SEG NO HAY DATOS

   output_high(PIN_D0);
   output_high(PIN_D1);
   output_high(PIN_D3);
   delay_ms(retardo);
   output_low(PIN_D0);
   output_low(PIN_D1);
   output_low(PIN_D3);
   delay_ms(retardo);     

}


#int_rtcc FUN()
{
   set_tris_d(0b00100000);
   #use rs232(baud=19200, bits=8, parity=N, xmit=PIN_D4, rcv=PIN_D5)
   delay_ms(1000);
   
   printf("  Se paso el tiempo";

}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: como pongo un timer?
« Respuesta #6 en: 18 de Mayo de 2004, 12:57:00 »
Sí que andas un poco despistadillo eh!

Algunos errores:

- El #use rs232 se pone fuera del main. Ponlo después del #use delay (que también te has dejado). Si no cambias sus propiedades solo hace falta definirlo una vez.

- Falta el tipo de PIC

- Cuando definas #int_rtcc el nombre de la función ponlo debajo

- En el set_tris_d(0b00100000); no cambias los valores de los bits, entonces solo hace falta definirlo una vez (en el main)

- Para activar la interrupción del TMR0 se hace así (en el main también):

enable_interrupts(GLOBAL)

enable_interrupts(INT_RTCC)

- Para inicializar el TMR0 para que sea activado por pulsos internos y con por ejemplo un Preescaler de 128:

setup_counters(RTCC_INTERNAL, RTCC_DIV_128)

- Para cargar el TMR0 con un determinado valor:

set_rtcc(61)

Uf ... ahora que siga otro.

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
RE: como pongo un timer?
« Respuesta #7 en: 18 de Mayo de 2004, 17:33:00 »
Muchas gracias Pocher.


El #use rs232 lo meto en el main porque en mi circuito tengo 2 puertos series y voy cambiando de 1 a otro (a lo mejor lo hago mal).
 #use delay no se para que sirve, me puedes decir omo lo pongo???

El tipo de pic es el 16f877, no he puesto las cabeceras ni la declaracion de las variables porque solo he puesto un resumen de mi codigo ya que solo tengo la duda de como poner el timer -

No creo que sea necesario ponerel  nombre de la función debajo del #int_rtcc

Tienes razon, en el set_tris_d(0b00100000) deberia inicializarlo una sola vez (problemas del tipico copy paste);

Lo de enable_interrupts(GLOBAL) enable_interrupts(INT_RTCC) tambien lo uso solo que en el resumen no lo puse.

Y bien, a partir de aqui es donde tengo la duda y lo siento por mi torpeza, pero sigo sin tenerlo claro:

COMO inicializo  el TMR0 para que sea activado por pulsos internos
¿Por que el 0 y no otro?
¿Que significa Preescaler de 128?

¿QUE hace realment esta funcion setup_counters(RTCC_INTERNAL, RTCC_DIV_128)?

¿Se supone que  set_rtcc(61) equivale a que tras 3 se capturara la interrupcion?


Muchas gracias por tu respuesta anterior ya que me ha servido para concretizar mis dudas. Y gracias por adelantado a todos los queintenten ayudarme.

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: como pongo un timer?
« Respuesta #8 en: 18 de Mayo de 2004, 18:03:00 »
Hola..

setup_counters(RTCC_INTERNAL, RTCC_DIV_128)

RTCC_INTERNAL esta instrucción lo que hace hacer que TMR0 funcione con el reloj interno del pic.. el  RTCC_DIV_128 es el preescaler, para explicar el preescaler.. voy a poner un ejemplo..

Si tu quieres que cada 10ms se desborde el TMR0 entonces haces lo siguiente.. pasas 10ms a microsegundos osea 10000 microsegundos, luego supongamos que tienes el preescaler a 128 entonces 10000/128 = + o - 78, es decir 78 pulsos hasta que el TMR0 se desborde, pero primero debemos buscar el complemento a partir de donde deberemos sumar 255 es decir 255-78=177, entonces se carga el tmr0 con 177 y apartir de hay el rebosara a los 10ms..

osea

set_rtcc(177); // despues de 10ms saltara a rutina de interrupción

Bueno creo que no es mas.
Espero te sirva

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: como pongo un timer?
« Respuesta #9 en: 18 de Mayo de 2004, 18:39:00 »
Perdon.. falto...

El #USE delay es para que el compilador conozca el valor del reloj, es decir la velocidad de operación.. y asi poder hacer los delays

solo lo colocas antes de la drectiva #use rs232(..

Osea

#use delay(clock=4000000)
#use rs232(baud=9600,.... etc, etc

Ahora si adios.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: como pongo un timer?
« Respuesta #10 en: 19 de Mayo de 2004, 08:56:00 »
Perdon, pero puedes poner varios #use rs232 en el encabezado, con diferentes identificadores y diferentes velocidades y pines, luego llamas desde dentro del programa a ese identificador (por ejemplo Comm1) y el programa utilizara el que tu digas, con los parametros seleccionados.
Hay un truco aqui que te permitira utilizar el mismo puerto a dos velocidades diferentes, declarandolo con #use rs232
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado woijkh

  • PIC10
  • *
  • Mensajes: 6
RE: como pongo un timer?
« Respuesta #11 en: 25 de Mayo de 2004, 09:47:00 »
Muchas gracias a todos. Voy a probarlo ahora mismo.

Desconectado Julian_24

  • PIC10
  • *
  • Mensajes: 11
RE: como pongo un timer?
« Respuesta #12 en: 25 de Mayo de 2004, 19:05:00 »
Hola, no consiog hacerlo funiocar, estas seguro que esos son los calculos?. Pego mi codigo:
si pongo el rtcc_div_256, tarda años en encenderse el primer led
, si lo pongo como en el ejemplo , tarda como un segudno y medio.
Tengo el timer configurado para 20 segndos, el de rb0, y para 20 ms el de b1.

Segun mis calculos seria:

4.000.000 mhz/(4*256*256)
4 = pq se produce el flanco por cada 4 ciclos de reloj
256, del preescaelr y el otro del valor a cargar en set_timer0();

lo que da que cada 15 interrupciones, tendriamos un segundo.
es correcto?



#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT
#define OFF 0
#define ON 1

int16 n_t0=0;

int led=OFF;


#int_RTCC
RTCC_isr()
{

n_t0++;
if (n_t0==1000)
{
 n_t0=0;

if(led==OFF)
  {
   output_high(PIN_B0);
   led=ON;
 }
   else
   {
      output_low(PIN_B0);
      led=OFF;
   }
}


if(led==OFF)
  {
   output_high(PIN_B1);
   led=ON;
 }
   else
   {
      output_low(PIN_B1);
      led=OFF;
   }



   set_rtcc(0);
}



void main()
{
   set_tris_b(0x00);
   output_low(PIN_B0);
      output_low(PIN_B1);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

  set_rtcc(177);
   enable_interrupts(INT_RTCC);
   enable_interrupts(global);

while(ON)
   {
   sleep();
   }

}

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: como pongo un timer?
« Respuesta #13 en: 25 de Mayo de 2004, 21:33:00 »
Hola..
Creo que te falta incluir en el main esta instrucción

setup_counters(RTCC_INTERNAL,RTCC_DIV_256);

Y no se yo lo uso y me funciona.. digamos si necesito medir un segundo entonces hago lo siguiente...

#define int_por_seg 75 //mas o menos son el numero
//de interrupciones que ocurren en un segundo poniendo
//el preescaler a 256 y con cristal de 20Mhz

int contador;
short flag;

#int RTCC
int(){
contador++;
if(contador==int_por_seg){
contador = 0;
flag=1;//pongo a uno este flag para saber que a pasado un
//segundo
}else flag=0;
}

Saludos.. espero sea de ayuda

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: como pongo un timer?
« Respuesta #14 en: 26 de Mayo de 2004, 01:00:00 »
um pequeno exemplo,testei e funciona,pisca um led a cada exatamente 2 segundos,se quiser mais precisao,tenho outro código:

#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt,NOWDT,PUT,NOLVP

#int_timer0
void trata_t0 ()
{
   static boolean led;
   static int conta;
   // reinicia o timer 0 em 131 mais a contagem que já passou
   set_timer0(131+get_timer0());
   conta++;
   // se já ocorreram 250 interrupções
   if (conta == 250)
   {
      conta=0;
      led = !led;  // inverte o led
      output_bit (pin_b0,led);
   }
}

main()
{
   // configura o timer 0 para clock interno e prescaler dividindo por 64
   setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64);
   set_timer0(131); // inicia o timer 0 em 131
   // habilita interrupções
   enable_interrupts (global | int_timer0);
   while (true); // espera interrupção
}




//a frequencia seria:

//f=4000000/4/64/125/250=0,5hz ou t=2s









 

anything