Vumetro a Leds con PIC 16FXXX

gregorysd dijo:
pero no entiendo que es lo que mide la musica el pic?
r y L se enchufa al audio y.y no entiendo me lo podrian decir mas detalladamente
gracias

R y L son canales de audio. El PIC lo que hace es reflejar la amplitud del audio en dos tiras de LEDs, siendo una tira para cada canal. Como es una señal análoga, se utiliza por ejemplo el conversor ADC del PIC para saber el nivel de la señal.
No he leido todo el post pero debes de tener cuidado con los voltajes y supongo que la señal de audio debe de ser como máximo de un preamplificador. Los voltajes (amplitud) deben de estar por debajo del humbral que soporta el PIC (5V), para medir esto necesitas de un osciloscópio o solo prueba con voltaje directo.
 
Hola amigos, yo tengo un programa en el PIC16F877A que hace las funciones de un Vumetro, aqui esta, y si tienen alguna duda, comenten; esta el archivo en .asm, .hex y ademas el circuito en proteus, saludos
 

Adjuntos

  • VUmetro.rar
    26.2 KB · Visitas: 348
Hola estoy haciendo este vumetro, no se si me lo puedan pasar con el 16f877 pero por cada salida quiero poner una tira de leds se qUE se ocupa solo un transistor para la etapa de potencia no se si me puedan ayudar
 
Última edición por un moderador:
Si te refieres al programa del post #22, lo puedes grabar y usar sin problemas en un PIC16F877.
La programación para ese PIC es la misma, solo cambia el tamaño de las memorias RAM y EEPROM, que en el 16F877 son mayores.
Aparte, son pin por pin compatibles.
 
Me gustaría poder ayudar con el HEX, sino que también tienen el mismo aspecto ... espero ayudar con el esquema eléctrico y tal vez juntos podemos escribir la hex.
 

Adjuntos

  • s9940.gif
    s9940.gif
    57.3 KB · Visitas: 164
Última edición:
Nuk;
Buenos días;
El vúmetro que publicaste de 20 led es estupendo, tanto es así que me gustaría montarlo, pero sólo dispongo del código HEX para 16 leds posteado por nodes o el de 40 leds por el autor checo. ¿Tendrías la amabilidad de pasarme el HEX y si dispones de la PCB para los 20 leds?
Agradecido.
 
yo por mi parte e realizado con la ayuda de ese code uno con el PIC16F877A y que inicialmente su creador lo puso por...

Hola NUK! como estas?! revivo este post con una consulta, yo también ando con ganas de armar un vumetro como el tuyo, ya tengo mi grabadora de pics y mi PIC16F877A que lo compre pensando en tu diseño! Serias tan amable de mostrarnos tu placa desde abajo? o sea para poder copiar el circuito, o si tenes la imagen que usaste para la impresión genial! Me ayudarías muchísimo con eso! Entre a la pagina q recomendaste pero usan otro pic y menos leds. Gracias de antemano!
 
con lo que respecta a la simulación no se como lo habrán hecho
así que por las dudas subo mi simulación donde pueden ver como funciona
el VU con PIC16F88 (también dejo el proyect del MPLAB en asm)

PSD: el vídeo anterior, el PIC16F877A solo muestra 16 Leds y actualmente lo acabo de
terminar ya subo el vídeo con la escala completa de 20 Leds. :D
saludos

Hola nuk, por qué no me funciona la simulación? :unsure::unsure:

Saludos...
 
estimado amigo puedes explicar un poco de el por que pasa eso en proteus
No, solo estoy leyendo el informe que dio Proteus

error-simulacion-jpg.124065
 
buenas .estoy queriendo armar este vumetro con componentes que reciclo. y queria saber si puedo utilizar pic 16f84. ya que es lo unico que encontre entre mis coleccion de integrados pic.
gracias
 
estoy queriendo armar este vumetro con componentes que reciclo. y queria saber si puedo utilizar pic 16f84.

¿ Se puede ? Si, pero no usando los programas y esquemas que se muestran. Deberás crear todo desde cero incluido un DAC externo que puede ser uno diseñado para eso o armado, por ejemplo, usando un comparador.

Lo mejor es conseguir un PIC con ADC interno e intentar adaptar el programa.
 
