[Aporte] VUMETRO GIGANTE cuatro efectos

hola a todos
gracias por la respuesta anterior
estuve viendo el pic 16f877a para hacer lo que propongo. El circuito seria similar a el de la foto?
ese pic se pudiese utilizar para mi proyecto?
podría remplazar el micrófono por una entrada de audio (jack) ?


Hola amigo.. la respuesta es si a todas tus preguntas
El pic 16f877a tiene suficientes pines para conectar tus leds
Si puedes poner en tu diseño un conector jack para microfono
El circuito es el mismo sea el pic que sea
 
hola, el código que pasaron anteriormente no funciona para el pic que yo estoy por utilizar y no me compila (cambie la librería pero el lenguaje que utiliza especifico del pic no me deja compilar, y tampoco puedo encontrar la librería correcta ).
me podrían ayudar para mi proyecto de 20 canales?
ya que quise probar en proteus y no lo pude hacer :cry: :cry:
o me pueden mandar el programa?
 
Hola amigo.. la respuesta es si a todas tus preguntas
El pic 16f877a tiene suficientes pines para conectar tus leds
Si puedes poner en tu diseño un conector jack para microfono
El circuito es el mismo sea el pic que sea

bueno. algo sencillo para ti ya lo tienes. pero no estaba mal, replantearse el proyecto y acer algo chulo.. por lo menos la parte de motor donde se pudieran sacar una bariables que aumentasen a relacion de la señal en frecuencias, leer los dos canales L y R.. que seria lo que tendria que encargarse el motor del programa por interrucciones.

el muestreo puedes usar un integrado multiblesor de estos de pantallas display, como el TM1628 por ser muy comun en DVD o chismes de estos comerciales con pulsadores y display o mejor en velocidad de refresco seria max7219-max7221 que seria el mas comun por velocidad y facil aceso en arduino. asi con el pic lo usamos perfet.. con estos integrados y mirando como aislar con octoacopladores (ya sea para disparar un triac o disparar un mosfet) tendriamos un total de 64 salidas o lo que serian 8 modulos de 8 salidas cada uno.. unos a mosfet otros triac para 220V...


ahora que lo mas importante es.
la señal de audio hay que incorporarsela bien al pic, octaba por un amplificador operacional a la entrada del pic A/D. la señal deberia estar bien calibrada en continua que tenga Vcc/2 sin señal..

ahora como podriamos estar captando en barias bariables la cantidad de señal en frecuencias diversas.. no solo la amplitud de la señal

creo que seria lo importante de este post.. despues si problemas segundarios el como encender diversas luces.. y sigo octando por matricial led o serial paralelo 74ls595 o similar..

pero intentar preparar solo una parte de programa para las lecturas de la señal de audio..

como se podria empezar a replantear???
 
Hola amigos. ¿Qué tal?
Tengo un problema con mi PIC, ya que al compilar con CCS Compiler, me deriva a un error el cual no comprendo bien.

Según leí, es por desbordamiento de la pila, pero sé que el error se encuentra por falta de ROM.
¿Cómo lo soluciono?
Me dijeron que con #separate, pero soy nuevo en el tema de programación y no sé utilizarlo correctamente.

