necesito de su ayuda , ya no se como hacer para cambiar EL DATO SIN USAR INTERRUPCIONES EXT, no se me ocurre como hacer para mostrarlo, subo el codigo
#include <16f883.h>
#device adc = 10
#fuses NOFCMEN
#use delay(internal = 8 MHz)
int porcentaje;
int frecuencia;
int1 flagHayDatos=0;
float const ticks_us = 4.0;
// Tabla para dígitos de 7 segmentos cátodo común.
int8 const tabla_7segs[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int8 digitos[3];
int8 lectura = 1;
int16 dato, ancho_pulso = 573, pulsos = 368; // valores por defecto.
float voltaje;
int8 flancos;
int8 flag_flanco;
int16 periodo1,periodo2,periodo3;
int16 tiempo_alto,tiempo_bajo,tiempo_total;
float us_alto,us_bajo,us_total, duty;
#define pin_uni PIN_B5
#define pin_dec PIN_B6
#define pin_cen PIN_B7
#define pin_pd PIN_C7 // Para en punto decimal.
#define led_voltaje PIN_B1
#define led_ancho_p PIN_B2
#define led_pulsos PIN_B3
#INT_EXT
void sdi_externa_rb0 (void)
{
flancos++; // Incrementar la variable "flancos"
if(!flag_flanco) // Si el flanco del pulso es bajo...
{
if(flancos == 1) // Si el conteo de flancos es 1...
{
set_timer1(0); // Limpiar el Timer 1
periodo1 = get_timer1(); // "periodo1" tendrá el tiempo del pulso en alto.
}
if(flancos == 3) // Si el conteo de flancos es 3...
periodo3 = get_timer1(); // "periodo3" tendrá el tiempo del pulso en alto.
EXT_INT_EDGE(H_TO_L); // Establecer la interrupción por flanco de bajada.
flag_flanco = 1; // Indicar que el próximo flanco será de bajada.
}
else // Caso contrario. (Pulso en estado alto)...
{
periodo2 = get_timer1(); // "periodo2" tendrá el valor del pulso en bajo.
EXT_INT_EDGE(L_TO_H); // Establecer la interrupción por flanco de subida.
flag_flanco = 0; // Indicar que el próximo flanco será de subida.
if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ...
flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular
}
}
if(flancos > 2)flancos = 0;
}
#int_CCP1
void CCP1_isr(void)
{
if (input(PIN_A1)==0)
{
while(!input(pin_a1)){
if(++ lectura > 3) lectura = 1;
}
}
}
// Subrutina para separar un valor en sus dígitos.
void separar_digitos (int16 valor)
{
int8 b, i;
b = sizeof(digitos) - 1;
// Limpiar variables del arreglo "digitos[]".
for(i = 0; i < b; i++) digitos = 0;
i = b;
// Separar el número.
while (valor > 0)
{
digitos[i--] = (valor % 10);
valor /= 10;
}
}
void main (void)
{
int8 unidades,decenas,centenas;
int16 valor_adc;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(50);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
// Datos iniciales.
dato = voltaje;
output_high(led_voltaje);
if(flagHayDatos==1){
if((periodo3 > periodo2) && (periodo2 > periodo1))
{
tiempo_alto = periodo2 - periodo1; // Obtener el periodo del pulso en estado alto.
tiempo_bajo = periodo3 - periodo2; // Obtener el periodo del pulso en estado bajo.
tiempo_total = tiempo_alto + tiempo_bajo; // Obtener el periodo de la frecuencia.
us_alto = ticks_us * tiempo_alto; // Obtener el periodo en microsegundos del pulso en alto.
us_bajo = ticks_us * tiempo_bajo; // Obtener el periodo en microsegundos del pulso en bajo.
us_total = ticks_us * tiempo_total; // Obtener los microsegundos en total de la frecuencia.
frecuencia = 1 / (us_total / 1000000); // Obtener la frecuencia.
// duty = ((float) tiempo_bajo / (float)(tiempo_bajo + tiempo_alto));recordar cambiar para integrado lm2907
duty = ((float) tiempo_alto / (float)(tiempo_alto + tiempo_bajo)); // este con lm358n
porcentaje = (duty * 100) ;
}
flagHayDatos=0;
}
if(porcentaje < 3)porcentaje = 0;
if(porcentaje > 95)porcentaje = 99;
flagHayDatos=0;
delay_ms(250); // Retardo para disminuir parpadeos en la pantalla. (No afecta interrupción externa.)
if(flagHayDatos==0){
frecuencia = 0;
porcentaje=0;
}
while (TRUE)
{
// Lectura del ADC y conversión a voltaje.
valor_adc = read_adc();
delay_us(50);
voltaje = (valor_adc * 300.0) / 1023;
// Selección de los datos a mostrar.
switch (lectura)
{
case 1:
dato = (int16) voltaje;
output_low(led_ancho_p);
output_low(led_pulsos);
output_high(led_voltaje);
break;
case 2:
dato = ancho_pulso;
output_low(led_voltaje);
output_low(led_pulsos);
output_high(led_ancho_p);
break;
case 3:
dato = pulsos;
output_low(voltaje);
output_low(led_ancho_p);
output_high(led_pulsos);
}
separar_digitos(dato);
// Multiplexar los dosplays de 7 segmentos.
unidades = tabla_7segs[digitos[2]];
decenas = tabla_7segs[digitos[1]];
centenas = tabla_7segs[digitos[0]];
output_low(pin_cen);
output_low(pin_dec);
output_high(pin_uni);
output_c(unidades);
delay_ms(2);
output_low(pin_uni);
output_high(pin_dec);
output_low(pin_cen);
output_c(decenas);
//output_high(pin_pd); // Punto decimal.
delay_ms(2);
output_low(pin_uni);
output_low(pin_dec);
output_high(pin_cen);
output_c(centenas);
//output_high(pin_pd); // Punto decimal.
delay_ms(2);
}
}