Autor Tema: VELOCIMETRO CON TIMER0  (Leído 5637 veces)

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

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: VELOCIMETRO CON TIMER0
« Respuesta #15 en: 11 de Mayo de 2015, 06:54:54 »
Seguí tus instrucciones y el velocímetro funciona correctamente, el único problema que tengo es que cuando la rueda deja de girar se muestra el valor máximo que ha alcanzado, es decir, que cuando disminuye la velocidad no disminuye o no lo muestra por pantalla se queda el valor mas grande que haya alcanzado hasta ese momento. He estado tocando cosas del programa pero no consigo arreglarlo. También he variado y en lugar de hacerlo con un while lo he hecho con un do

Código: [Seleccionar]
#include <18F4550.h>
#use delay(clock=20000000)
#include "C:\Users\xxx\Desktop\libreria_lcd\flex_lcd420.c"
#include <math.h>

int16 contador=0;
int1 flag=0;
int16 pulsos=0;
float RPM=0;
float VEL=0;

#int_TIMER1
void  TIMER1_isr(void)
{             
Contador++;
flag=1;
set_timer1(0);//Reinicia la cuenta

}

#int_CCP1
void  CCP1_isr(void)
{
Pulsos++;
}



void main()
{
   Set_tris_C(0x04); //C2 ENTRADA
   
   
   lcd_init();
   
   
   printf(lcd_putc, "VELOCIMETRO");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"VELOCIDAD KM/H");
   delay_ms(2000);
   
   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_ccp1(CCP_CAPTURE_RE);
   set_timer1(0); //Borrado contador
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_CCP1);
   enable_interrupts(GLOBAL);
   
    do
   {
   
   if (flag==1){
      RPM=pulsos*10*60;                           //Overflow de 0.1s
      VEL=RPM*0.030159089;                       //RADIO ES DE 8 CM
      lcd_putc('\f');
      printf(lcd_putc,"Vel = %0f Km/h",VEL);
      lcd_gotoxy(1,1);
      delay_ms(1000);
      flag=0;
   }
   
   }while(true);
     
   
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: VELOCIMETRO CON TIMER0
« Respuesta #16 en: 11 de Mayo de 2015, 07:07:00 »
Bueno hay un problema ahi, estas usando un delay dentro de la funcion. Esto hace que cuando muestre tenga muchos mas pulsos acumulados de los que deberia, Con lo que el valor deberia ser incorrecto.
Por lo que veo queres que se actualize cada 1 segundo... Entonces te propongo un par de cambios:

Citar
#use delay(clock=20000000)
#include "C:\Users\xxx\Desktop\libreria_lcd\flex_lcd420.c"
#include <math.h>

int16 contador=0;
int1 flag=0;
int16 pulsos=0;
float RPM=0;
float VEL=0;

#int_TIMER1
void  TIMER1_isr(void)
{            
Contador++;
if(Contador==10)
   {
   flag=1;
   Contador=0;
   }

set_timer1(0);//Reinicia la cuenta

}

#int_CCP1
void  CCP1_isr(void)
{
Pulsos++;
}



void main()
{
   Set_tris_C(0x04); //C2 ENTRADA
  
  
   lcd_init();
  
  
   printf(lcd_putc, "VELOCIMETRO");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"VELOCIDAD KM/H");
   delay_ms(2000);
  
  
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_ccp1(CCP_CAPTURE_RE);
   set_timer1(0); //Borrado contador
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_CCP1);
   enable_interrupts(GLOBAL);
  
    do
   {
  
   if (flag==1){
      RPM=pulsos*60;                             //Activa el flag cada 10 * 0.1s, se guardan los pulsos por 1 segundos
      pulsos=0;

      VEL=RPM*0.030159089;                       //RADIO ES DE 8 CM
      lcd_putc('\f');
      printf(lcd_putc,"Vel = %0f Km/h",VEL);
      lcd_gotoxy(1,1);
      flag=0;
   }
  
   }while(true);
      
    
}

Puse en negrita lo que cambie, antes guardabamos la cantidad de pulsos cada 0.1s y haciamos los calculos, primero multilpicabamos por 10 y luego por 60.
Ahora directamente observamos cuantos pulsos hay en 1 segundo (el timer sigue siendo de 0.1s pero no activa el flag hasta que Contador sea igual a 10, es decir 1 segundo)
Una ves utilizada la formula que usa la variable "pulsos" ya no nos interesa saber el valor que tenga,asi que procedemos a borrar la cantidad de pulsos, para poder comenzar nuevamente.

Respecto al do ..while y el while.
Casi no hay diferencias entre estos, la unica diferencia es que el do..while se ejecuta y luego observa la condicion, mientras que el while hace lo contrario, observa la condicion si se cumple ejecuta el codigo

Código: C
  1. do
  2. {
  3.  PrenderLed();
  4.  ApagarLed();
  5. } while (false);

Suponiendo que tenemos unas funciones asi. Ese codigo haria que el led se encienda y luego se apague y al no cumplir se la condicion no se sigue ejecutando

Código: C
  1. While(false)
  2. {
  3.  PrenderLed();
  4.  ApagarLed();
  5. }

Este ultimo codigo nunca se ejecutaria, ni siquiera una sola ves.

Para lo que nos compete, es exactamente lo mismo, ya que tratamos de crear un bucle infinito, pero uso el while por que es mas corto.
« Última modificación: 11 de Mayo de 2015, 07:51:23 por KILLERJC »


 

anything