Autor Tema: LCD - Enviar valor desde el ADC  (Leído 7652 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: LCD - Enviar valor desde el ADC
« Respuesta #15 en: 30 de Abril de 2008, 03:04:41 »
¿y muestra todos los caracteres?

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: LCD - Enviar valor desde el ADC
« Respuesta #16 en: 30 de Abril de 2008, 12:44:57 »
enigma, no te quedará mas remedio que ver el estado de los SFR dentro del ISIS,
carga el .cof, compilas y vas paso a paso viendo las lineas en C

cargas la ventana watch windows y vas metiendo los SFR de interés, luego con breakpoints de por medio vas viendo el estado de los registros.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: LCD - Enviar valor desde el ADC
« Respuesta #17 en: 30 de Abril de 2008, 13:49:10 »
Otra posible prueba es dejar a la LCD solita con un miniprograma que escriba algo en las 4 líneas, así verás si la librería auxiliar funciona bien.

Yo lo acabo de hacer y ¡NO muestra los caracteres de principio de línea!

PD. Hecho y realizado con PROTEUS

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: LCD - Enviar valor desde el ADC
« Respuesta #18 en: 30 de Abril de 2008, 14:31:57 »
probé el archivo que subiste y enseguida me salió unos mensajes que hay que ponerle atención:


del compilador:




del simulador:




La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: LCD - Enviar valor desde el ADC
« Respuesta #19 en: 01 de Mayo de 2008, 15:29:19 »
Hola chicos gracias por su gentil colaboración.... Aquí presento el informe de errores!!! acerca del programa...

Probado en vivo y directo:

Palitroquez, tenias razón.... ya verifique ese error... pero aún así en vida real la LCD me mostraba simbolos raros, es decir, me botaba mucha basura!!!! Monte de nuevo el circuito y daba lo mismo! Llegue a pensar que era el proto board... Toavia seguía botando simbolos extraños, como cuando las lineas de datos están invertidas o algo! las verifique y estaban correctas!!! En fin, le di, y con algunas sugerencias del amigo micro_cadaver, logre mejorr el programa en Proteus! es decir, ya me mostraba todas las letras en la LCD, y el error que señalo el amigo Palitrquez no se mostraba... Pero aún así cuando probaba en vida real, seguia la LCD echando broma... Mostrando sus acostumbrados simbolos extraños!!!!

Me arme de valor y empece a medir cada patica del pic, para ver si botaba los valores de voltajes correspondientes!, estaba bien, todo estaba funcionando muy bien en el pic... Luego fui a medir cada pin de la LCD, y note en uno de ellos algo raro... Cuando movi la LCD PUF!!! :shock: Empezo a mostrar todo muy bien! mostraba el voltaje, las palabras correctas! Salte de la alegria :-/... Pero luego cuando la solte, volvio a botar basura!! Y me dije bueno por lo menos se donde está el error!!! 

Cuando movia la LCD se mpostraba todo bien, pero si la soltaba se volvia a dañar, la saque la revise, y adivinen que??? :shock:

Todo el  problema fue ocasionado porque un bendito pin de la LCD habia perdido su soldadura :5]... Por eso la LCD se volvia loca!!! este pequeño pero gran desperfecto me hizo desvelarme, y perder valiosas horas de programación y arme y desarme del circuito!!! :?

En fin, esa es la historia!!!! Ahora si podré seguir avanzando!!!! :mrgreen:

Cabe destacar que esto no lo hubiera echo sin la ayuda de todos los foristas que se interesaron en ayudarme en mi problema! a todos ustedes Gracias!!!! :mrgreen:

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: LCD - Enviar valor desde el ADC
« Respuesta #20 en: 02 de Mayo de 2008, 01:22:54 »
¿Puedes poner el programa con las correcciones para que te muestre todos los caracteres en la LCD con PROTEUS? ... me gustaría verlo.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: LCD - Enviar valor desde el ADC
« Respuesta #21 en: 02 de Mayo de 2008, 15:29:48 »
hola llanerita, asi es el camino de los picmaniacos. la fuerza es intensa en ti.

 solo te falto quemar el pic jejejej  :-)

