Autor Tema: Problema con lcd en 16f690  (Leído 6109 veces)

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

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Problema con lcd en 16f690
« en: 17 de Noviembre de 2010, 17:46:01 »
Resulta que decidi hacer un voltimetro para mi fuente partida, y lo que hice fue comenzar a programar un pic 16f877a u andaba re bien. Ahora vi que tenia un pic 16f690 y vi que tiene entradas analogicas por lo que seria un desperdicio utilizar el 877 para esto si tengo el 690, por lo que modifique el programa pero a la hora de compilar me aparecen errores de la libreria LCD.C, a esta ya la utilice es la que viene en el ccs y funciona de maravillas con el 16f877a. Es la primera vez que cambio los pines del LCD que viene por defecto en la libreria ya que el 16f690 no trae portE.
Les dejo el codigo.
Espero que me ayuden, estoy comenzando con ccs y la verdad que estoy aprendiendo con los ejemplos de este foro y me sirvieron un monton.
Desde ya gracias.
Les dejo el codigo

Código: [Seleccionar]
#include <16f690.h>
#device ADC=8  
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT  
#use delay(clock=4000000)

#define LCD_ENABLE_PIN  PIN_C0                                    ////
#define LCD_RS_PIN      PIN_C1                                    ////
#define LCD_RW_PIN      PIN_C2                                    ////
#define LCD_DATA0       PIN_C4                                    ////
#define LCD_DATA1       PIN_C5                                    ////
#define LCD_DATA2       PIN_C6                                    ////
#define LCD_DATA3       PIN_C7

#include "lcd.c"

int valor=0x00;
int valor1=0x00;

const float vccmax1=15.22;
const float vccmax=15.11;