Saludos cordiales.
PHP:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=20M, RESTART_WDT)
#define LCD_RS_PIN               PIN_E0
#define LCD_RW_PIN               PIN_E1
#define LCD_ENABLE_PIN           PIN_E2
#define LCD_DATA4                PIN_D2
#define LCD_DATA5                PIN_D3
#define LCD_DATA6                PIN_D4
#define LCD_DATA7                PIN_D5
#include <lcd.c>
void main(){
lcd_init();
int i;
int andata1;
int andata2;
int tiempo=250;
int8 tiempo2= 5;
int8 dato=0;
setup_adc_ports(NO_ANALOGS);
set_tris_a(0b00111111);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
set_tris_e(0);
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
output_b(0);
output_c(0);
output_d(0);

{
while(true)
{
if (input(pin_A2)==0 && input(pin_A5)==0 && input(pin_A4)==0){
{
{
while(dato<1)
{
if (input(pin_A2)==0 && input(pin_A5)==0 && input(pin_A4)==0){

lcd_gotoxy(1,1);
  printf(LCD_PUTC, "\fCARGANDO ARCHIVO");


for (i=1;i<=16;++i)
{
  lcd_gotoxy(i,2);
    printf(LCD_PUTC, "*");
  delay_ms( 5 );
}
}

dato=+1;
printf(LCD_PUTC, "\f");
}
}
printf(LCD_PUTC, "\f");
if (input(pin_A2)==0 && input(pin_A5)==0 && input(pin_A4)==0){

{
lcd_gotoxy(1,1);
printf(lcd_putc,"SECCION 0");
lcd_gotoxy(1,2);
printf(lcd_putc,"MOVER PERILLA ");
delay_ms(tiempo2);
}
}


printf(LCD_PUTC, "\f");
if (input(pin_A2)==1 && input(pin_A5)==0 && input(pin_A4)==0){

{
lcd_gotoxy(1,1);
printf(lcd_putc,"SECCION 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"VUMETRO 1 ");
delay_ms(tiempo2);
}
}
{
if (input(pin_A2)==1 && input(pin_A5)==0 && input(pin_A4)==0){
set_adc_channel(0);

if(andata1<=45)                 {output_c(0b00000000);}
if(andata1>45 && andata1<=50)   {output_c(0b00000001);}
if(andata1>50 && andata1<=55)   {output_c(0b00000011);}
if(andata1>55 && andata1<=60)   {output_c(0b00000111);}
if(andata1>60 && andata1<=65)   {output_c(0b00001111);}
if(andata1>65 && andata1<=70)   {output_c(0b00011111);}
if(andata1>70 && andata1<=75)   {output_c(0b00111111);}
if(andata1>75 && andata1<=80)   {output_c(0b01111111);}
if(andata1>80 && andata1<=85)   {output_c(0b11111111);}
if(andata1>85 && andata1<=90)   {output_d(0b00000010);}
if(andata1>90)                  {output_d(0b00000011);}
set_adc_channel(3);
andata1=read_adc();
output_c(0);
output_d(0);
}
if (input(pin_A2)==1 && input(pin_A5)==0 && input(pin_A4)==0){
if(andata2<=45)                {output_b(0b00000000);}
if(andata2>45 && andata1<=50)  {output_b(0b10000000);}
if(andata2>50 && andata1<=55)  {output_b(0b11000000);}
if(andata2>55 && andata1<=60)  {output_b(0b11100000);}
if(andata2>60 && andata1<=65)  {output_b(0b11110000);}
if(andata2>65 && andata1<=70)  {output_b(0b11111000);}
if(andata2>70 && andata1<=75)  {output_b(0b11111100);}
if(andata2>75 && andata1<=80)  {output_b(0b11111110);}
if(andata2>75 && andata1<=85)  {output_b(0b11111111);}
if(andata2>85 && andata1<=90)  {output_d(0b00000000);}
if(andata2>90)                 {output_d(0b00000000);} //prenden leds del puerto D porterior al puerto C
set_adc_channel(1);
andata2=read_adc();
output_b(0);
output_d(0);
}
}
printf(LCD_PUTC, "\f");
if (input(pin_A2)==0 && input(pin_A5)==1 && input(pin_A4)==0){
{
lcd_gotoxy(1,1);
printf(lcd_putc,"SECCION 2");
lcd_gotoxy(1,2);
printf(lcd_putc,"VUMETRO 2 ");
delay_ms(tiempo2);
}
}
{
if (input(pin_A5)==1 && input(pin_A4)==0 && input(pin_A2)==0 ){
set_adc_channel(0);
if(andata1<=45)                 {output_c(0b00000000);}
if(andata1>45 && andata1<=50)   {output_c(0b10000000);}
if(andata1>50 && andata1<=55)   {output_c(0b11000000);}
if(andata1>55 && andata1<=60)   {output_c(0b11100000);}
if(andata1>60 && andata1<=65)   {output_c(0b11110000);}
if(andata1>65 && andata1<=70)   {output_c(0b11111000);}
if(andata1>70 && andata1<=75)   {output_c(0b11111100);}
if(andata1>75 && andata1<=80)   {output_c(0b11111110);}
if(andata1>80 && andata1<=85)   {output_c(0b11111111);}
if(andata1>85 && andata1<=90)   {output_d(0b00000001);}
if(andata1>90)                  {output_d(0b00000011);}  
set_adc_channel(3);
andata1=read_adc();
output_c(0);
output_d(0);
}
if (input(pin_A5)==1 && input(pin_A4)==0 && input(pin_A2)==0 ){
if(andata2<=45)                 {output_b(0b00000000);}
if(andata2>45 && andata1<=50)   {output_b(0b00000001);}
if(andata2>50 && andata1<=55)   {output_b(0b00000011);}
if(andata2>55 && andata1<=60)   {output_b(0b00000111);}
if(andata2>60 && andata1<=65)   {output_b(0b00001111);}
if(andata2>65 && andata1<=70)   {output_b(0b00011111);}
if(andata2>70 && andata1<=75)   {output_b(0b00111111);}
if(andata2>75 && andata1<=80)   {output_b(0b01111111);}
if(andata2>80 && andata1<=85)   {output_b(0b11111111);}
if(andata2>85 && andata1<=90)   {output_d(0b01000000);}
if(andata2>90)                  {output_d(0b11000000);}//prenden leds del puerto D porterior al puerto C
set_adc_channel(1);
andata2=read_adc();
output_b(0);
output_d(0);
}
}
printf(LCD_PUTC, "\f");
if (input(pin_A2)==0 && input(pin_A5)==0 && input(pin_A4)==1){
{
lcd_gotoxy(1,1);
printf(lcd_putc,"SECCION 3");
lcd_gotoxy(1,2);
printf(lcd_putc,"JUEGO DE LUCES ");
delay_ms(tiempo2);
}
}
{
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000001)&& output_c(0b00000001);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
 output_b(0b00000010)&& output_c(0b00000010);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000100)&& output_c(0b00000100);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){  
  output_b(0b00001000)&& output_c(0b00001000);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){  
  output_b(0b00010000)&& output_c(0b00010000);
  delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00100000)&& output_c(0b00100000);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
 output_b(0b01000000)&& output_c(0b01000000);
  delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){ 
  output_b(0b10000000)&& output_c(0b10000000);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){ 
  output_b(0b00000000)&& output_c(0b00000000);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){  
  output_b(0b10000000)&& output_c(0b10000000);//vuelta
  delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b01000000)&& output_c(0b01000000);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){ 
  output_b(0b00100000)&& output_c(0b00100000);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){ 
  output_b(0b00010000)&& output_c(0b00010000);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){ 
  output_b(0b00001000)&& output_c(0b00001000);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){  
  output_b(0b00000100)&& output_c(0b00000100);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000010)&& output_c(0b00000010);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000001)&& output_c(0b00000001);
 delay_ms(tiempo);}