a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: LCD - Enviar valor desde el ADC
« Respuesta #22 en: 03 de Mayo de 2008, 14:41:48 »
que chevere Enigma que lo hayas resuelto.   :-/ :-/ :-/

El otro problema con el que tenemos que lidiar: los factores físicos.

normalmente trato de que en los simuladores disminuya la cantidad de advertencias, por cierto la advertencia del compilador donde desactiva la interrupción es digna de hacerle un estudio (y siempre rezo para que no me salga en mis programas  :shock:)



La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: LCD - Enviar valor desde el ADC
« Respuesta #23 en: 03 de Mayo de 2008, 18:43:25 »
Hola Pocher, si claro, lo colocaré... Le hice algunas modificaciones!!!!! También posee una modificación realizada por e amigo micro_cadaver :lol:

Palitroquez, porque rezas para ue no salga esa advertencia?? hablame más de eso si puedes por favor!!!!!

#include <18f4550.h>
#DEVICE ADC=8
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT,MCLR
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use delay(clock=4000000)
#include <LCD16.c>                                      // Libreria que controla los comandos de la LCD
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)          // Habilita las funciones RS232, velocidad a 9600 baudios
#byte RCON=0xFD0                                        // Registro que controla el reset por POR (POWER ON RESET)
#bit POR=RCON.1                                         // Bit de la bandera del Power On Reset
#bit IPEN=RCON.7                                        // Habilita la prioridad de las interrupciones
#byte PIR2=0xFA1                                        // Registro de control de las interrupciones
#byte INTCON1=0xFF2                                     // Registro de control de las interrupciones
#bit RBIF=INTCON1.0                                     // Bit de Interrupción por cambio en el puerto B (RB4-RB7).
#byte INTCON3=0xFF2                                     // Registro de control de interrupciones
#byte PIE1=0xF9D                                        // Registro de habilitación de interrupciones perifericas
#byte PIE2=0xFA0                                        // Registro de habilitación de interrupciones perifericas

#zero_ram
//::::::::::::::::::::::::::Declaración de variables:::::::::::::::::::::::::::::::::::::
float value,dato,value_antiguo;
int caracter;

//::::::::::::::::::::::::::Declaración de Funciones:::::::::::::::::::::::::::::::::::::
void menu(void);                                        // Función que me muestra el menú de opciones
void ajustar_trans(void);                                   // Función que calibra al transmisor
void  enviar_rs232(void);                               // Función que envia los datos vía RS232
void  enviar_rs485(void);                               // Función que envia los datos vía RS485

//::::::::::::::::::::::Interrupción por RB0:::::::::::::::::::::::::::::::::::::::::::::::::::

#INT_EXT
EXT_isr()
{
   menu();
}

