TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zarain en 25 de Mayo de 2006, 14:16:22

Título: Problema con lcd y pic16f873
Publicado por: zarain en 25 de Mayo de 2006, 14:16:22
Mi problema es el siguiente: en su dia realice una aplicación con un pic16f84a y una lcd 2x16 utilizando la libreria lcd2.c y funcionaba correctamente, cuando cambie al 16f873 manteniendo los mismos pines de control y datos la sorpresa es que no aparecia nada por la lcd solamente la primera fila totalmente iluminada. Si alguien tiene alguna sugerencia se lo agradeceria

Saludos
Título: Re: Problema con lcd y pic16f873
Publicado por: vszener en 25 de Mayo de 2006, 14:18:47
Yo te recomendaria que verificases bien el conexionado de la lcd y si puede ser postea el codigo


Suerte!!! :wink:
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 25 de Mayo de 2006, 15:07:08
Hola Zarain!!

Me alegro de leer tu post para comprobar que no soy la única que tiene ese problema... estoy en las mismas que tú, hice un programa para el 16f84 con la librería lcd2.c que funcionaba perfectamente con la lcd de hitachi lm016 (2x16) pero al aumentar el programa y quedarme corta de rom pasé a un 873.

Al hacer la simulación en proteus, conectando los pines igual que para el 84 funciona perfectamente, sin ningún tipo de problema pero a la hora de montar el hardware y comprobarlo no funciona. Únicamente se enciende la primera fila con cuadraditos negros...

Según mi profesor puede ser problema de las librerías, que tengan cambios de direcciones o algo así, pero he probado con otras librerías que me ha pasado y tampoco iba así que no hay nada claro. A ver si tenemos suerte y alguien nos puede decir qué ocurre. Y si consigo llegar a una respuesta y descubro qué pasa lo postearé, vale??

Mucha suerte!!!!

Por cierto vszener, el código dle programa que quiero meter en el 873 es muy largo así que yo te pongo uno que con el 84 iba muy bien y con el 873 tampoco funciona y que es lo más simple del mundo:

#include <16f873.h>
#use delay (clock = 4000000)
#include <lcd2.c>

main ()
{
lcd_init();
while (1)
{
lcd_putc ("\f Hola");
delay_ms (1000);
lcd_putc ("\f Adios");
delay_ms (1000);
}
}
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 25 de Mayo de 2006, 15:39:47
Estoy aquí de nuevo...

He encontrado otro mensaje posteado hace más de dos años sobre el mismo tema. El link es este... http://www.todopic.com.ar/foros/index.php?topic=10279.0

Tampoco dice gran cosa, solo lo que mi profesor nos había comentado que podían ser los fallos: 1, que hay que configurar el puerto A como digital y 2, que las posiciones de memoria reservadas ( o algo así) en el 84 empiezan en 0 y en el 873 en 20...
Título: Re: Problema con lcd y pic16f873
Publicado por: jfh900 en 25 de Mayo de 2006, 16:09:18
En que puertos está conectado el LCD en el 16F873?.

Saludos.
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 25 de Mayo de 2006, 16:22:03
En mi caso (bueno, y supongo que en el de zarain puesto que esta utilizando la lcd2.c también) estoy utilizando el puerto B para enviar los datos a la LCD y las líneas 0,1 y 2 del puerto A para el control.

Adjunto la librería lcd2.c que uso, por si sirve de algo o alguien puede ayudarme a modificarla  adecuadamente.
Título: Re: Problema con lcd y pic16f873
Publicado por: maunix en 25 de Mayo de 2006, 20:09:07
En mi caso (bueno, y supongo que en el de zarain puesto que esta utilizando la lcd2.c también) estoy utilizando el puerto B para enviar los datos a la LCD y las líneas 0,1 y 2 del puerto A para el control.

Adjunto la librería lcd2.c que uso, por si sirve de algo o alguien puede ayudarme a modificarla  adecuadamente.

He visto el código y te digo lo que veo como 'para revisar'

1) Utiliza el puerto A el cual al encender el pic se inicializa como entradas analógicas.  Esto no presentará problemas para usarlo como 'salida' (al momento de escribir un dato) pero sí al momento de usarlo como entrada.  (aunque esta función por ahora no la estas usando).

2) La funcion lcd_putc está declarada de la siguiente forma

