Autor Tema: Voltímetro con 16F873 y multiplexado con 7-SEG  (Leído 10473 veces)

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Voltímetro con 16F873 y multiplexado con 7-SEG
« en: 05 de Diciembre de 2005, 08:51:00 »
Este es un voltímetro mas de la colección, pero este trabaja multiplexando 3 displays 7-SEG cátodo comúm y según el proteus dá una buena precisión (a 10bits). le sustituí los transistores NPN por inversores para controlar los segmentos de los displays debido a q el proteus c pone muy lento y de todas maneras los inversores cumplen la misma función. ya  sabes si lo van a implementar cambien por NPN





y el código fuente:
//*************************************************************//
//    Simple voltimetro usando el 16F873, con:
// *- CAD a 10 bits
// *- 3 displays 7-seg cátodo común
// *- el valor mostrado corresponde al valor DC en la entrada del CAD
//**************************************************************
   #include <16F873.h>
   #device ADC=10
   #use delay(clock=4000000)
   #fuses NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,NOPROTECT //0x3F71
//****************************************************************

  #use fast_io(A)
   #use fast_io(B)
   #use fast_io(C)
   #DEFINE   PASADOR   PIN_A0             // el switche
   #DEFINE   Q1   PIN_B1                   // transistor 1
   #DEFINE   Q2   PIN_B2                   // transistor 2
   #DEFINE   Q3   PIN_B3                   // transistor 3
   #DEFINE   punto   PIN_C7                   // punto decimal
   #BYTE    salida=7
   long  value;
   float voltaje;
   int   a;
//****************************************************************
   struct digitos_separados {         // variables en bcd de unidad,decena,centena
      int  unidad, decena, centena;
   } digito;
//****************************************************************
   struct mis_datos {                 // variables de datos de entrada y salida
      int  dato1, dato2, resultado;
   } numeros;
//****************************************************************
   void separar_digitos(){      // separa resultado en unidad, decena y centena
     int   temp;
     digito.unidad=0;
     digito.decena=0;
     temp=numeros.resultado;
     while(temp>=10){
       temp-=10;
       digito.decena++;
     }
     digito.unidad=temp;
   }
//****************************************************************
   void mostrar(){               // multiplexa en tres display 7-seg anodo común
      int const bcd_7seg[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x73};
      int contador;
      output_low(Q1);
      output_low(Q2);
      output_low(Q3);
      output_low(punto);
    for(contador=0;contador<11;contador++){
         salida=bcd_7seg[digito.unidad];           // muestra unidad
         output_high(Q1);
         delay_ms(5);
         output_low(Q1);
         delay_cycles(4);
         salida=bcd_7seg[digito.decena];           // muestra decena
         output_high(Q2);
         delay_ms(5);
         output_low(Q2);
         delay_cycles(4);
         salida=bcd_7seg[digito.centena];           // muestra centena
         output_high(Q3);
         output_high(punto);
         delay_ms(5);
         output_low(Q3);
         output_low(punto);
         delay_cycles(4);
      }
    }
//****************************************************************
// RUTINA PRINCIPAL
// c puede hacer mediante poleo ó por interrupciones
//****************************************************************
#int_ad
CAD(){
   value = Read_ADC();
   delay_us(30);
}
//***************************************//
void main(){
   set_tris_a(0x1);             // ra0=entradas, los demas=salida
   set_tris_b(0x0);             // puertob=entrada
   set_tris_c(0x0);             // puertoc=salida

   setup_adc_ports( ALL_ANALOG );
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);

   enable_interrupts(GLOBAL);
   enable_interrupts(int_ad);

d: value = Read_ADC();
   delay_us(30);
   voltaje=0.00488758*(float)value;
   a=(int)voltaje;

   digito.centena=a;

   voltaje=voltaje-(float)a;
   numeros.resultado=(int)(100.0*voltaje);

   separar_digitos();
   mostrar();
   goto  d;
}
//****************************************

lo puedes modificar, usando interrupciones ó por "poleo". como qieras

aquí está el link para q bajes todo y lo montes en el proteus


ACTUALIZADO:

Esta simulación se encuentra también en:

http://www.unpocodelectronica.netau.net/voltimetro-con-16f873-y-multiplexado-con-7-seg

Salu2
« Última modificación: 10 de Enero de 2010, 20:00:52 por PalitroqueZ, Razón: actualizar link de la simulación »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #1 en: 05 de Diciembre de 2005, 09:20:00 »
El foro no admite ficheros adjuntos por falta de espacio, pero si es una foto, puedes subirla fácilmente a http://www.imageshack.us/  por ejemplo, y adjuntar el link.

Por cierto, tu otro post lo he borrado por razones evidentes.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
RE: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #2 en: 06 de Diciembre de 2005, 09:35:00 »
Ahora si pude meter la imagen, gracias nocturno66. me imaginaba algo con el otro post. ¿estaba como muy directo, verdad?. bueno pero yo podría colocar un link desde sharefile y no creo q sería tan malo. De todas maneras estamos en navidad y hay q dar regalos. ja ja jaMuchas risasMuchas risasNavidadNavidad

"Hay q atakar a las adversidades de la misma forma en q las adversidades nos ataka"
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #3 en: 06 de Diciembre de 2005, 11:15:00 »
Muy bueno el aporte... además que estaba buscando cómo hacer uno de estos. De todas formas. Hasta qué rangos pueden llegar a medir?

1 saludo

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #4 en: 06 de Diciembre de 2005, 11:33:00 »
Escrito originalmente por elmasvital
Muy bueno el aporte... además que estaba buscando cómo hacer uno de estos. De todas formas. Hasta qué rangos pueden llegar a medir?

1 saludo


Con divisores de tensión y algun selector, "todo" lo que quieras no?
Si juegas contra el mejor, pierdes como los demás.

Desconectado hectdiaf

  • PIC10
  • *
  • Mensajes: 18
Re: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #5 en: 17 de Febrero de 2009, 18:42:11 »
hola PalitroqueZ  me encontrba recogiendo ideas de varios proyectos y encontre el tuyo me llamo mucho la atencion de como logras multiplexar los datos y me interesaria que me explicaras mas detalladamente como funciona lo del  struc.

te lo agradeceria ucho PalitroqueZ 

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #6 en: 20 de Febrero de 2013, 22:13:08 »
Por lo que veo este voltimetro solo mide  hasta 5v
 
Existe la posiblidad de modificar este valor??

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #7 en: 27 de Enero de 2015, 13:43:48 »
y la imagen de proteus

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Voltímetro con 16F873 y multiplexado con 7-SEG
« Respuesta #9 en: 28 de Enero de 2015, 14:45:44 »
te consulto ya que no funciona que puede ser el error