void cortocircuito()
{
do{
lcd_init();
printf(lcd_putc," Corto Circuito
presionar reset");
}while(true);
}


 void toma_adc(void){

 // Lectura del canal 0
set_adc_channel(0);  
delay_ms(1);  
valor=read_adc();  
delay_ms(1); //para que se estabilice
 // Lectura del canal 1
set_adc_channel(1);  
delay_ms(1);  
valor1=read_adc();  
delay_ms(1); //para que se estabilice
}  
 
void main() {  
float tension=0;
float tension1=0;
setup_adc(ADC_CLOCK_INTERNAL); //configura el converso  
setup_adc_ports(all_analog); //entrada 0 como analogica
do {
delay_ms(100);
toma_adc();
lcd_init();
tension=(valor*vccmax)/255;
tension1=(valor1*vccmax1)/255;
printf(lcd_putc,"Vcc+    %3.1f V
Vcc-   -%3.1f V",tension,tension1);

}while(true);  
}
 

PD: Utilizo dos entradas analogicas las RA0 y la RA1 una para la tension positiva y otra para la negativa que la invierto con un operacional antes de ingresar al adc
« Última modificación: 17 de Noviembre de 2010, 18:03:21 por martino84 »

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con lcd en 16f690
« Respuesta #1 en: 17 de Noviembre de 2010, 18:08:58 »
Que errores tienes?
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #2 en: 17 de Noviembre de 2010, 18:18:16 »
me da errores en la libreria de lcd.c

line127(5,9):undefined identifier
line127(17,23):expecting a(
line128(5,9): expecting a(
line128(18,25): expecting a(
line128(33,34): expecting a(
line128(34,38): expecting a declaration

lo raro es que el mismo programa funciona bien en el 16f877a.
Puede ser que sea que cuando pongo la instruccion

setup_adc_ports(all_analog

tambien estoy afectando los pines del lcd? o es otra cosa?

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #3 en: 17 de Noviembre de 2010, 19:29:56 »
probe tambien con la libreria flex_lcd y no me da errores pero cuando simulo en el proteus la pantalla se ilumina pero no aparece nada.
Recien estoy comenzando a programar pics, por las dudas este cometiendo un error tonto.

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con lcd en 16f690
« Respuesta #4 en: 18 de Noviembre de 2010, 09:23:57 »
Hola martino84, acabo de compilar el código fuente que adjuntas y no da ningún error, has tocado algo mas o es el mismo.

Que versión de CCS usas? ;-)

Te adjunto la compilacion para que veas.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #5 en: 18 de Noviembre de 2010, 13:21:15 »
por mas que intento compilar me sigue dando los mismos errores, capas que tengo mal la libreria lcd.c ya me fijo si la descargo y te aviso.

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con lcd en 16f690
« Respuesta #6 en: 18 de Noviembre de 2010, 15:45:15 »
Hola martino84, te preguntaba por la versión del compilador, porque si es anterior a la versión 1.104, no se pueden editar los pines de esa forma, si con una versión posterior, por eso te dice que no reconoce las definiciones, deberías actualizar la versión del compilador o de las librerías.

Prueba esta vez y me comentas.
« Última modificación: 18 de Noviembre de 2010, 15:49:53 por bmfranky »
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #7 en: 18 de Noviembre de 2010, 19:06:54 »
reinstale el ccs y ya lo compila bien, el problema ahora es que lo simulo en el proteus y solo enciende el display pero no muestra nada, si funciona si lo armo al programa para el 16f877a

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con lcd en 16f690
« Respuesta #8 en: 19 de Noviembre de 2010, 05:34:29 »
Postea la simulacion en proteus y lo provaremos.
« Última modificación: 19 de Noviembre de 2010, 10:03:33 por bmfranky »
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Problema con lcd en 16f690
« Respuesta #9 en: 19 de Noviembre de 2010, 08:58:24 »
reinstale el ccs y ya lo compila bien, el problema ahora es que lo simulo en el proteus y solo enciende el display pero no muestra nada, si funciona si lo armo al programa para el 16f877a

Hola, una vez tuve un problema similar con ese PIC el  CCS y un LCD, resulto que el CCS no configuraba correctamente un pin que por defecto funciona como entrada analogica, esto lo descubri despues de revisar el codigo en ASM que el CCS generaba, fue cuando decidi parar con el uso de este compilador, para revisar errores en ASM prefiero revisar los mios.  La solucion , configura los registros TRIS y ANSEL  de forma manual.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con lcd en 16f690
« Respuesta #10 en: 19 de Noviembre de 2010, 09:47:33 »
Hola martino84, estuve viendo tu programa y primero que todo tienes configuradas todas las entradas análogas y en algunas de ellas tienes conectado el LCD.  lcd_init(); solo es necesario ponerlo al comienzo una sola vez y también veo que estás enviando cadenas de más de 16 caracters al LCD.  Si bien es cierto que al llegar al caracter #16 el LCD hace el salto de línea automaticamente, es mejor formatear un poco el código con intrucciones como lcd_gotoxy() para evitar presentaciones erroneas. 
De a cuerdo a lo que te acabo de comentar, le hice solo algunos ajustes básicos a tu código para nos cuentes como te va:

Código: C
  1. #include <16F690.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES BROWNOUT                 //Reset when brownout detected
  8. #FUSES MCLR                     //Master Clear pin enabled
  9. #FUSES NOCPD                    //No EE protection
  10. #FUSES PUT                      //Power Up Timer
  11. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  12. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  13.  
  14. #use delay(clock=4000000)
  15.  
  16. #define LCD_ENABLE_PIN  PIN_C0                                    ////
  17. #define LCD_RS_PIN      PIN_C1                                    ////
  18. #define LCD_RW_PIN      PIN_C2                                    ////
  19. #define LCD_DATA0       PIN_C4                                    ////
  20. #define LCD_DATA1       PIN_C5                                    ////
  21. #define LCD_DATA2       PIN_C6                                    ////
  22. #define LCD_DATA3       PIN_C7
  23.  
  24. #include "lcd.c"
  25.  
  26. int valor=0x00;
  27. int valor1=0x00;
  28.  
  29. const float vccmax1=15.22;
  30. const float vccmax=15.11;
  31.  
  32. void cortocircuito()
  33. {
  34.    do
  35.    {
  36.       printf(lcd_putc," Corto Circuito
  37.      presionar reset");
  38.    }
  39.    while(true);
  40. }
  41.  
  42.  
  43. void toma_adc(void)
  44. {
  45.    // Lectura del canal 0
  46.    set_adc_channel(0);  
  47.    delay_ms(1);  
  48.    valor=read_adc();  
  49.    delay_ms(1); //para que se estabilice
  50.    // Lectura del canal 1
  51.    set_adc_channel(1);  
  52.    delay_ms(1);  
  53.    valor1=read_adc();  
  54.    delay_ms(1); //para que se estabilice
  55. }  
  56.  
  57. void main()
  58. {
  59.    float tension=0;
  60.    float tension1=0;
  61.    
  62.    setup_adc_ports(sAN0|sAN1|VSS_VDD);    // Entradas analogas AN0 y AN1
  63.    setup_adc(ADC_CLOCK_INTERNAL);         //configura el converso
  64.    setup_spi(SPI_SS_DISABLED);
  65.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  66.    setup_timer_1(T1_DISABLED);
  67.    setup_timer_2(T2_DISABLED,0,1);
  68.    setup_ccp1(CCP_OFF);
  69.    setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  70.  
  71.    lcd_init();
  72.  
  73.    do
  74.    {
  75.       delay_ms(100);
  76.       toma_adc();
  77.       tension=(valor*vccmax)/255;
  78.       tension1=(valor1*vccmax1)/255;
  79.       printf(lcd_putc,"Vcc+    %3.1f V
  80.      Vcc-   -%3.1f V",tension,tension1);
  81.    }
  82.    while(true);
  83. }

Saludos!

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #11 en: 19 de Noviembre de 2010, 13:31:44 »
Antes que nada gracias a todos los que me estan dando una mano con esto, por lo visto estoy demasiado verde en el tema ya que hay cosas que vi en el codigo anterior que no conozco asi que voy a tener que estudiar un poco mas.
El codigo compila sin errores ahora el tema es que el proteus no lo simula bien ya que no aparece el texto en el display solo se ilumina pero no muestra nada. Me aparece una advertencia que dice "Attempted to read after writing a single nibble"

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #12 en: 19 de Noviembre de 2010, 13:47:57 »
adjunto la simulacion en proteus, por las dudas es la version 7.7

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con lcd en 16f690
« Respuesta #13 en: 19 de Noviembre de 2010, 14:04:23 »
Acabo de probar la simulación en Proteus V7.6 y funciona muy bien.  Incluso aproveché para adicionarle unas instrucciones lcd_gotoxy() como te había mencionado para mejorar la presentación y ahora se ve muy bien.  Los cambios son en la parte final:

Código: C
  1. do
  2.    {
  3.       delay_ms(100);
  4.       toma_adc();
  5.       tension=(valor*vccmax)/255;
  6.       tension1=(valor1*vccmax1)/255;
  7.       lcd_gotoxy(1,1);
  8.       printf(lcd_putc,"Vcc+    %3.1f V",tension);
  9.       lcd_gotoxy(1,2);
  10.       printf(lcd_putc,"Vcc-    %3.1f V",tension1);
  11.    }
  12.    while(true);

Parece que tu problema es con el Proteus.

Saludos!

EDITO: Aunque de la anterior manera me funciona, te recomiendo cambiar también esta parte:

Código: C
  1. #define LCD_ENABLE_PIN  PIN_C0                                    ////
  2. #define LCD_RS_PIN      PIN_C1                                    ////
  3. #define LCD_RW_PIN      PIN_C2                                    ////
  4. #define LCD_DATA4       PIN_C4                                    ////
  5. #define LCD_DATA5       PIN_C5                                    ////
  6. #define LCD_DATA6       PIN_C6                                    ////
  7. #define LCD_DATA7       PIN_C7

Saludos!
« Última modificación: 19 de Noviembre de 2010, 14:07:53 por bmb »

Desconectado martino84

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con lcd en 16f690
« Respuesta #14 en: 27 de Marzo de 2011, 16:39:22 »
muchisimas gracias bmb, se soluciono mi problema. Como decias estaban habilitadas las entradas analogicas que utilizaba para el lcd