Código: C
  1. void lcd_putc( char c) {
  2.    switch (c) {
  3.      case '\f'   : lcd_enviar(LCD_COMANDO,0x01);
  4.                    delay_ms(2);
  5.                    break;
  6.      case '\n'   : lcd_gotoxy(1,2);               break;
  7.      case '\b'   : lcd_enviar(LCD_COMANDO,0x10);  break;
  8.      default     : lcd_enviar(LCD_DATO,c);        break;
  9.    }
  10. }

Es decir que está esperando un 'char', un simple byte y no un string como le estas enviando en

Código: C
  1. lcd_putc ("\f Hola");

Prueba simplemente hacer

Código: C
  1. lcd_putc ("a");


También dale más tiempo antes del lcd_init , unos 200mseg antes de ejecutar el lcd_init para garantizar que el display se haya iniciado correctamente.

Saludos
Título: Re: Problema con lcd y pic16f873
Publicado por: Chaly29 en 25 de Mayo de 2006, 20:23:48
Hola maunix, no conosco muy bien el C, pero no creo que el problema sea ese, a mi me a pasado lo mismo pero en .asm y el problema era la configuracion del puerto A, por lo tanto a estos colega le recomendaria que confuguren bien el puerto A (ya sea en la libreria o el inicion del programa) o que cambien los pines usados en el puerto a a otro puerto, como el puerto C.

Espero puedan solucionar su problema, un saludo.

Atte. CARLOS.

Título: Re: Problema con lcd y pic16f873
Publicado por: jfh900 en 25 de Mayo de 2006, 20:51:06
De todas formas la forma correcta de utlizar lcd_putc es:

Código: C
  1. printf(lcd_putc,"\f Hola");

Ya que lcd_putc es admite como argumento un char.

Un saludo.
Título: Re: Problema con lcd y pic16f873
Publicado por: maunix en 25 de Mayo de 2006, 21:16:39
Hola maunix, no conosco muy bien el C, pero no creo que el problema sea ese, a mi me a pasado lo mismo pero en .asm y el problema era la configuracion del puerto A, por lo tanto a estos colega le recomendaria que confuguren bien el puerto A (ya sea en la libreria o el inicion del programa) o que cambien los pines usados en el puerto a a otro puerto, como el puerto C.


Por lo que leí del código, utiliza los pines A para lectura (cuando los usa en la funcion de leer un dato de la memoria del display) .  Pero usar un pin como A/D como salida no representa inconveniente.  Si uno lo pone en 1, se pondrá en 1. Si lo pone en 0, se pondrá en 0.

La función está mal empleada y la forma correcta de mandar un string es la que puso jfh900

De todas formas, me quedan mas dudas al respecto:

Vanesa nos puedes contar como conectaste el display al PIC? que señal del display va a que pin del pic?
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 26 de Mayo de 2006, 03:41:59
a ver, organizacion...

el problema no está en el programa, ya que lcd_putc se puede usar con strings  directamente igual que lo he usado yo, al menos con el 16f84 funciona sin ningún problema.

Después de buscar información he llegado a la conclusión de que, como ya habéis dicho vosotros y como puse en un post anterior, el problema está con las señales analógicas y con las posiciones de memoria reservadas. La cuestión es que no sé cómo se modificaría la librería para que funcionase correctamente.

El pic está conectado de la siguiente manera a la LCD:

D0-D7  -->   B0-B7
E -->
RS -->    A0
RW -->   A2
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 26 de Mayo de 2006, 03:56:50
vaya con el foro, que no me deja modificar el mensaje....

Vuelvo a copiar la conexion de patillaje de forma correcta:

D0-D7 -->  B0-B7
E --> A2
RS --> A0
RW --> A1
Título: Re: Problema con lcd y pic16f873
Publicado por: Chaly29 en 26 de Mayo de 2006, 04:02:02
Hola Vanesa, es lo que yo estaba diciendo, pro si modificas la libreria ya no te servira para el PIC16F84A por ejemplo, yo lo que haria seria configurar de la menera adecuada el puerto al iniciar el programa.

Y si deseas modificar la libreria lo deberias hacer en este sector (void lcd_init()), que es primero en ejecutar el programa y solo lo hace una sola ves.

Un saludo.

Atte. CARLOS.
Título: Re: Problema con lcd y pic16f873
Publicado por: Vanesa en 26 de Mayo de 2006, 04:35:40
Hola Chaly,

Sí, tengo claro que si modificas la librería ya no te servirá para el 16f84
pero eso no es problema, yo ahora necesito manejar el 873.

Hemos probado a modificar la librería declarando el puerto A como digital con la instrucción de CCS "setup_adc_ports (no_analogs). Hemos puesto esta instrucción cada vez que aparecía un set_tris_a pero aún así sigue sin funcionar.

