Autor Tema: Ayuda codigo Tacometro 4x7segmentos 16F628a  (Leído 2388 veces)

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

Desconectado adrimadeo

  • PIC10
  • *
  • Mensajes: 4
Ayuda codigo Tacometro 4x7segmentos 16F628a
« en: 24 de Marzo de 2013, 20:26:46 »
Hola, estoy programando un tacometro a base de un PIC16F628a representado en 4 digitos de 7 segmentos.
El codigo mide el tiempo entre pulsos entrantes por RB0 (Interrupcion Externa), realiza el calculo de RPMs y lo representa barriendo los dos primeros digitos. De esta manera me queda una apreciacion de 100RPMs.
Mi problema es que la Interrupcion Externa se ejecuta una sola vez al principio y despues no vuelve a saltar.
Agrego a continuacion el codigo en CCS y adjunto el proyecto de Proteus.
Agradezco a todos por su ayuda.

//////////////////////////////////////////////////////////////////////////
Código: [Seleccionar]
#include <16f628.h>

#fuses NOWDT,HS,PUT,NOPROTECT

#use delay(clock=12000000)

#use fast_io(A)

#define ON output_high
#define OFF output_low

#define DIS1 PIN_A0
#define DIS2 PIN_A1
#define DIS3_4 PIN_A2

short flagllegopulso=0;

long t1=0;
long rpm=0;
long desbordamientos=0;
long prom=0;

int tabla[10]={0b10000000,0b11110010,0b01001000,0b01100000,0b00110010,0b00100100,0b00000100,0b11110000,0b00000000,0b00100000};
long dig1=0;
long dig2=0;

#INT_TIMER1
void TMR1_Interrupt()
{
   ++desbordamientos;
}

#INT_EXT
void RB0_Interrupt()
{
   flagllegopulso=1;
}

void main()
{
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
     
   ext_int_edge(L_TO_H);
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000001);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   do{
      if (flagllegopulso==1)
      {       
         t1=get_timer1();
         set_timer1(0);
         flagllegopulso=0;
         rpm = 50+(90000000/(t1+(desbordamientos*65536)));
         desbordamientos=0;
       
         ++prom;
         if (prom==10)
         {
          prom=0;
         
dig1=(rpm/1000);
dig2=(rpm/100)-(dig1*10);

ON (DIS1);
output_b(tabla[dig1]);
delay_ms(50);
OFF(DIS1);
delay_ms(50);

ON (DIS2);
output_b(tabla[dig2]);
delay_ms(50);
OFF(DIS2);
delay_ms(50);
         }
      }
   }while(TRUE);
}
//////////////////////////////////////////////////////////////////////////

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ayuda codigo Tacometro 4x7segmentos 16F628a
« Respuesta #1 en: 24 de Marzo de 2013, 21:40:26 »

Ya simulaste el el código porque creo que va haber problemas con la multiplexación de los displays, creo que lo más sano seria realizar el refresco de los displays por medio del timer 0 por que así como lo tienes creo que no te va funcionar, y básicamente es debido al tiempo que lleva realizar el cálculo de las RMP.
Un saludo desde Pereira - Colombia

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Ayuda codigo Tacometro 4x7segmentos 16F628a
« Respuesta #2 en: 25 de Marzo de 2013, 01:12:11 »
Hola, por empezar tenes un problema en la forma de mostrar las rpm, ya que al encender el aparato deberia mostrar algo y seguir mostrando independientemente de las rpm del motor. En segundo lugar no comparto la forma de medir las rpm, yo por ejemplo contaria los pulsos de rb0 en un tiempo de 1seg  y los multiplicaria para sacar las rpm. Ademas si el motor gira muy lento que pasa?


 

anything