//:::::::::::::::::::::::::::Programa Principal:::::::::::::::::::::::::::::::::::::::::::
void main(void)
{
         set_tris_a(0x01);                            // Puerto A, como b'00000001
         set_tris_c(0x00);                            // Puerto C, como b'11111111
         set_tris_b (0xFF);                           // Configura puerto b como entrada
         set_tris_d(0x00);                            // Puerto A, como b'00000000
         
         output_a(0);
         output_b(0);
         output_c(0);
         output_d(0);
         
         port_b_pullups(TRUE);                        // Activo las pullups
         enable_interrupts(global);                   // Habilito todas las interrupciones
         enable_interrupts(int_ext);                  // Activa máscara INTE (Activo interrupción po RB0)
         setup_port_a(AN0_ANALOG );                   // RA0 son analógicos y los demás son digitales
         setup_adc(ADC_CLOCK_INTERNAL );              // Tomará el dato contando el tiempo con el reloj interno
         ext_int_edge (H_TO_L);                       // Flag INTF si flanco de bajada.
         IPEN=1;                                      // Deshabilito la prioridad de las interrupciones
         RBIF=0;                                      // RB4-RB7 no provocó una interrupción externa por cambio
         PIE1=0x00;                                   // Deshabilito interrupciones por otros perifericos (CCP,USART, etc)
         PIE2=0x00;                                   // Deshabilito interrupciones por otros perifericos (USB, Oscilador, colisión, memoria, etc)
         if(POR==0)                                   // Reset por POR
         {
            output_high(PIN_C1);                      // Enciendo un led de prueba
            delay_ms(1000);                           // Una demora para que se estabilicen los voltajes
            POR=1;                                    // Limpio la bandera del POR
            output_low(PIN_C1);                       // Apago un led de prueba
         }
         lcd_init();                                  // Para inicializar el LCD

//*************************************************************
//*                     CICLO PRINCIPAL                       *
//*************************************************************


   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   lcd_enviar(LCD_COMANDO, LCD_CLEAR);      // Envía comando al LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   lcd_gotoxy(1,1);                         // Posiciona el cursor
   printf(lcd_putc,"  Transmisor");         // Visualiza mensaje
   lcd_gotoxy(1,2);                         // Posiciona el cursor
   printf(lcd_putc,"  de Presion ");        // Visualiza mensaje
   lcd_gotoxy(1,3);                         // Posiciona el cursor
   printf(lcd_putc,"  Diferencial");        // Visualiza mensaje
   delay_ms(3000);                          // Visualizo la información por 3 segundos
   
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   lcd_gotoxy(1,1);                         // Posiciona el cursor
   printf(lcd_putc,"Realizado por:");       // Visualiza mensaje
   lcd_gotoxy(1,2);                         // Posiciona el cursor
   printf(lcd_putc,"Vargas Marlin");        // Visualiza mensaje
   delay_ms(50);                            // Retardo para el comando de la LCD
   delay_ms(3000);                          // Visualizo la información por 3 segundos

   lcd_enviar(LCD_COMANDO,LCD_CLEAR);           // Borro pantalla LCD
   delay_ms(5);                                 // Retardo para el comando de la LCD
   value_antiguo=0;
         while(true)
         {
            set_adc_channel(0);                          // El canal de adquisición del dato es el RA0
            delay_us(10);                                // Un retardo para capturar bien el dato
            value=read_adc();                            // Leo el dato
            dato=(value*5)/255;                          // Convierto el valor a decimal y lo guardo
           
            if(value!=value_antiguo)
            {
//               printf(lcd_putc,"\f");                       // Borro pantalla
               lcd_enviar(LCD_COMANDO,LCD_CLEAR);           // Borro pantalla LCD
               delay_ms(5);                                 // Retardo para el comando de la LCD

               lcd_gotoxy(1,1);                             // Posiciona el cursor
               printf(lcd_putc,"Volt= %2.2g",dato);         // Mando a mostrar el valor del conversor
               value_antiguo=value;
            }               

            if(input(PIN_B1)==0)                         // ¿Ajustar el transmisor?
               {
                  ajustar_trans();                       // Si, voy a la función ajustar
               }

            if(input(PIN_B2)==0)                         // ¿Enviar Via RS232?
               {
                  enviar_rs232();                        // Si, voy a la función que envia a través del RS232
               }

            if(input(PIN_B3)==0)                         // ¿Enviar via RS485?
               {
                  enviar_rs485();                        // Si,  voy a la función que envia a través del RS485
               }
           }

}
//::::::::::::::::::::::::::::Función que permite ver el memú de opciones::::::::::::::::::::::::::::::
     void menu(void)
      {
         lcd_enviar(LCD_COMANDO, LCD_CLEAR);               // Envía comando al LCD
         delay_ms(5);                                      // Retardo para el comando de la LCD
         lcd_gotoxy(1,1);                                  // Posiciona el cursor
         printf(lcd_putc,"   Menu");                       // Visualiza mensaje
         lcd_gotoxy(1,2);                                  // Posiciona el cursor
         printf(lcd_putc,"(A)Ajuste");                     // Visualiza mensaje
         lcd_gotoxy(1,3);                                  // Posiciona el cursor
         printf(lcd_putc,"(B)Envio RS232");                // Visualiza mensaje
         lcd_gotoxy(1,4);                                  // Posiciona el cursor
         printf(lcd_putc,"(C)Envio RS485");                // Visualiza mensaje
         delay_ms(50);                                     // Retardo para el comando de la LCD
         delay_ms(4000);                                   // Visualizo la información por 4 segundos
      }