if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000001)&& output_c(0b00000001);
 delay_ms(tiempo);}
 if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000000)&& output_c(0b00000000);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b11111111)&& output_c(0b11111111);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000000)&& output_c(0b00000000);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b11111111)&& output_c(0b11111111);
  delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000000)&& output_c(0b00000000);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b11111111)&& output_c(0b11111111);
 delay_ms(tiempo);}
  if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b00000000)&& output_c(0b00000000);
  delay_ms(tiempo);}
    if (input(pin_A4)==1 && input(pin_A5)==0 && input(pin_A2)==0){
  output_b(0b11111111)&& output_c(0b11111111);
 delay_ms(tiempo);}
output_b(0);
output_c(0);
}
}
}
}
}
}
 
Revisa bien tu programa y verás que tiene corchetes mal colocados por todos lados, pero ese no es el problema principal.
El problema de falta de ROM cuando aún deberías tener, se debe a que estás incluyendo demasiadas rutinas dentro del bucle main.
Si bien se puede solucionar con #separate, es mejor que pongas algunas rutinas fuera.

[Editado tiempo después para publicar el código corregido...]

PHP:
#include <16F877A.h>
#use     delay(crystal = 20 MHz, RESTART_WDT)
#define LCD_RS_PIN               PIN_E0
#define LCD_RW_PIN               PIN_E1
#define LCD_ENABLE_PIN           PIN_E2
#define LCD_DATA4                PIN_D2
#define LCD_DATA5                PIN_D3
#define LCD_DATA6                PIN_D4
#define LCD_DATA7                PIN_D5
#include <lcd.c>

int andata1, andata2;

void rutina1 (void)
{
   set_adc_channel(0);

   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b00000001);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b00000011);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b00000111);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b00001111);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b00011111);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b00111111);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b01111111);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000010);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}

void rutina2 (void)
{
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b10000000);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b11000000);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b11100000);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b11110000);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b11111000);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b11111100);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b11111110);
   if(andata2 > 75 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b00000000);
   if(andata2 > 90)  output_d(0b00000000);   //prenden leds del puerto D porterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}

void rutina3 (void)
{
   set_adc_channel(0);
   
   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b10000000);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b11000000);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b11100000);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b11110000);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b11111000);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b11111100);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b11111110);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000001);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}

