Autor Tema: TMR0 Y TMR1!!!!R.P.M.!!!!!  (Leído 5145 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
TMR0 Y TMR1!!!!R.P.M.!!!!!
« en: 24 de Junio de 2004, 06:12:00 »
Buenas  foreros, me vais a llamar pesado!!!!jeje!!
Tengo que obtener la velocidad en r.p.m. y tengo un encoder, entonces tendre que progrmar TMR0 como temporizador durante 1s (1000ms), y el TMR2 como contador para que cuente cuantos pulsos le llegan (no se que pata seria, es cuestion de mirar) del exterior, y ese numero multiplicarlo por 60 para obtener las r.p.m. y este dato mandarlo por el puerto serie(aunque serán caracteres, en visual basic ya se convertiran a numeros, no??)!!
Mi pregunta es como se configurarian los dos temporizadores??es decir, como son las secuencias??
Habria que habilitar las interrupciones generales y luego la interrupcion del timer 0, no??"
Muchas gracias de antemano y saludos a todos vosotros!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #1 en: 24 de Junio de 2004, 10:29:00 »
Sí claro tienes que habilitar las interrupciones GLOBAL y INT_RTCC.

Cuando finalice el tiempo preestablecido por tí, que no tiene porque ser 60s, dentro de la interrupción haces pulsos=get_timer1().

Haz el programa y lo corregimos, es sencillo.

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #2 en: 24 de Junio de 2004, 12:05:00 »
He conseguido hacer lo siguiente, me compila, pero no se si funciona ya que no se como simularlo!!!!
Si me pudieras ayudar muchas gracias, si algo falta o está mal respondeme por favor!
No espero a un segundo, cada 10ms desbordo el timer0, ya que es de 8 bits y si quiero hacer de 1s se me sale el valor a cargar del rango; luego cklaro, al ser cada 10ms, los pulsos los multiplico por 1000.

*****************************************************
#include <16f873.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

#int_RTCC

long int pulsos;

RTCC_isr()
{
   pulsos=get_timer1();
}

main()
{

   long int velocidad;

   while(true)
   {
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RTCC);
      setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_256);
      set_rtcc(21);  //60ms -> 60000us -> 60000/256=234 -> 255-234=21

      velocidad=pulsos*1000.0;

   }

}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #3 en: 24 de Junio de 2004, 23:22:00 »
Si tomas pulsos cada 10ms por muy rápido que vaya el motor no le va a dar tiempo a dar ni una vuelta. Cada vez que entra en la interrupción debes de incrementar una variable y cuando esta variable llegue a un cierto valor, entonces tomas datos (pulsos=get_timer1()).

Todo esto: enable_interrupts(GLOBAL); enable_interrupts(INT_RTCC); setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_256); set_rtcc(21); //60ms -> 60000us -> 60000/256=234 -> 255-234=21 , mételo en el main, no en el while.

En la fórmula velocidad=pulsos*1000.0; no hace falta el .0, el 1000 claro, está mal y además, esta fórmula métela en la interrupción, detrás del  pulsos=get_timer1().

Vete haciendo y vamos corrigiendo.

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #4 en: 25 de Junio de 2004, 04:41:00 »
He hecho los cambios q me has aconsejado y sigue sin funcionar, no me coje los valores del contador y logicamente no me los manda por puerto serie. Te dejo el codigo por si me puedes ayudar, saludos y gracias de nuevo por ayudarme.


#include <16f873.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#int_RTCC

long int pulsos;
int interrupcion;
int velocidad;

RTCC_isr()
{
   interrupcion=interrupcion+1;
   while(interrupcion=100)
      {
      pulsos=get_timer1();
      velocidad=pulsos*60;
      printf("%d",velocidad);
      interrupcion=0;
      }
}

main()
{

   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
   set_rtcc(177); //10ms -> 10000us -> 10000/128=78 -> 255-78=177

   interrupcion=0;

   while(true)
   {
   
         //el programa principal que estaria haciendo, esperando a la interrupcion
   }

}


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #5 en: 25 de Junio de 2004, 11:18:00 »
Veo que estás ahí, te lo estoy mirando, pero hay alguna chorrada que no me salen los resultados. Sigo en ello.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #6 en: 25 de Junio de 2004, 11:45:00 »
¡¡¡Ya está!!!