//::::::::::::::::::::::::::::Función que permite calibrar el transmisor::::::::::::::::::::::::::::::
void ajustar_trans(void)
{
   output_high(PIN_C2);
   delay_ms(1000);
   output_low (PIN_C2);
}

//::::::::::::::::::::::::::::Función que permite enviar los datos via RS232::::::::::::::::::::::::::::::
void  enviar_rs232(void)
{
   output_high(PIN_C4);
   delay_ms(1000);
   output_low (PIN_C4);
}

//::::::::::::::::::::::::::::Función que permite enviar los datos via RS485::::::::::::::::::::::::::::::
void  enviar_rs485(void)
{
   output_high(PIN_C5);
   delay_ms(1000);
   output_low (PIN_C5);
}



Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: LCD - Enviar valor desde el ADC
« Respuesta #24 en: 04 de Mayo de 2008, 03:50:39 »
Gracias Enigma.

Ahora ya tengo claro porqué PROTEUS no mostraba los caracteres de principio de línea. Era por la frecuencia de oscilación, si le pones 20Mhz, como inicialmente tenías, no va bien ... lo máximo que admite funcionando bien y sacando todos los caracteres es 15Mhz.

Por cierto ¿has provado físicamente con 20Mhz?

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: LCD - Enviar valor desde el ADC
« Respuesta #25 en: 05 de Mayo de 2008, 16:18:37 »
 :shock: Rayos no sabia ese pequeño detallito de Proteus y la frecuencia!!! Gracias por el dato! :mrgreen:

Bueno sabes que si probe con 20 Mhz, y la verdad no me mostraba el voltaje, supongo que ha de ser por el protoboard ya que con frecuencias altas pues a veces da errores!!!! Pero he sabido de gente y he visto circuitos que han funcionado bien con 20 Mhz... Lastima que el mio no fue uno de ellos!!! Además era la primera vez que trabajaba con 20 Mhz, siempre lo había hecho con 4Mz, y por lo visto con 4Mhz me seguiré quedando!!!! :g)

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: LCD - Enviar valor desde el ADC
« Respuesta #26 en: 05 de Mayo de 2008, 18:37:45 »
... porque rezas para ue no salga esa advertencia?? hablame más de eso si puedes por favor ...

claro si el compilador te desactiva una interrupción que habias planeado, ¿como haces? hay algo malo por allí.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: LCD - Enviar valor desde el ADC
« Respuesta #27 en: 05 de Mayo de 2008, 21:34:27 »
Nunca habias mencionado que usabas 20 Mhz, la libreria usa los delay_cycles() que realmente consumen ciclos de reloj, eso hace que entre 4 Mhz y 20 Mhz se ejecuten 5 veces mas rapido.

Prueba cambiar cada uno de los:
 delay_cycles(1);

por:

delay_us(1);

que tardan 1 microsegundo exacto sin importar el reloj que uses...
Eso es lo que tarda una instruccion delay_cycles() con el cristal a 4 Mhz... :mrgreen: :mrgreen: :mrgreen: :lol: :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: LCD - Enviar valor desde el ADC
« Respuesta #28 en: 06 de Mayo de 2008, 00:05:18 »
Umm... Tampoco sabia eso!!! gracias por ese consejo!! voy a implementarlo para el proximo circuito!!!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!