Desarrollando un multímetro digital con ICL7135 & PIC16F877A

Como indica el título, estoy desarrollando un mutímetro benchtop digital usando como ADC un ICL7135 por su practicidad y usando un PIC16F877A a causa de que tengo tiempo libre, me sobran los componentes y no soy millonario como para comprar un multímetro benchtop ya armado como estos:
La idea de usar el PIC es primeramente para reducir componentes y porque con un display LCD se vería super cool :V y así está quedando la etapa de conversión:
Ahora bien, para hacerlo compatible, estoy leyendo número por número del ICL7135 de esta manera:
C:
//Leer los datos del ADC externo
      if(input(D5)){ //Leer digito
         if(input(B1)){a=1;}else{a=0;} //Leer valor binario
         if(input(B2)){b=2;}else{b=0;}
         if(input(B3)){c=4;}else{c=0;}
         if(input(B4)){d=8;}else{d=0;}
         digit[4] = a+b+c+d; //Convertir binario a decimal
      }
      if(input(D4)){
         if(input(B1)){a=1;}else{a=0;}
         if(input(B2)){b=2;}else{b=0;}
         if(input(B3)){c=4;}else{c=0;}
         if(input(B4)){d=8;}else{d=0;}
         digit[3] = a+b+c+d;
      }
      if(input(D3)){
         if(input(B1)){a=1;}else{a=0;}
         if(input(B2)){b=2;}else{b=0;}
         if(input(B3)){c=4;}else{c=0;}
         if(input(B4)){d=8;}else{d=0;}
         digit[2] = a+b+c+d;
      }
      if(input(D2)){
         if(input(B1)){a=1;}else{a=0;}
         if(input(B2)){b=2;}else{b=0;}
         if(input(B3)){c=4;}else{c=0;}
         if(input(B4)){d=8;}else{d=0;}
         digit[1] = a+b+c+d;
      }
      if(input(D1)){
         if(input(B1)){a=1;}else{a=0;}
         if(input(B2)){b=2;}else{b=0;}
         if(input(B3)){c=4;}else{c=0;}
         if(input(B4)){d=8;}else{d=0;}
         digit[0] = a+b+c+d;
      }
El detalle con esto es que uno todo los dígitos en una sola cifra usando trucos en el printf
C:
dm = digit[4]*10000;
ml = digit[3]*1000;
ce = (digit[2]*1000)/10; //Esto es debido a un extraño bug en CCS que no permite multiplicar por 100
dc = digit[1]*10;
un = digit[0];
total = (dm+ml+ce+dc+un);
lcd_gotoxy(1,2);
printf(lcd_putc,"%lu     ",total);

Hasta ahí todo lindo, PERO, me gustaría saber si se les ocurre una mejor forma de leer el ADC y alguna forma de agregar los decimales necesarios para cambiar la escala, manteniendo una sola cifra, obvio podría hacer trampas con el prinft, PERO, no podría usar la cifra total para agregar operaciones matemáticas como en los benchtop, cualquier idea es bienvenida, ya que el proyecto es el de diseñar un multímetro Open Source con prestaciones de multímetro caro :V

Hola.
E
stoy configurando uno como el tuyo, pero sin la pantalla lcd. También estoy usando el compilador ccs pero nunca lo he hecho de esta manera (interconectado)
¿ Podría proporcionar el código completo por favor? estos ADC son los más adecuados para cargas analógicas y redes de CA. ?
 
Última edición por un moderador:
Si no sabes eso, dudo mucho que debas encarar este proyecto.

En realidad es que no estoy familiarizado con el compilador CCS, mi fuerte es AVR (Arduino), STM32, pi pico.
La sintaxis de CCS Compiler es diferente de MikroC y también de STM CUBE, pero no hay problema, lo averiguaré por mí mismo, ¡Sé que son pocos los que lo comparten hoy!
Tengo muchos proyectos de domótica e industrial realizados en AVR y ESP32.
Lo conozco muy bien y podría compartirlo con quien quiera.

Aquí hay un código que hice en C de CCS para UART con RF433MH.
Quien quiera puede usarlo, funciona bien.

TX
C:
//=================================================
//    TRANSMISSOR RF 433MHZ
//    PROCESSADOR: PIC12F629
//    MODO: VIRTUAL UART (UART POR SOFTWARE).
//    DATA: 26/08/21
//////////////////////////////////////////////////////////////////////////////
#include <VirtualUart_pic12f629.h>

int button1 =1;