Codigo:
#include <16f873.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int16 pulsos;
int16 interrupcion;
int16 velocidad;

#int_RTCC

RTCC_isr()
{   
interrupcion++;
if(interrupcion==100)
{
   pulsos=get_timer1();
   velocidad=pulsos*60;
   printf("%lu   ",pulsos);
   printf("%lu   ",velocidad);
   delay_ms(2000);
   interrupcion=0;
   set_timer1(0);
   set_rtcc(177);
}
}

main()
{

set_tris_c(0x01);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
set_rtcc(177); //10ms -> 10000us -> 10000/128=78 -> 255-78=177

setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
set_timer1(0);

interrupcion=0;

while(true)
{
//el programa principal que estaria haciendo, esperando a la interrupcion
}

}


Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #7 en: 25 de Junio de 2004, 12:02:00 »
Muchas garcias pocher, no se que haría son ti, jeje, no que es broma, pero muvhas gracias otra vez, no se cuantas van, pero si me pudieras decir en k falla???
gracias de nuevo y saludos!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #8 en: 25 de Junio de 2004, 12:08:00 »
El programa que te he puesto, creo que está bien. Pruébalo físicamente y ya me contarás.

Acuerdate que la entrada de pulsos va por RC0.

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #9 en: 25 de Junio de 2004, 12:14:00 »
 Simulando como tu dices funciona, pero me referia a si pudieras decirme en que fallaba mi programa, para poder aprender en que he fallado, gracias!!
Saludos!!

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #10 en: 25 de Junio de 2004, 12:46:00 »
Bueno, yo he usado para esto el CCP midiendo el ancho del pulso, con esto obtengo el periodo, luego  1/x y tienes la frecuencia, de ahi a las RPM estas a un paso, hay un ejemplo de medicion de velocidad del viento en este subforo de donde saque la idea publicado por lu6vg, espero te sirva.

saludos

ARIEL
saludos
PikMan

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #11 en: 25 de Junio de 2004, 23:21:00 »
alguns erros:


#include <16f873.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#int_RTCC //esta linha deve preceder a função

long int pulsos;
int interrupcion;
int velocidad;

RTCC_isr()
{
interrupcion=interrupcion+1;
while(interrupcion=100) //deve-se utilizar o operador   comparação "==" e não utilize whiles dentro de uma interrupção
{
pulsos=get_timer1();
velocidad=pulsos*60;
printf("%d",velocidad);
interrupcion=0;
}
}

main()
{


enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
set_rtcc(177); //10ms -> 10000us -> 10000/128=78 -> 255-78=177

interrupcion=0;

while(true)
{

//el programa principal que estaria haciendo, esperando a la interrupcion
}

}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #12 en: 25 de Junio de 2004, 23:26:00 »
Pués el fallo más importante que había es que no habías programado el TMR1 en el main con setup_timer1(...) y claro no contaba pulsos.

Otras cosillas:

- Definías long pulsos y int velocidad ---> deben definirse al revés ya que pulsos es dificil que pase de 255 pulsos por segundo, sin embargo velocidad sí que pasa.

- Como consecuencia de esto en el printf el formato de la velocidad ha de ser %lu

Un saludo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #13 en: 28 de Junio de 2004, 10:58:00 »
Un detalle más, sin el cual el programa no va a ir bien.

Al entrar en la interrupción se incrementa la variable y luego se pregunta el if. Todo esto repetido 100 veces va a dar lugar a que el TMR1 cuente más pulsos de los que son, con lo cual saldrá más velocidad de la que toca.

Para solucionar esto nada más entrar en la interrupción captura el valor del TMR1 y al salir se lo devuelves.

Un saludo

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: TMR0 Y TMR1!!!!R.P.M.!!!!!
« Respuesta #14 en: 28 de Junio de 2004, 13:20:00 »
Muchas gracias a todos!!
Entonces como quedaría la interrupcion??

De la siguiente manera??? Es que todavia ando pez en esto de CCS...ya me perdonareis

********************************
#int_RTCC

RTCC_isr()
{
   pulsos=get_timer1();
   interrupcion++;
   if(interrupcion==100)
   {
      pulsos=get_timer1();
      velocidad=pulsos*60;
      printf("%lu   ",pulsos);
      printf("%lu   ",velocidad);
      delay_ms(1000);
      interrupcion=0;
      set_timer1(0);
      set_rtcc(177);
   }
}