SALUDOS MAESTROS....
les escribo pues estoy implementando un tacometro usando una pic16f628a , con algunas rutinas que he encontrado en este foro, y estoy a punto de lograrlo, pero tengo un problema con el multiplexeo con los displays de 7 segmentos.
Mi traba es que cuando entro en el while(1) del main, una funcion me saca las revoluciones por minuto, y luego tira al multiplexeo, es decir, se me apagan los displays cuando entra en la interrupcion, y es molesto, pues trabajo con pocas rmps, (60 a 600 aproximandamente), entonces se demora
Este es el codigo que estoy ocupando:
#include <16f628a.h> //pic a utilizar
#include <MATH.h>
#fuses NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR,HS //ordenes para el programador
#define COMENZAR 0
#define CONTANDO 1
#define TERMINO 2
#define VECES 2
#use delay (clock=10000000) //Fosc=4Mhz
#use standard_io(B)
#use standard_io(A)
//Variables Globales
float dato;
char cEstado;
int32 int32Cont;
float fRpm;
char i;
char j;
long int unidad,decena,centena;
int display_on[3]={0b1110,0b1101,0b1011}; //tabla display on
int Digito[3];
//INTERRUPCION POR RB3 CCP1//
#INT_CCP1
void CCP1__isr(void) {
if (cEstado == CONTANDO) { // Segundo Pulso
int32Cont += CCP_1; // Toma el valor de captura
cEstado = TERMINO; // Evito que vuelva a procesarse durante esta interrupcion
}
if (cEstado == COMENZAR) { // Primer Pulso
set_timer1(0); // Restaura el timer1 en este pulso
cEstado = CONTANDO;
int32Cont = 0;
}
}
//velocidad//
float velocidad(void){
char cCnt;
int32 int32Suma;
long tiempo;
cEstado = TERMINO;
while (TRUE) {
int32Suma = 0;
int32Cont = 0;
for (cCnt = 0; cCnt < VECES; cCnt++) { // Acumula VECES lecturas
cEstado = COMENZAR; // Permite comenzar a la interrupcion
while (cEstado != TERMINO) { // Espera hasta que se activa la interrupcion
tiempo = get_timer1();
if (tiempo > 65500) { // Controla si el contador excedio el tiempo. Valor Original = 60000
set_timer1(0); // Restaura el timer1 para seguir sumando el tiempo de este pulso
int32Cont += tiempo; // Acumula para velocidades de viento bajas
} // Fin if
} // Fin if
int32Suma += int32Cont; // Acumula los tiempos
} // fin for
int32Suma /= VECES; // Saca el promedio de las VECES que se tomo la medicion
fRpm = 1 / ( float ) int32Suma / 8 * 2.5; // Periodo en uS
fRpm *= 1000000; // Periodo en segundos
fRpm *= 60; // Periodo en minutos
dato = fRpm;
centena=dato/100;
decena=(dato-centena*100)/10;
unidad=dato-(centena*100)-(decena*10);;
return centena, decena, unidad;
}
}
//Display
// Conexiones: a
// B0 -> a 7seg ____
// B1 -> b 7seg f | | b
// B2 -> c 7seg | g |
// B4 -> d 7seg ----
// B5 -> e 7seg e | | c
// B6 -> f 7seg |____|
// B7 -> g 7seg d
//////////////////////////////////////////////////////////////////////////////////
void display7seg(int j){
switch (j) {
case 0: output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_high(pin_b4);
output_high(pin_b5);
output_high(pin_b6);
output_low(pin_b7);
break;
case 1: output_low(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_low(pin_b7);
break;
case 2: output_high(pin_b0);
output_high(pin_b1);
output_low(pin_b2);
output_high(pin_b4);
output_high(pin_b5);
output_low(pin_b6);
output_high(pin_b7);
break;
case 3: output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_high(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_high(pin_b7);
break;
case 4: output_low(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_low(pin_b4);
output_low(pin_b5);
output_high(pin_b6);
output_high(pin_b7);
break;
case 5: output_high(pin_b0);
output_low(pin_b1);
output_high(pin_b2);
output_high(pin_b4);
output_low(pin_b5);
output_high(pin_b6);
output_high(pin_b7);
break;
case 6: output_high(pin_b0);
output_low(pin_b1);
output_high(pin_b2);
output_high(pin_b4);
output_high(pin_b5);
output_high(pin_b6);
output_high(pin_b7);
break;
case 7: output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_low(pin_b7);
break;
case 8: output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_high(pin_b4);
output_high(pin_b5);
output_high(pin_b6);
output_high(pin_b7);
break;
case 9: output_high(pin_b0);
output_high(pin_b1);
output_high(pin_b2);
output_low(pin_b4);
output_low(pin_b5);
output_high(pin_b6);
output_high(pin_b7);
break;
}
}
//MAIN//
void main (void){
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8 );
setup_ccp1 (CCP_CAPTURE_FE); // Captura cada pulso = 0 (0v)
delay_ms (200);
enable_interrupts (INT_CCP1);
enable_interrupts (GLOBAL);
while(1){
velocidad();
Digito[0]=centena;
Digito[1]=decena;
Digito[2]=unidad;
for(i=0;i<3;i++){ //multiplex
delay_ms(10);
output_a(display_on[i]);
display7seg(Digito[i]);
}
}
} //Fin While
Si pudieran darme ideas para solucionar este problema... estaria muy agradecido, bueno les adjunto los archivos para simular en proteus, y vean como es el comportamiento.
De antemano Gracias.