Autor Tema: Vumetro Con Pic y Lcd  (Leído 6429 veces)

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

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Vumetro Con Pic y Lcd
« en: 25 de Abril de 2011, 17:21:50 »
bueno luego de terminar mi proyecto de matriz de led... me decidi a hacer un circuito pequeño, que no requiera tantos componentes, y me decidi por hacer un vumetro, e visto varios articulos de vumetros en su gran mayoria hechos con integrados ya muy conocidos por los electronicos y no tanto... tambien he visto hecho programas pero en basic, y hasta ahora no di con alguno ( o por lo menos no lo lei) de que lo halla hecho en c... entonces dije manos a la obra y hasta ahora, no hice casi nada porque estoy muy trabado, siempre tengo la costumbre de hacer muy rustico los programas :D y no saber como simplificarlo, este es un caso...
ahora paso a comentarles mi situación, en proteus hice un circuito que tenga, el display lcd conectado al puerto D de un pic 16f877a, un potenciomentro en la entrada A1, (simulando brutamente una señal de audio), la cuestión, que pude hacer el efecto con asteriscos **, pero quise intentar hacer el efecto de barra y algo sale, pero lo veo muy grande al código del programa para dibujar las barras...
espero haber sido lo mas claro.. cualquier cosa háganme saber...

Saludos...

Posteo el codigo del programa:
Código: [Seleccionar]
#include <16f877A.h>


#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#DEVICE ADC=10
#use delay(clock=4000000)
#byte porta=5
#byte portb=6
#byte portc=7
#byte portd=8
#use standard_io(D)
#use fast_io(a)


//****************************D I B U J O  D E  B A R R A S******************************************
int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b0};