Hola otra vez por aquí, desde el año pasado he estado migrando viejos proyectos al nuevo MPLAB X con PIC-AS, Les comparto un vúmetro con el 16F628A usando el mismo algoritmo de la web que usa el 16F88 del post, en su momento comente la posibilidad de migrar el código a cualquier PIC con ADC pero también es posible si tiene comparadores el problema es que existirá una diferencia en el tiempo respecto a la captura de la señal A respecto a la señal B, no es muy notoria pero es funcional, eso también implica diferencias de +-1 nivel ente canales a frecuencia altas, pero al menos se ve bien. tuve que corregir problemas de visualización y tiempo a diferencia del original, mejore la retención de barra y punto al tener solo 4 bits de resolución la escala es muy lineal. la selección de modos la moví a un pulsador para mejor comodidad. El vúmetro es mas parecido al LM3914 quiero pensar, se que el 628A es un PIC muy viejo pero como mencione se puede usar cualquier PIC un 12FXXX con un 74H595 posiblemente lo haría mas barato o esos IC que controlar los display de DVD pero es necesario algo de conocimiento de programación para poder adaptarlo, llegue a migrarlo a C en su momento pero solo quedo en una ejemplificación y por azares de la vida no llegue a compartirlo por falta de tiempo y nunca llegue a responder las dudas de algunos aquí.

00025155.jpg

Saludos.
 

Adjuntos

  • VU12LD628AV2SCH.pdf
    1.6 MB · Visitas: 4
  • VU12LD628AV2PWB.pdf
    125.3 KB · Visitas: 4
  • 0000PT.gif
    0000PT.gif
    153.7 KB · Visitas: 7
  • 0000BR.gif
    0000BR.gif
    185.3 KB · Visitas: 5
  • 0000PK.gif
    0000PK.gif
    168.7 KB · Visitas: 4
  • 0000BK.gif
    0000BK.gif
    176.2 KB · Visitas: 5
  • 00025156.jpg
    00025156.jpg
    127.1 KB · Visitas: 7
Hola otra vez por aquí, desde el año pasado he estado migrando viejos proyectos al nuevo MPLAB X con PIC-AS, Les comparto un vúmetro con el 16F628A usando el mismo algoritmo de la web que usa el 16F88 del post, en su momento comente la posibilidad de migrar el código a cualquier PIC con ADC pero también es posible si tiene comparadores el problema es que existirá una diferencia en el tiempo respecto a la captura de la señal A respecto a la señal B, no es muy notoria pero es funcional, eso también implica diferencias de +-1 nivel ente canales a frecuencia altas, pero al menos se ve bien. tuve que corregir problemas de visualización y tiempo a diferencia del original, mejore la retención de barra y punto al tener solo 4 bits de resolución la escala es muy lineal. la selección de modos la moví a un pulsador para mejor comodidad. El vúmetro es mas parecido al LM3914 quiero pensar, se que el 628A es un PIC muy viejo pero como mencione se puede usar cualquier PIC un 12FXXX con un 74H595 posiblemente lo haría mas barato o esos IC que controlar los display de DVD pero es necesario algo de conocimiento de programación para poder adaptarlo, llegue a migrarlo a C en su momento pero solo quedo en una ejemplificación y por azares de la vida no llegue a compartirlo por falta de tiempo y nunca llegue a responder las dudas de algunos aquí.

Ver el archivo adjunto 339188

Saludos.
... Linda selfie :rolleyes: ...
:no: quizas sumaria un poco mas si les compartis a los que no entienden, a los que son iniciados (etc), el hex que pegaste como imagen en el pdf :unsure:
No inventamos la rueda, asi que me tome un rato en escribir algo que se amolda practicamente al tema y hardware mencionado:
En C seria algo así:

CSS:
#include <16F628A.h>

// Configuración de fusibles para cristal externo de 4MHz u oscilador interno
#fuses XT, NOWDT, NOPROTECT, NOLVP, PUT, MCLR
#use delay(clock=4000000)

// ---- ASIGNACIÓN DE PINES (12 LEDs) ----
#define LED1  PIN_B0
#define LED2  PIN_B1
#define LED3  PIN_B2
#define LED4  PIN_B3
#define LED5  PIN_B4
#define LED6  PIN_B5
#define LED7  PIN_B6
#define LED7_BIT 6
#define LED8  PIN_B7

#define LED9  PIN_A0
#define LED10 PIN_A1
#define LED11 PIN_A2
#define LED12 PIN_A3

// ---- CONTROL Y ENTRADA ----
#define BOTON_MODO PIN_A5   // Pin RA5 configurado como entrada para el pulsador
#define ANALOG_IN  PIN_A4   // Pin RA4 (Entrada del Comparador 1)

// Variables globales para la animación del vúmetro
int1 modo_barra = 1;       // 1 = Modo Barra (LM3914), 0 = Modo Punto
int8 pico_actual = 0;      // Guarda el LED más alto alcanzado
int16 retencion_timer = 0; // Contador de tiempo para sostener el pico