En cuanto a que la memoria empiece en la dirección 20 en lugar de la 00 como en el 84 no sé cómo podría modificarse ni si será ese el problema que tenemos.

Creo que probaremos si no a cambiar los pines de control de la LCD al puerto C, aunque el problema es que tenemos una placa de pruebas para comprobar el funcionamiento y está conectada al puerto A sin posibilidad de modificación.

Muchas gracias por todo
Título: Re: Problema con lcd y pic16f873
Publicado por: Chaly29 en 26 de Mayo de 2006, 05:51:55
Hola Vanesa, se que en C se puede incluir rutinas en .asm, por lo que si deseas incluir esta rutina que te envio calculo que te resolvera el problema:

   bcf        STATUS,RP0
   bcf        STATUS,RP1
   clrf        PORTA
   bsf        STATUS,RP0
   movlw   B'00000110'
   movwf   ADCON1
   movlw   B'11111000'         ; A0, A1, A2 configurados como salida, el resto entrada
   movwf   TRISA
   bcf        STATUS,RP0

Esta rutina la e sacado de un programa que tambien estaba manejando un display por eso se que funciona, es la encargada de configurar el puerto A como salidas digitales, incluso el programa completo funciona bien simulandolo en el proteus 6.9.
Yo te recomendaria que la coloques en el ancabezado del programa de ser posible, y luego de cualquier manejo que hagas con el puerto A (no creo sea necesario si solo lo usas como digital).

Un saludo.

Atte. CARLOS.

Título: Re: Problema con lcd y pic16f873
Publicado por: maunix en 26 de Mayo de 2006, 09:24:39
Hemos probado a modificar la librería declarando el puerto A como digital con la instrucción de CCS "setup_adc_ports (no_analogs). Hemos puesto esta instrucción cada vez que aparecía un set_tris_a pero aún así sigue sin funcionar.

Si usas esa instrucción que configuras a los pines como digitales  me parece bien para las operaciones de lectura.

No quiero ser insistente pero para mi un puerto analógico usado como salida es una salida y no debiera interferir en las operaciones de escritura del display (pero aclaré que si en las de lectura).

Para mi el problema esta en otro lado.

En cuanto a que la memoria empiece en la dirección 20 en lugar de la 00 como en el 84 no sé cómo podría modificarse ni si será ese el problema que tenemos.

Creo que probaremos si no a cambiar los pines de control de la LCD al puerto C, aunque el problema es que tenemos una placa de pruebas para comprobar el funcionamiento y está conectada al puerto A sin posibilidad de modificación.

Muchas gracias por todo

Vanesa no entiendo lo de las memorias reservadas... si usas el C debiera este saber perfectamente donde ubicar el código y las variables en memoria.

No veo declaraciones en posiciones 'fijas' de memoria en las rutinas del display.  Tampoco veo declaraciones de memorias globales todas son locales a las diferentes funnciones.

Respecto a lo que dices que la función te funciona con un string, realmente me dejaste anonadado.  Para mi un char es un simple byte y si se le pasa un string como parámetro solo puede hacer 2 cosas: o que sea descartado el resto , o que sobreescriba memorias locales de la subrutina. 
Sencillamente no veo en ningun lado que el software trate el envio de strings, salvo que el compilador se las ingenie para mandar varios chars ... lo cual lo considero medio extraño y hasta nada 'estandard' ya que el compilador debiera enviar lo que uno le dice y del otro lado recibir lo que espera recibir --> un char.
Ahora bien si un char a secas para el C que usas es un string.... no he dicho nada.

Que haría yo si fuera tu.

1) Es posible que tu pic16F873 no esté bien configurado en el compilador?

2) Es posible que el pic16F873 esté funcionando a mayor frecuencia que el 16F84? Si es asi --> aumentar los delays en las funciones de display.   Donde dice delay_cycles  aumentale a 10, a 20.  Eso no hará nada dañino.

3) Si el compilador funciona bien yo descartaría toda posibilidad de eso de las memorias reservadas porque sencillamente para que está el compilador con su linker si no es para conocer esas cosas ;)

4) Porque no pruebas con mandar un bucle de 10 caracteres? Y no un string? Es decir porqeu no llamas con un for, 10 veces a la rutina lcd_putc con una letra a? 


Saludos
Título: Re: Problema con lcd y pic16f873
Publicado por: LABmouse en 26 de Mayo de 2006, 12:12:10
Hola, mira esta libreria, para usar la LCD con los pines puerto D para enviar los datos y E para controlar los demas.

