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.
//////////////////////////////////////////////////////////////////////////
#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);
}
//////////////////////////////////////////////////////////////////////////