// Función para actualizar los 12 LEDs según el nivel y el modo seleccionado
void actualizar_vumetro(int8 nivel) {
   // Actualizar el pico más alto (Peak Hold)
   if (nivel >= pico_actual && nivel > 0) {
      pico_actual = nivel;
      retencion_timer = 30; 
   } else {
      if (retencion_timer > 0) {
         retencion_timer--;
      } else {
         if (pico_actual > 0) pico_actual--; 
      }
   }

   // Renderizado físico en los pines
   if (modo_barra) {
      // --- MODO BARRA ---
      output_bit(LED1,  (nivel >= 1));
      output_bit(LED2,  (nivel >= 2));
      output_bit(LED3,  (nivel >= 3));
      output_bit(LED4,  (nivel >= 4));
      output_bit(LED5,  (nivel >= 5));
      output_bit(LED6,  (nivel >= 6));
      output_bit(LED7,  (nivel >= 7));
      output_bit(LED8,  (nivel >= 8));
      output_bit(LED9,  (nivel >= 9));
      output_bit(LED10, (nivel >= 10));
      output_bit(LED11, (nivel >= 11));
      output_bit(LED12, (nivel >= 12));
   } else {
      // --- MODO PUNTO --- (Enciende el nivel actual o el punto de pico retenido)
      output_bit(LED1,  (nivel == 1  || pico_actual == 1));
      output_bit(LED2,  (nivel == 2  || pico_actual == 2));
      output_bit(LED3,  (nivel == 3  || pico_actual == 3));
      output_bit(LED4,  (nivel == 4  || pico_actual == 4));
      output_bit(LED5,  (nivel == 5  || pico_actual == 5));
      output_bit(LED6,  (nivel == 6  || pico_actual == 6));
      output_bit(LED7,  (nivel == 7  || pico_actual == 7));
      output_bit(LED8,  (nivel == 8  || pico_actual == 8));
      output_bit(LED9,  (nivel == 9  || pico_actual == 9));
      output_bit(LED10, (nivel == 10 || pico_actual == 10));
      output_bit(LED11, (nivel == 11 || pico_actual == 11));
      output_bit(LED12, (nivel == 12 || pico_actual == 12));
   }
}

void main() {
   int8 i = 0;
   int8 lectura_vref = 0;

   // TRIS: Puertos B como salidas completas. Puerto A salidas excepto RA4 y RA5.
   set_tris_b(0x00);
   set_tris_a(0x30); // 00110000 b (Pines RA4 y RA5 como entradas)

   // Configuración del comparador: RA4 es comparado con la referencia interna VREF
   setup_comparators(A4_VR_A4_VR);

   while(TRUE) {
      lectura_vref = 0;

     for(i = 1; i <= 15; i++) {
         setup_vref(VREF_LOW | i); 
         delay_us(15);             
       
         if(C1OUT) {             
            lectura_vref = i;
         }
      }

    int8 nivel_leds = (lectura_vref * 12) / 15;
    actualizar_vumetro(nivel_leds);

   if(!input(BOTON_MODO)) {   
         delay_ms(20);            
         if(!input(BOTON_MODO)) {
            modo_barra = !modo_barra;
            while(!input(BOTON_MODO)); 
         }
      }

      delay_ms(10); 
   }
}

El pulsador multifunción en el pin RA5 cambia en tiempo real el valor de modo_barra.

y en PicBasicPRO sería algo asi:

Código:
' =========================================================================
' VÚMETRO DE 12 LEDS CON PIC16F628A EN PICBASIC PRO (PBP)
' Simulación de ADC mediante barrido VREF y retención de picos (Peak Hold)
' =========================================================================

#CONFIG
 __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLR_ON & _LVP_OFF & _CP_OFF
#ENDCONFIG

Define OSC 4            ' Cristal externo de 4MHz

' ---- DEFINICIÓN DE PINES ----
' LEDs del 1 al 8 en todo el Puerto B
' LEDs del 9 al 12 en Puerto A (RA0, RA1, RA2, RA3)
' Entrada de señal analógica en RA4
' Pulsador de modo en RA5 (Con resistencia Pull-Up externa a 5V)

BotonModo   VAR PORTA.5

' ---- VARIABLES ----
i           VAR BYTE    ' Contador para el bucle VREF
LecturaVref VAR BYTE    ' Guarda el nivel de voltaje detectado (0 a 15)
NivelLeds   VAR BYTE    ' Nivel mapeado a los 12 LEDs (0 a 12)
ModoBarra   VAR BIT     ' 1 = Modo Barra, 0 = Modo Punto
PicoActual  VAR BYTE    ' Almacena el LED del pico más alto
RetencionTmr VAR BYTE   ' Contador de tiempo para sostener el pico

' ---- INICIALIZACIÓN ----
TRISB = %00000000       ' Todo el Puerto B como salidas (LEDs 1-8)
TRISA = %00110000       ' RA4 (Analógico) y RA5 (Botón) como entradas, el resto salidas

' CMCON = %00000100 -> Configura RA4 como entrada del Comparador 1
' (Compara contra el voltaje interno VREF)
CMCON = %00000100      

ModoBarra = 1           ' Iniciar en modo barra por defecto
PicoActual = 0
RetencionTmr = 0