tal vez te ayude a encontrar el error.

//Definicion de instruccion de la LCD
#define  clear_display 1      //Borra LCD y coloca el cursor en la primera posicion
/*-------------------------------------------------------------------------------------------------------
HOME
Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience a
desplazarse desde la posición original. El contenido de la memoria RAM de datos de
visualización (DD RAM) permanecen invariables. La dirección de la memoria RAM de
;datos para la visualización (DD RAM) es puesta a 0.*/
#define  home 0b10
/*------------------------------------------------------------------------------------------------------
ENTRY MODE SET
Establece la dirección de movimiento del cursor y especifica si la visualización
se va desplazando a la siguiente posición de la pantalla o no. Estas operaciones se
ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar
normalmente poner el bit S a " 0 ".

   ;(I/D)Establece la direccion de movimiento del cursor
         I/D=1 Incremento del cursor

   ;(S)    Especifica si la visualizacion se va desplazando a la sgte posicion de la pantalla o no
         S=1 Desplaza la visualización cada vez que se escribe un dato.      S=0 Modo normal

   ;1 I/D S   */
#define entry_mode_set 0b100
/*-----------------------------------------------------------------------------
DISPLAY ON/OFF CONTROL
Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y
se establece si este último debe o no parpadear (B).
   ;(D)      Activa o desactiva el display             D=1 Display ON
   ;(C)      Activa o desactiva el cursor                C=1 Cursor ON
   ;(B)      Activa o desactiva el parpadeo del cursor B=1 Parpadeo de cursor ON
   ;1 D C B*/
#define display_on_off_control 0b1100
/*-------------------------------------------------------------------------------------------------------
CURSOR OR DISPLAY SHIFT
Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de
datos de visualización DD RAM.
   (S/C)      Selecciona que quiere desplazar si el display o la pantalla
            S/C=1 Desplaza el display   S/C=0 Mueve el cursor

   (R/L)      Selecciona la direccion de desplazamiento
            R/L=1 A la derecha         R/L=0 A la izquierda
   No importa
   No importa
   1 S/C R/L x x    */
#define cursor_or_display_shift 0b11000
/*-------------------------------------------------------------------------------------------------------
FUNCTION SET
Establece el tamaño de interfase con el bus de datos (DL), número de líneas del display
(N) y tipo de carácter (F).
   (DL)      Establece el tamaño de interfase con el bus de datos
            DL=1 Bus de datos de 8 bits      DL=0 Bus de datos de 4 bits

   (N)      Numero de lineas del display
            N=1 LCD de dos líneas          N=0 LCD de una línea

   (F)      Tipo de caracter
            F=1 Carácter de 5 x 10 puntos    F=0 Carácter de 5 x 7 puntos

   1 DL N F x x*/
#define function_set 0b111000

//-------------- Funcion que envia byte a pantalla lcd --------------------
void lcd_send_byte(int1 cont_ascci, char n ) {

      output_bit(pin_e1,0);//Pin enable en 0
      output_bit(pin_e0,cont_ascci);//Pin RS como se indico antes de llamar
      output_d(n);

      delay_cycles(1);
      output_bit(pin_e1,1);//Pin enable en 1
      delay_ms(2);
      output_bit(pin_e1,0);//Pin enable en 0
}
//--------- Funcion que establece la posicion del cursor en la lcd ------------
void lcd_gotoxy(char columna,char fila) {
char posicion;

     switch (fila) {
     case 1   : posicion=(0x80+columna);
     break;
     case 2   : posicion=(0xc0+columna);
     break;
     case 3   : posicion=(0x90+columna);
     break;
     case 4   : posicion=(0xd0+columna);
     break;
   }
   lcd_send_byte( 0,posicion);
}
//----------- Funcion que envia secuencia de inicializacion a lcd --------------
void lcd_init() {
    delay_ms(50);
    lcd_send_byte(0,function_set);
    lcd_send_byte(0,display_on_off_control);
    lcd_send_byte(0,clear_display);
    lcd_gotoxy(0,1);
}
//---------------------- Escribe en la lcd la letra dada ----------------------
void lcd_putc( char letra) {
   switch (letra) {
     case '\f'   : lcd_send_byte(0,1);       //Borra la pantalla LCD
                   lcd_gotoxy( 0,1);
     break;
     case '\n'   : lcd_gotoxy(0,2);
     break;
     case '\b'   : lcd_send_byte(0,0x10);
     break;
     default     : lcd_send_byte(1,letra);
     break;
   }
}