int const caracter1_direccion[8]={0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
int const caracter1_datos[8]={0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b0};

int const caracter2_direccion[8]={0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
int const caracter2_datos[8]={0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b0};

int const caracter3_direccion[8]={0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
int const caracter3_datos[8]={0b11110,0b11110,0b11110,0b11110,0b11110,0b11110,0b11110,0b0};

int const caracter4_direccion[8]={0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
int const caracter4_datos[8]={0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11110,0b0};
//****************************P I N E S  D E L   D I S P L A Y*********************************************************


#define LCD_DB4   PIN_D0
#define LCD_DB5   PIN_D1
#define LCD_DB6   PIN_D2
#define LCD_DB7   PIN_D3
#define LCD_RW    PIN_D6
#define LCD_RS    PIN_D7

#define LCD_E     PIN_D5
#define use_portd_lcd
#include "flex_lcd.c"
//*********************************************************************************************************************


#zero_ram //borra cualquier contendido en la memoria ram


//*********************************************************************************************************************
int const lenbuff=5;                  // Longitud de buffer, Ajustar


char cbuff[lenbuff]; //buffer con largo lenbuff




//------------------------------------------------------------------------------------------
char h_digit=0;
char l_digit=0;
long int l_digit_long=0;
long int h_digit_long=0;
long int diez=0;
int32 adaptar=0;
int i;
int contador;
int pico=0;
//**********************************Variables de Tension***************************************************************

long int tension_2=0;
long int car;
//**********************************S U B R U T I N A S****************************************************************

void muestra_tensiones(void);
void lee_canales_ad(void);
void hextoascii16(void);
void mensaje_inicio (void);
void muestra_grafica(void);
void muestra_grafica1(void);
void signo (void);
//*********************************************************************************************************************

void main(void)
{

disable_interrupts(global); //desabilitamos cualquier tipo de interrupcion
setup_adc_ports(ALL_ANALOG); //todos los puertos a como analogicos
setup_adc(ADC_CLOCK_INTERNAL); //seteamos q la velocidad de muestreo sea interno
delay_ms(100); //activamos las resistencias de pull-up interna del puerto b
lcd_init(); //inicializa display
delay_ms(100);
mensaje_inicio(); //muestra mensaje de inicio
signo();
delay_ms(100);

//*********************************************************************************************************************


while(true) //lazo principal programa
{



lee_canales_ad();
muestra_grafica1();
muestra_tensiones();

}


}

//******************************************************************************

void mensaje_inicio (void)
{
lcd_putc("\fTester de Fuente\n");
lcd_putc("    Korpaz =)  ");
delay_ms(2000);
lcd_putc("\f");
}

//*******************************************************************************

void lee_canales_ad()
{
Setup_adc_ports( ALL_ANALOG ); //// A0 A1 A3 Ref=Vdd
setup_adc(ADC_CLOCK_INTERNAL);

//----------------lee temperatura horno 1 y la calcula--------------------------------
set_adc_channel(1);
delay_us(30);
tension_2=read_adc();
car=tension_2;
adaptar=tension_2;
adaptar=((adaptar*488*1000)/1000000);
tension_2=adaptar;
}
//********************************************************************************************

void muestra_grafica(void)
{

if(car<=64)
{
lcd_gotoxy(1,2);
lcd_putc("*               ");
}

if(car> 64 && car <= 128)
{
lcd_gotoxy(1,2);
lcd_putc("**              ");
}

if(car>128 && car <= 192)
{
lcd_gotoxy(1,2);
lcd_putc("***             ");
}

if(car>192 && car <=256)
{
lcd_gotoxy(1,2);
lcd_putc("****            ");
}

if(car>256 && car <= 320)
{
lcd_gotoxy(1,2);
lcd_putc("*****           ");
}

if(car> 320 && car <= 384)
{
lcd_gotoxy(1,2);
lcd_putc("******          ");
}

if(car > 384 && car <= 448)
{
lcd_gotoxy(1,2);
lcd_putc("*******         ");
}

if(car > 448 && car <= 512)
{
lcd_gotoxy(1,2);
lcd_putc("********        ");
}

if(car > 512 && car <= 576)
{
lcd_gotoxy(1,2);
lcd_putc("*********       ");
}

if(car > 576 && car <= 640)
{
lcd_gotoxy(1,2);
lcd_putc("**********      ");
}

if(car > 640 && car <= 704)
{
lcd_gotoxy(1,2);
lcd_putc("***********     ");
}

if(car > 704 && car <= 768)
{
lcd_gotoxy(1,2);
lcd_putc("************    ");
}

if(car > 768 && car <= 832)
{
lcd_gotoxy(1,2);
lcd_putc("*************   ");
}

if(car > 832 && car <= 896)
{
lcd_gotoxy(1,2);
lcd_putc("**************  ");
}

if(car > 896 && car <= 960)
{
lcd_gotoxy(1,2);
lcd_putc("*************** ");
}

if(car > 960 && car <= 1023)
{
lcd_gotoxy(1,2);
lcd_putc("****************");
}

}

//********************************************************************************************
void muestra_tensiones(void)
{
lcd_gotoxy(1,1);
l_digit_long=tension_2;
hextoascii16();
lcd_putc(cbuff[2]),lcd_putc("."),lcd_putc(cbuff[3]), lcd_putc(cbuff[4]),lcd_putc("  V"),lcd_putc(" (5v)");

}
//**********************************************************************************
void hextoascii16(void)
{
int i=0;
for(i = 0; i < 5; ++i)
{
cbuff[i]=0;
}

while (l_digit_long >  9)
{
i=0;
h_digit_long=l_digit_long;
diez=1;

while (h_digit_long > 9)
{
i++;
diez=diez*10;
h_digit_long=(h_digit_long/10);
}
cbuff[i]=h_digit_long; //guarda el primer valor en el buffer

l_digit_long=l_digit_long-(diez*h_digit_long);
}

cbuff[0]=l_digit_long;

for(i = 0; i < 6; ++i)
{
cbuff[i]=cbuff[i]+0x30;
}
h_digit=cbuff[4];
l_digit=cbuff[3];
cbuff[4]=cbuff[0];
cbuff[3]=cbuff[1];
cbuff[0]=h_digit;
cbuff[1]=l_digit;
}
//**********************************************************************





void signo (void)
{

for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter2_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter2_datos[contador]);        // modo dato
}
lcd_send_byte(0,0x80);

for(contador=0;contador<1;contador++){
lcd_send_byte(1,contador);
} //modo dato

for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter0_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter0_datos[contador]);        // modo dato
}
lcd_send_byte(0,0x80);

for(contador=0;contador<1;contador++){
lcd_send_byte(1,contador);
} //modo dato

for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter1_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter1_datos[contador]);        // modo dato
}
lcd_send_byte(0,0x80);

for(contador=0;contador<1;contador++){
lcd_send_byte(1,contador);
} //modo dato


for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter3_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter3_datos[contador]);        // modo dato
}
lcd_send_byte(0,0x80);

for(contador=0;contador<1;contador++){
lcd_send_byte(1,contador);
} //modo dato

for(contador=0;contador<8;contador++){
lcd_send_byte(0,caracter4_direccion[contador]);   //modo comando
lcd_send_byte(1,caracter4_datos[contador]);        // modo dato
}
lcd_send_byte(0,0x80);

for(contador=0;contador<1;contador++){
lcd_send_byte(1,contador);
} //modo dato

}