void rutina4 (void)
{
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b00000001);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b00000011);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b00000111);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b00001111);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b00011111);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b00111111);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b01111111);
   if(andata2 > 80 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b01000000);
   if(andata2 > 90)  output_d(0b11000000);   //prenden leds del puerto D posterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}


void main (void)
{
   lcd_init();
   
   int i;
   int tiempo = 250;
   int8 tiempo2 = 5;
   int8 dato = 0;

   set_tris_a(0b00111111);
   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0);

   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   
   output_b(0);
   output_c(0);
   output_d(0);

   while(true)
   {
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         while(dato<1)
         {
            if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
            {
               lcd_gotoxy(1,1);
               printf(LCD_PUTC, "\fCARGANDO ARCHIVO");

               for (i=1;i<=16;++i)
               {
                  lcd_gotoxy(i,2);
                  printf(LCD_PUTC, "*");
                  delay_ms( 5 );
               }
            }
            dato ++;
            printf(LCD_PUTC, "\f");
         }
      }
      
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 0");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MOVER PERILLA");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"SECCION 1");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 1");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina1();
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina2();

      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina3();
      
      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina4();
      
      if (!input(pin_A2) && input(pin_A5) && !input(pin_A4))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 2");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 2 ");
         delay_ms(tiempo2);
      }
      
      if (!input(pin_A2) && !input(pin_A5) && input(pin_A4))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 3");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"JUEGO DE LUCES");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001) && output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000);
         output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         output_c(0b10000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000) && output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         ;output_c(0b10000000);  //vuelta
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000) && output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4)==1 && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      output_b(0);    // Esto debe afectar los cambios del puerto B, pero así viene en el programa.
      output_c(0);    // Esto debe afectar los cambios del puerto C, pero así viene en el programa.
   }
}
 
Código:
 if(andata1 <= 45) output_c(0b00000000);
   if(andata1  <= 50)   output_c(0b00000001);
   if(andata1  <= 55)   output_c(0b00000011);
   if(andata1  <= 60)   output_c(0b00000111);
   if(andata1  <= 65)   output_c(0b00001111);
   if(andata1  <= 70)   output_c(0b00011111);
   if(andata1  <= 75)   output_c(0b00111111);
   if(andata1  <= 80)   output_c(0b01111111);
   if(andata1  <= 85)   output_c(0b11111111);
   if(andata1  <= 90)   output_d(0b00000010);
   if(andata1 > 90)  output_d(0b00000011);

Tambien puedes ahorrar haciendo esto en vez de como lo tienes puesto.
 
Miglo, si por ej. el dato es menor a 45, entra en todos.

Dark, en vez de estar preguntando en cada if el rango (eso serían dos saltos), conviene usar el else y los límites, ej:

if(var<=45)
... accion 1
else if(var<=50)
... accion 2
else if...

Y así con todos los límites.
 
Muchas gracias D@rkbytes, por el apoyo.

Hola.
Para cambiar el vumetro a modo estereo. ¿Podría hacer este conexionado?
Uno de esos, por salida (AN1 y AN3)
El potenciómetro delimitará la cantidad niveles. (No lo voy a hacer cambiar de efectos)

PHP:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#use     delay(crystal = 20 MHz, RESTART_WDT)
#define LCD_RS_PIN               PIN_E0
#define LCD_RW_PIN               PIN_E1
#define LCD_ENABLE_PIN           PIN_E2
#define LCD_DATA4                PIN_D2
#define LCD_DATA5                PIN_D3
#define LCD_DATA6                PIN_D4
#define LCD_DATA7                PIN_D5
#include <lcd.c>

int andata1, andata2, tiempo = 250;

void rutina1 (void)
{
   set_adc_channel(0);

   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b00000001);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b00000011);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b00000111);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b00001111);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b00011111);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b00111111);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b01111111);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000010);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}

void rutina2 (void)
{
   set_adc_channel(0);
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b10000000);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b11000000);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b11100000);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b11110000);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b11111000);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b11111100);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b11111110);
   if(andata2 > 75 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b01000000);
   if(andata2 > 90)  output_d(0b11000000);   //prenden leds del puerto D porterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}

void rutina3 (void)
{
   set_adc_channel(0);
   
   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b10000000);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b11000000);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b11100000);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b11110000);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b11111000);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b11111100);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b11111110);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000001);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}