Inicio:
    LecturaVref = 0

    For i = 1 TO 15
        ' VRCON: Habilita VREF (%1), Rango bajo (%1), Salida OFF (%0), Valor i (%xxxx)
        VRCON = %11000000 | i  
        PauseUs 15              ' Tiempo para que el voltaje interno se estabilice
       
        ' CMCON.7 es el bit C1OUT (Resultado del comparador)
        If CMCON.7 = 1 Then     ' Si la señal en RA4 supera al VREF actual
            LecturaVref = i
        EndIf
    Next i

   NivelLeds = (LecturaVref * 12) / 15

   If NivelLeds >= PicoActual AND NivelLeds > 0 Then
        PicoActual = NivelLeds
        RetencionTmr = 30       ' Sostiene el pico por aproximadamente 300ms
    Else
        If RetencionTmr > 0 Then
            RetencionTmr = RetencionTmr - 1
        Else
            If PicoActual > 0 Then PicoActual = PicoActual - 1
        EndIf
    EndIf
    Gosub ActualizarLeds

    If BotonModo = 0 Then
        Pause 20                ' Pausa anti-rebote mecánico
        If BotonModo = 0 Then
            ModoBarra = ~ModoBarra  ' Invierte el estado del modo (Barra / Punto)
            While BotonModo = 0 : Wend ' Espera a que se suelte el pulsador
        EndIf
    EndIf

    Pause 10                    ' Frecuencia de refresco general
Goto Inicio

ActualizarLeds:
    If ModoBarra = 1 Then
        ' --- LÓGICA MODO BARRA ---
        ' Puerto B (LEDs 1 al 8)
        If NivelLeds >= 1 Then PORTB.0 = 1 Else PORTB.0 = 0
        If NivelLeds >= 2 Then PORTB.1 = 1 Else PORTB.1 = 0
        If NivelLeds >= 3 Then PORTB.2 = 1 Else PORTB.2 = 0
        If NivelLeds >= 4 Then PORTB.3 = 1 Else PORTB.3 = 0
        If NivelLeds >= 5 Then PORTB.4 = 1 Else PORTB.4 = 0
        If NivelLeds >= 6 Then PORTB.5 = 1 Else PORTB.5 = 0
        If NivelLeds >= 7 Then PORTB.6 = 1 Else PORTB.6 = 0
        If NivelLeds >= 8 Then PORTB.7 = 1 Else PORTB.7 = 0
        ' Puerto A (LEDs 9 al 12)
        If NivelLeds >= 9 Then PORTA.0 = 1 Else PORTA.0 = 0
        If NivelLeds >= 10 Then PORTA.1 = 1 Else PORTA.1 = 0
        If NivelLeds >= 11 Then PORTA.2 = 1 Else PORTA.2 = 0
        If NivelLeds >= 12 Then PORTA.3 = 1 Else PORTA.3 = 0
    Else
        ' --- LÓGICA MODO PUNTO (Enciende nivel actual O el pico retenido) ---
        ' Puerto B (LEDs 1 al 8)
        If (NivelLeds = 1) OR (PicoActual = 1) Then PORTB.0 = 1 Else PORTB.0 = 0
        If (NivelLeds = 2) OR (PicoActual = 2) Then PORTB.1 = 1 Else PORTB.1 = 0
        If (NivelLeds = 3) OR (PicoActual = 3) Then PORTB.2 = 1 Else PORTB.2 = 0
        If (NivelLeds = 4) OR (PicoActual = 4) Then PORTB.3 = 1 Else PORTB.3 = 0
        If (NivelLeds = 5) OR (PicoActual = 5) Then PORTB.4 = 1 Else PORTB.4 = 0
        If (NivelLeds = 6) OR (PicoActual = 6) Then PORTB.5 = 1 Else PORTB.5 = 0
        If (NivelLeds = 7) OR (PicoActual = 7) Then PORTB.6 = 1 Else PORTB.6 = 0
        If (NivelLeds = 8) OR (PicoActual = 8) Then PORTB.7 = 1 Else PORTB.7 = 0
        ' Puerto A (LEDs 9 al 12)
        If (NivelLeds = 9) OR (PicoActual = 9) Then PORTA.0 = 1 Else PORTA.0 = 0
        If (NivelLeds = 10) OR (PicoActual = 10) Then PORTA.1 = 1 Else PORTA.1 = 0
        If (NivelLeds = 11) OR (PicoActual = 11) Then PORTA.2 = 1 Else PORTA.2 = 0
        If (NivelLeds = 12) OR (PicoActual = 12) Then PORTA.3 = 1 Else PORTA.3 = 0
    EndIf
Return

End

En ASM no me animo :facepalm: ...ya tengo 47 casi entrando a los 48 :silbando: ... tardaría mucho :ROFLMAO:
 
Atrás
Arriba