Autor Tema: mostras varios valores con 7 segmentos  (Leído 795 veces)

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

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
mostras varios valores con 7 segmentos
« en: 28 de Octubre de 2020, 19:36:58 »
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);
     

   }
}

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:mostras varios valores con 7 segmentos
« Respuesta #1 en: 29 de Octubre de 2020, 07:13:46 »
Voy a cambiar int ext y probar con la int ccp1

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:mostras varios valores con 7 segmentos
« Respuesta #2 en: 29 de Octubre de 2020, 14:28:00 »
Podrías explicar que hace/debería hacer el código.


 

anything