void main()
{
   set_tris_a(0b011110);                       // A0,A5 como saida, resto como entrada
   output_low(pin_a5);                         // led fica apagado

   while(TRUE)
   {
      if(input(pin_a2) && button1 == 1){       // se pino A2 Receber = high...

      // output_high(pin_a5);                    // Pisca led pino 5 por 1s
      //delay_ms(200);
      //output_low(pin_a5);

      putc('b');                            // envia o caracter 'b'. PUTC= caracter, puts=string
      button1 = 0;                            // button volta a ser 1
      delay_ms(200);
      }

     if(!input(pin_a2) && button1 == 0){     // corrrige debounce
       button1 = 1;   
     }
   }
} // END main
==========================================
RX
C:
//    RECEPTOR RF 433MHZ
//    PROCESSADOR: PIC12F629
//    MODO: VIRTUAL UART (UART POR SOFTWARE).
//    DATA: 260/08/21      /

//////////////////////////////////////////////////////////////////////////////

#include <VirtualUart_RX_PIC12F629.h>

char dado;     //1 caracter

void main()
{
  set_tris_a (0b000010);           // A1=1 -> entrada, resto como SAIDA ->0B0000 0000
  output_a (0x00);

   while(TRUE)
   {
     if(kbhit()) {                   // verifica se ha comunicaçao
      dado = getc();               // recebe o caractet enviado pelo tx, e armazena dentro de dad
      delay_ms(20);

      if (dado == 'b'){            // se dado recebe 'b'
      delay_ms(50);
      output_toggle(pin_a2);      //inverte a condição do pino a2, high ou low
        }
    }
  }   
} // ----- END void main   RX-------
 
la hoja de datos icl7135 es más como 8051. Lo necesito para lo pic.

El ICL no tiene nada de 8051. Tan solo conectas las lineas, lees que dígito se muestra y que valor BCD posee, no hay mucho mas por ese lado.

Sé que te declaras en
void main:
set_tris_b (0xff); // todas las entradas
input_b (); // captura los binarios en el PUERTO B, pero necesito almacenarlo, no sé cómo

Si programas en tantas cosas, deberías estar familiarizado con los "Array", de todas formas ni hace falta. Con 5 variables tipo byte ya tienes de sobra (Dígito1, dígito2, etc).

Solo tienes que leer el valor BCD de cada dígito y unirlos en un valor binario (aunque eso depende de que es lo que pretendas hacer ya que dices no lo mostraras en un LCD). (No hay que olvidar la posición de la coma que separa la parte entera de la fraccionaria).

Si se quiere algo mas "exquisito" se puede armar en una variable con mantisa (Usando una variable tipo "Float").

Osea lo que hace falta es buscar como se convierte entre tipos de datos (BCD -> decimal o binario) y, principalmente, que se hará con ese dato para saber que es mas conveniente.

En resumen, hay muchas formas de hacerlo pero no todas pueden serte de utilidad, todo depende que quieras hacer con el dato.
 
El ICL no tiene nada de 8051. Tan solo conectas las lineas, lees que dígito se muestra y que valor BCD posee, no hay mucho mas por ese lado.



Si programas en tantas cosas, deberías estar familiarizado con los "Array", de todas formas ni hace falta. Con 5 variables tipo byte ya tienes de sobra (Dígito1, dígito2, etc).

Solo tienes que leer el valor BCD de cada dígito y unirlos en un valor binario (aunque eso depende de que es lo que pretendas hacer ya que dices no lo mostraras en un LCD). (No hay que olvidar la posición de la coma que separa la parte entera de la fraccionaria).

Si se quiere algo mas "exquisito" se puede armar en una variable con mantisa (Usando una variable tipo "Float").

Osea lo que hace falta es buscar como se convierte entre tipos de datos (BCD -> decimal o binario) y, principalmente, que se hará con ese dato para saber que es mas conveniente.

En resumen, hay muchas formas de hacerlo pero no todas pueden serte de utilidad, todo depende que quieras hacer con el dato.
No, está bien, cuando hablé de 8051, me refería a la línea MCU 80xx con at89s5xx.
ahora sobre matrices, la última vez que usé una fue para hacer un panel con contraseña para atmega238
Quiero codificarlo y enviarlo a través de UART. Ya lo tengo en una salida serial de entrada paralela 74165. pero lo prefiero en mcu. Pero está bien, gracias por el dato, ¡casi he terminado!

-------------------------------------------------------------

Lo tengo en modo común (analógico) seguir
No te creas. Mira el foro, está llenos de aportes de todo tipo, incluso actuales.
Que no te den todo "servido", es para insentivar a la búsqueda y estudio de las cosas. No siempre se tiene todo en bandeja...
¡si mi amigo! el foro está realmente bien intencionado y con un gran contenido, pero en una era de código abierto, debemos unirnos y ayudarnos unos a otros, ¡e incluso regalarlo! ¿porque no? (En este sentido, aplaudo con la comunidad de Arduino). Tengo 30 años en electrónica, tengo mucho que colaborar con esta y con cualquier comunidad. No soy un experto en programación, pero me va muy bien con el temido ESP32 y esas cosas. Si lo necesita, ¡estamos ahí! ¡¡abrazos!
 

Adjuntos

  • 7135.rar
    107.6 KB · Visitas: 6
Última edición:
Atrás
Arriba