void rutina4 (void)
{  set_adc_channel(0);
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b00000001);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b00000011);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b00000111);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b00001111);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b00011111);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b00111111);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b01111111);
   if(andata2 > 80 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b01000000);
   if(andata2 > 90)  output_d(0b11000000);   //prenden leds del puerto D posterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}

void rutina5 (void)
{
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001) && output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000);
         output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         output_c(0b10000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000) && output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         ;output_c(0b10000000);  //vuelta
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000) && output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4)==1 && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      
}

void main (void)
{
   lcd_init();
   
   int i;
   
   int8 tiempo2 = 5;
   int8 dato = 0;

   set_tris_a(0b00111111);
   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0);

   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   
   output_b(0);
   output_c(0);
   output_d(0);
   
 for(;;){ 
 if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4)) 
 
   while(true)
   {
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         while(dato<1)
         {
            if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
            {
               lcd_gotoxy(1,1);
               printf(LCD_PUTC, "\fCARGANDO ARCHIVO");

               for (i=1;i<=16;++i)
               {
                  lcd_gotoxy(i,2);
                  printf(LCD_PUTC, "*");
                  delay_ms( 5 );
               }
            }
            dato ++;
            printf(LCD_PUTC, "\f");
         }
      }
     
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"SECCION 0");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MOVER PERILLA");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"SECCION 1");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 1");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina1();
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina2();

      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina3();
      
      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina4();
         
      if (!input(pin_A2) && !input(pin_A5) && input(pin_A4))
         rutina5();
      
      if (!input(pin_A2) && input(pin_A5) && !input(pin_A4))
      {  
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 2");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 2 ");
         delay_ms(tiempo2);
      }
      
      if (!input(pin_A2) && !input(pin_A5) && input(pin_A4))
      {  
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 3");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"JUEGO DE LUCES");
         delay_ms(tiempo2);
      }
      
      

   }
}  
}
 

Adjuntos

  • ejemplo.png
    ejemplo.png
    10.7 KB · Visitas: 24
Última edición por un moderador:
Muchas gracias D@rkbytes, por el apoyo.

Hola.
Para cambiar el vumetro a modo estereo. ¿Podría hacer este conexionado?
Uno de esos, por salida (AN1 y AN3)
El potenciómetro delimitará la cantidad niveles. (No lo voy a hacer cambiar de efectos)

Hola perfectgaxx si no piensas cambiar de efectos mejor retira ese potencio-metro; Para delimitar la cantidad de niveles el cambio se debería hacer en el código.


saludos!
 
Última edición:
Hola perfectgaxx si no piensas cambiar de efectos mejor retira ese potencio-metro; Para delimitar la cantidad de niveles el cambio se debería hacer en el código.

Hola dinoelectro, que clases de cambios debería hacer en mi código?
Mi objetivo era poner un potenciometro, para los niveles, ya que si yo pondría la música mas fuerte no prendan todas las tiras, y lograr un efecto óptico favorable. Donde se note la diferencia de picos de la canción. Y ademas, pensé poner estéreo para captar los volumen izquierdo y derecho de una canción.

gracias por la respuesta, saludos de antemano!
 
Hola dinoelectro, que clases de cambios debería hacer en mi código?
Mi objetivo era poner un potenciometro, para los niveles, ya que si yo pondría la música mas fuerte no prendan todas las tiras, y lograr un efecto óptico favorable. Donde se note la diferencia de picos de la canción. Y ademas, pensé poner estéreo para captar los volumen izquierdo y derecho de una canción.

gracias por la respuesta, saludos de antemano!

Hola perfectgaxx, si deseas captar el sonido ambiente; una buena opción es utilizar este sensor de sonido prefabricado, fíjate que ya viene con potenciometro para regular el nivel máximo de respuesta.

sensor-sonido-ky-038.jpg




como podria conectar directo la entrada de audio del movil al pic, que circuito podria usar?

si deseas recibir la señal de audio directamente de tu equipo de sonido o móvil puedes seguir utilizando el sensor de sonido con transistor 2n3904.
 

Adjuntos

  • audioo.png
    audioo.png
    10.2 KB · Visitas: 28
Última edición:
si deseas recibir la señal de audio directamente de tu equipo de sonido o móvil puedes seguir utilizando el sensor de sonido con transistor 2n3904.

Hola dino gracias por la respuesta. Se podría remplazar la resistencia de 100k por un potenciometro, y de esa manera regular la ganancia?
 
Hola dino gracias por la respuesta. Se podría remplazar la resistencia de 100k por un potenciometro, y de esa manera regular la ganancia?


El circuito anterior lamentablemente tiene muy baja ganancia si le colocas el potenciometro vas a degradar aun mas la señal. Mejor deberías probar con el amplificador de audio LM386;

amplificador_lm386.png


NOTA: no lo he probado pero; en teoría, debería funcionar :unsure::unsure::unsure:
 
Última edición:
Hola dinoelectro,podrias decirme los componentes usados para este controlador,y el codigo,y circuito para hacerlo impreso,me gusta tu trabajo,gracias a ti gente como yo vamos aprendiendo un poco cada dia.
Tambien queria saber si este otro circuito me valdria,y tendria efectos parecidos al tuyo.
Una cuestion mas,funciona tu vumetro con leds rgb?,si no es asi,se podria adaptar para que funcionasen?

gracias.
 

Adjuntos

  • Archivo 11-3-17 16 01 08.png
    Archivo 11-3-17 16 01 08.png
    56.4 KB · Visitas: 17
  • Archivo 11-3-17 16 00 52.png
    Archivo 11-3-17 16 00 52.png
    32.3 KB · Visitas: 18
Última edición:
Hola dino gracias por la respuesta. Se podría remplazar la resistencia de 100k por un potenciometro, y de esa manera regular la ganancia?


Hola perfectgaxx estuve realizando pruebas y este circuito funciona perfecto para lo que deseas hacer..



Hola dinoelectro,podrias decirme los componentes usados para este controlador,y el codigo,y circuito para hacerlo impreso,me gusta tu trabajo,gracias a ti gente como yo vamos aprendiendo un poco cada dia.
Tambien queria saber si este otro circuito me valdria,y tendria efectos parecidos al tuyo.
Una cuestion mas,funciona tu vumetro con leds rgb?,si no es asi,se podria adaptar para que funcionasen?

gracias.

Gracias apology por tu interés, bueno los componentes estan etiquetados en el circuito, el transistor es un 2N3904, el capacitor de 0,1uf y el potenciometro es de 10K.

El código ya esta posteado en este mismo hilo;ahora mismo estoy retomando el proyecto y pronto publicare una version mejorada.

el circuito que muestras utiliza un circuito integrado LM3915 que no necesita ser programado, trabaja con dos efectos MODO PUNTO y MODO BARRA.

Saludos Cordiales
 

Adjuntos

  • Captura.PNG
    Captura.PNG
    10.5 KB · Visitas: 7
Última edición:
VUMETRO DE 15 NIVELES CON MICROCONTROLADOR PIC16F887

La construccion del vumetro puede resumirse en tres etapas:


Etapa 1 Captación de la señal de audio

El circuito siguiente permite amplificar las señal de AUDIO proveniente de un micrófono ELECTRET o un equipo de sonido:

captura.png


El potenciómetro RV1 permite calibrar la sensibilidad del vúmetro; si se desea amplificar la señal de un micrófono ELECTRET, conviene colocarlo a una resistencia 0.

Etapa 2 Procesamiento de la señal de audio

Según mediciones realizadas en el laboratorio se determinó que la señal de audio amplificada por el transistor 2N3904 cambia en un rango comprendido entre 0.5 y 2,1V; Sobre esta lógica tendremos;

  • 0.5V, o menos ningún LED enciende
  • 0.6V, enciende 1 LED
  • 0.7V, encienden 2 LEDs
  • 0.8V, encienden 3 LEDs
  • 0.9V, encienden 4 LEDs
  • .
  • .etc.
  • .
  • 2.1V encienden 15 LEDs


¡ADVERTENCIA! el rango comprendido entre 0.5V y 2.1V NO es válido para todos los micrófonos ELECTRET, por lo que se hace necesario que usted realice sus propias mediciones y encuentre la calibración apropiada para su micrófono; Es buena idea enviar los datos del canal analógico a través del puerto serial para observar el rango de mediciones en las que se mueve su señal amplificada


Cada nivel del vúmetro es representado por LEDs conectados a los pines del puerto B y D. (en total tenemos 15 niveles)

captura2.png


Etapa 3. Conmutación de transistores darlinghton

Cuando deseamos hacer un vúmetro gigante,el voltaje y la corriente manejados por el microcontrolador son insuficientes para controlar un gran número de LEDS; por lo que se hace necesario recurrir a transistores DARLINGTHON;que permitan conmutar la tensión entre 0/12V a partir de un PIN del microcontrolador.

captura3.png


De esta manera, deberíamos repetir 15 veces.
 
Última edición:
Atrás
Arriba