//************************************************************************************
void muestra_grafica1(void)
{

//************************************************************************************
//************************************************************************************
if(car<=13)
{
lcd_gotoxy(1,2);
lcd_putc(0);
lcd_gotoxy(2,2);
lcd_putc("              ");
}

if(car >13 && car <=24)
{
lcd_gotoxy(1,2);
lcd_putc(1);
lcd_gotoxy(2,2);
lcd_putc("              ");
}

if(car>24 && car<=36)
{
lcd_gotoxy(1,2);
lcd_putc(2);
lcd_gotoxy(2,2);
lcd_putc("              ");
}

if(car >36 && car <=48)
{
lcd_gotoxy(1,2);
lcd_putc(3);
lcd_gotoxy(2,2);
lcd_putc("              ");
}

if(car>48 && car<=60)
{
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc("              ");
}

//************************************************************************************
//************************************************************************************
if(car>60 && car<=72)
{
lcd_gotoxy(2,2);
lcd_putc(0);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc("             ");
}

if(car >72 && car <=84)
{
lcd_gotoxy(2,2);
lcd_putc(1);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc("              ");
}

if(car>84 && car<=96)
{
lcd_gotoxy(2,2);
lcd_putc(2);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc("              ");
}

if(car >96 && car <=108)
{
lcd_gotoxy(2,2);
lcd_putc(3);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc("              ");
}

if(car>108 && car<=120)
{
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc("              ");
}

//************************************************************************************
//************************************************************************************

if(car> 120 && car<=132)
{
lcd_gotoxy(3,2);
lcd_putc(0);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(4,2);
lcd_putc("            ");
}

if(car >132 && car <=144)
{
lcd_gotoxy(3,2);
lcd_putc(1);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(4,2);
lcd_putc("            ");
}

if(car>144 && car<=156)
{
lcd_gotoxy(3,2);
lcd_putc(2);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(4,2);
lcd_putc("            ");
}

if(car >156 && car <=168)
{
lcd_gotoxy(3,2);
lcd_putc(3);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(4,2);
lcd_putc("            ");
}

if(car>168 && car<=180)
{
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(4,2);
lcd_putc("            ");
}

//************************************************************************************
//************************************************************************************
if(car>180 && car<=192)
{
lcd_gotoxy(4,2);
lcd_putc(0);
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(5,2);
lcd_putc("           ");
}

if(car >192 && car <=204)
{
lcd_gotoxy(4,2);
lcd_putc(1);
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(5,2);
lcd_putc("            ");
}

if(car>204 && car<=216)
{
lcd_gotoxy(4,2);
lcd_putc(2);
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(5,2);
lcd_putc("            ");
}

if(car >216 && car <=228)
{
lcd_gotoxy(4,2);
lcd_putc(3);
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(5,2);
lcd_putc("            ");
}

if(car>228 && car<=240)
{
lcd_gotoxy(4,2);
lcd_putc(4);
lcd_gotoxy(3,2);
lcd_putc(4);
lcd_gotoxy(2,2);
lcd_putc(4);
lcd_gotoxy(1,2);
lcd_putc(4);
lcd_gotoxy(5,2);
lcd_putc("            ");
}

//************************************************************************************
//************************************************************************************
}




Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: Vumetro Con Pic y Lcd
« Respuesta #1 en: 25 de Abril de 2011, 21:23:24 »
Esta pagina:

http://www.zaxione.com/

se especializa en ese tema, brindan esquemáticos y código fuente. Puedes estudiar el código y hacer las modificaciones que te resulten adecuadas para tu uso.
Saludos!
Héctor

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: Vumetro Con Pic y Lcd
« Respuesta #2 en: 25 de Abril de 2011, 22:01:15 »
casualmente, esa pagina la vi, lei el posteo y lo relei, la verdad muy lindo lo que hizo el autor de esa pagina, pero bueno, lo hizo en lenguaje  basic, y eso es muy simple, yo al programa lo entiendo en basic porque tambien he programado en mis principios, pero yo ahora queria hacer un desarrollo propio en lenguaje c, porque hasta ahora no he visto quien halla posteado algo similiar, por lo menos yo no lo he visto.

Gracias de todas formas por poner tu opinion.


Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: Vumetro Con Pic y Lcd
« Respuesta #3 en: 26 de Abril de 2011, 13:25:25 »
ahora modifique el programa, pero no puedo continuar porque si continuo creando las barras me dice que no tengo suficiente rom :( pero me parece extraño ya que si dejo el programa escrito hasta antes que  me diga que no tengo mas rom, me dice que estoy ocupando un 40% nomas, es algun bug o yo estoy pifiando en algo?
adjunto ahora archivos con simulacion y codigo
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Vumetro Con Pic y Lcd
« Respuesta #4 en: 20 de Mayo de 2011, 11:39:36 »
korpaztk:
       Podrías intentar optimizar la función:
muestra_grafica1(void)
         Hay muchos pasos que se repiten. Para ello te recomiendo pasarle parámetros y que la función interactue de acuerdo a ellos.
          Saludos.
            Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: Vumetro Con Pic y Lcd
« Respuesta #5 en: 20 de Mayo de 2011, 12:10:49 »
también no me di cuenta de que estuve utilizando el conversor en 10 bit cuando con 8 me alcanza :P eso por un lado y por otro bueno por temas laborales no lo seguí ahora cuando me haga un buen rato lo continuo,  mientras tantos en esos ratos libres, arme este pequeño y lo monte en mi pc, pero a led =)


y aca esta montado =)


y esa manera de led me dio motivo en ya imaginarme el analizador de espectro que también ya tengo una idea bastante linda de como hacerlo, pero todo a su tiempo =).

Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Vumetro Con Pic y Lcd
« Respuesta #6 en: 20 de Mayo de 2011, 12:27:02 »
Bue - ni - si - mo!!!  :-/
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes