Autor Tema: Error en Lcd  (Leído 6845 veces)

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

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Error en Lcd
« en: 03 de Noviembre de 2007, 20:33:56 »
Hola, he hecho una placa para controlar un lcd y la interface de 4 bits la he conectado al porta y no me funciona. Otras veces he usado un lcd que tiene la interface de 4 bits al puerto b y me ha funcionado bien pero si esta conectado al puerto a no me funciona.  :(

He buscado informacion en este foro y en otros y he encontrado que hace falta añadir CMCON=7 que es para desabilitar los comparadores o Ansel =0 que creo que es para que el puerto a funcione en modo digital.
Pues en el programa he probado a compilar estas 2 instrucciones juntas y por separado pero el compilador que uso que es Mikrobasic me da error: Identifier "Ansel" was not declared y tambien Identifier "Cmcon" was not declared.

Todo esto me parece muy extraño porque he visto algunos codigos que usan estas instrucciones y les ha funcionado bien.
Pongo el codigo, uso un pic 16F876.


Código: [Seleccionar]
program Lcd
main:

trisc=0
trisa=0

lcd_config(porta,5,3,2,1,portc,0,1,5)
lcd_cmd(lcd_clear)
lcd_cmd(lcd_cursor_off)
lcd_out(2,2,"AAAAA")


goto main
end.

He comprobado todas las conexiones y estan bien.

Saludos.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Error en Lcd
« Respuesta #1 en: 03 de Noviembre de 2007, 21:16:36 »
Que tal Trust,

Lo que pasa es que estas usando el registro incorrecto. Para el caso del PIC16F876 debes usar el regsitro ADCON1, es decir usar ADCON1 = 6. Te marca ese error porque esos registros no existen en este micro.

Saludos.

Elreypic.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Error en Lcd
« Respuesta #2 en: 03 de Noviembre de 2007, 21:38:04 »
Hola Elreypic2, muchas gracias por responder. He probado esa instruccion y me sigue sin funcionar, probare el lcd en otra placa a ver si esta mal. La primera linea me sale llena de cuadritos.

Saludos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Error en Lcd
« Respuesta #3 en: 03 de Noviembre de 2007, 21:55:09 »
Dentro de la familia 16F hay algunas variaciones en algunos micros en concreto.
Por eso cuando se cambia de micro es recomendable echar un vistazo al datasheet del micro en cuestión.

Como ya te indicaron el registro Ansel no existe en ese micro, por ejemplo en el 16F88 si se usa.

Yo lo suelo configurar de la siguiente forma:

ADCON0.ADON=0, modulo ADC apagado (el micro consume menos energia), suele estar asi por defecto.

ADCON1= 0X07 'Todas los Pin I/O

Aqui puedes ver la tabla de configuracion del ADCON1

Saludos desde Granada, España.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Error en Lcd
« Respuesta #4 en: 04 de Noviembre de 2007, 06:43:30 »
Hola dogflu66, gracias por responder. He probado esas instrucciones y me sigue sin funcionar.
¿Hay algun registro mas para configurar?

Saludos.

Desconectado Jopapa

  • PIC10
  • *
  • Mensajes: 1
Re: Error en Lcd
« Respuesta #5 en: 04 de Noviembre de 2007, 18:43:27 »
Trust, dices que "La primera linea me sale llena de cuadritos." No es por nada, pero a mi me pasó una vez y era que tenia el contrate a tope. Vamos, sin resistencia variable.
Un saludo

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Error en Lcd
« Respuesta #6 en: 05 de Noviembre de 2007, 14:22:39 »
Si, eso ya lo se de hace tiempo que se tiene que regular el contraste con una resistencia variable.

Saludos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Error en Lcd
« Respuesta #7 en: 05 de Noviembre de 2007, 17:36:11 »
No trabajo en MicroBasic, pero este programa funcina bien
en mi simulador.

Mi lenguaje no me permite definir libremente los pin para usar
como bus de datos del LCD, pero lo he configurado 99% igual que
que tu programa, si no me he equivocado, tan solo tendras que
cambiar un cable del bus, todo los demas igual a tu configuracion
de tu LCD.

El Programita:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x3d31
  2. Define CLOCK_FREQUENCY = 4
  3. '********************************** PIC Entrenadora BASIC (PicEBasic)******************************
  4. 'NOMBRE: 16F876_LCD
  5. 'VERSION: 1.0
  6. 'MICRO: PIC16f876
  7. 'FECHA/AUTOR: 11/07 - By COS
  8. 'DESCRIPCION: ACTIVACION DEL LCD 2x16Chr
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTC  'el bit de control RS sera del puerto C
  15. Define LCD_RSBIT = 0  'se usara el RC0 como RS
  16. Define LCD_EREG = PORTC  'el bit de control E sera del puerto C
  17. Define LCD_EBIT = 5  'se usara el RC5 como E
  18. Define LCD_RWREG = PORTC  'el bit de control RW sera del puerto C
  19. Define LCD_RWBIT = 1  'se usara el RC1 como RW
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 100  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '------------------------------------------------------------------------------------------------
  24. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  25. '------------------------------------Definicion de Modulos ---------------------
  26. ADCON0.ADON = 0  'Modulo ADC a Off
  27. ADCON1 = 0x07  'todos los pin como I/O
  28. TRISA = 0x00  'Puerto A como salidas
  29. TRISB = 0x00  'puerto B como salidas
  30. TRISC = 0x00  'puerto C como salidas
  31. '**************************************Inicio Programa*********************************************
  32. Lcdinit  'inicializa el lcd sin cursor
  33. WaitMs 500  'espera 0.5Seg
  34. '--------------------------------------Main Programa-----------------------------------------------
  35. main:
  36.         Lcdcmdout LcdLine1Home  'selecciona la liena 1 como entrada de datos
  37.         Lcdout "16f876_LCD"  'escribe en el lcd
  38.         Lcdcmdout LcdLine2Home  'selecciona la linea dos como proxima para escritura
  39.         Lcdout "Pruebas con LCD"  'escribe en el lcd
  40.         WaitMs 2000  'espera 2Seg.
  41.         Lcdcmdout LcdClear  'borra el lecd
  42.         WaitMs 1000  'espera 1Seg.
  43. GOTO main


Te dejo el archivo .Hex para las dos versiones de micro (16F876 y 16F876A)
Saludos desde Granada, España.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Error en Lcd
« Respuesta #8 en: 07 de Noviembre de 2007, 16:34:51 »
Hola dogflu66, he probado tu codigo y me salen caracteres extraños.

En tu programa creo que esta configurado de la siguiente manera el puerto de datos:
porta,0,1,2,3

Y yo en mi placa lo tengo asi:
porta,5,3,2,1

Asi que no puedo usar tu programa cambiando solo un cable. Pensare si hacer un retoque en mi placa o hacer una nueva.

Muchas gracias por tu ayuda.

Saludos.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Error en Lcd
« Respuesta #9 en: 07 de Noviembre de 2007, 16:58:45 »
Vaya complicacion, la que buscaste!! :D :D
Para hacer uso de pines "sueltos" para el manejo del bus de datos del LCD, deberas recurrir a una libreria que maneje uno por uno esos pines...
Creo que por ahi tengo algo que puede ayudarte, veo de posteartelo... :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Error en Lcd
« Respuesta #10 en: 07 de Noviembre de 2007, 17:21:43 »
Aqui hay una libreria que puede servirte!!
Reemplaza los pines del bus de datos segun lo indicado...

Código: C
  1. /////////////// RUTINA PARA LCD SIN R/W
  2.  
  3.  
  4. #define LCD_D4      PIN_A5      // <<<<<< aqui se reemplazan los pines uno por uno
  5. #define LCD_D5      PIN_A3
  6. #define LCD_D6      PIN_A2
  7. #define LCD_D7      PIN_A1
  8. #define LCD_EN      PIN_C4
  9. #define LCD_RS      PIN_C5
  10. #define LCD_RW      PIN_C6
  11. // agregar esta linea en caso de que este cableado RW
  12.  
  13. #define FIRST_LINE  0x00
  14. #define SECOND_LINE 0x40
  15. #define CLEAR_DISP  0x01
  16. #define CURS_ON     0x0e
  17. #define CURS_OFF    0x0c
  18.  
  19.  
  20. // deifinicion de procesos
  21.  
  22. void LCD_Init ( void );
  23. void LCD_SetPosition ( unsigned int cX );
  24. void LCD_PutChar ( unsigned int cX );
  25. void LCD_PutCmd ( unsigned int cX );
  26. void LCD_PulseEnable ( void );
  27. void LCD_SetData ( unsigned int cX );
  28.  
  29.  
  30.  
  31. // rutinas para incializacio del display
  32.  
  33. void LCD_Init ( void )
  34.     {
  35.     set_tris_c ( 0x80 );       // <<<< AQUI DEBES CAMBIAR LOS DATOS DEL SET_TRIS POR LOS QUE TE QUEDAN
  36.     LCD_SetData ( 0x00 );   // limpia la variable de datos
  37.     output_low ( LCD_RS );  // selecciona el registro de control para datos
  38.     output_low ( LCD_RW );   // agregar esta linea en caso de que este cableado RW
  39.     LCD_SetData ( 0x03 );   // selecciona el display para 4 bits ( recuerde que arranca en 8 bits )
  40.     LCD_PulseEnable();      // llama a la rutina de habilitacion
  41.     LCD_PulseEnable();      // llama a la rutina de habilitacion
  42.     LCD_PulseEnable();      // llama a la rutina de habilitacion
  43.     LCD_SetData ( 0x02 );   // seleciona el dislpay para 4 bits de nuevo
  44.     LCD_PulseEnable();      // llama a la rutina de habilitacion
  45.     LCD_PutCmd ( 0x2C );    // seleciona funcion  (2 lineas, caracteres 5x7 )
  46.     LCD_PutCmd ( 0x0c );    // display ON, cursor off, no blink
  47.     LCD_PutCmd ( 0x01 );    // limpiar display
  48.     LCD_PutCmd ( 0x06 );    // modo de presentacion , incrementar de izquierda a derecha
  49.     }
  50.  
  51.  
  52. // rutina para el envio de comando de posicion
  53.  
  54. void LCD_SetPosition ( unsigned int cX )
  55.     {
  56.     LCD_SetData ( swap ( cX ) | 0x08 );
  57.     LCD_PulseEnable();
  58.     LCD_SetData ( swap ( cX ) );
  59.     LCD_PulseEnable();
  60.     }
  61.  
  62. // rutina para el el cnvio de carateres
  63.  
  64. void LCD_PutChar ( unsigned int cX )
  65.     {
  66.  
  67.     output_high ( LCD_RS );
  68.     LCD_SetData ( swap ( cX ) );
  69.     LCD_PulseEnable();
  70.     LCD_SetData ( swap ( cX ) );
  71.     LCD_PulseEnable();
  72.     output_low ( LCD_RS );
  73.     }
  74.  
  75. // rutina para el envio de comandos
  76.  
  77. void LCD_PutCmd ( unsigned int cX )
  78.     {
  79.     LCD_SetData ( swap ( cX ) );
  80.     LCD_PulseEnable();
  81.     LCD_SetData ( swap ( cX ) );
  82.     LCD_PulseEnable();
  83.     }
  84.  
  85. // rutina de habilitacion NO modificar en caso de error o que no funcione
  86. // agragar mas tiempo en Milisegundos
  87.  
  88. void LCD_PulseEnable ( void )
  89.     {
  90.     output_high ( LCD_EN );
  91.     delay_us ( 10 );
  92.     output_low ( LCD_EN );
  93.     delay_ms ( 5 );
  94.     }
  95.  
  96. // rutina para el envio de datos a 4 bits
  97.  
  98. void LCD_SetData ( unsigned int cX )
  99.     {
  100.     output_bit ( LCD_D4, cX & 0x01 );
  101.     output_bit ( LCD_D5, cX & 0x02 );
  102.     output_bit ( LCD_D6, cX & 0x04 );
  103.     output_bit ( LCD_D7, cX & 0x08 );
  104.     }
« Última modificación: 07 de Noviembre de 2007, 17:26:02 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Error en Lcd
« Respuesta #11 en: 07 de Noviembre de 2007, 18:39:11 »
Hola:

Marcos, me parece que eso es C, y lo que trust está usando es MKB.

Trust, para salir de dudas déjanos el circuito tal cual lo estas armando.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Error en Lcd
« Respuesta #12 en: 07 de Noviembre de 2007, 19:02:00 »
Hola:

Bueno, te dejo el esquema y el programa para que lo uses, me parece que estás definiendo al reves los pines de datos de acuerdo a tu esquema, revisa el bus y las líneas de los pines de control del esquema siguiente, y compáralo con el tuyo, este ejemplo que muestro está funcionando perfecto.





Código: FreeBasic
  1. program LCD
  2. main:
  3.  
  4. ADCON1=7
  5. trisc=0
  6. trisa=0
  7.  
  8. delay_ms(500)
  9.  
  10. lcd_config(porta,5,3,2,1,portc,0,1,5)
  11. lcd_cmd(lcd_clear)
  12.  
  13. LCD:
  14.     lcd_cmd(lcd_cursor_off)
  15.     lcd_out(2,2,"AAAAA")
  16.     delay_ms(1000)
  17.  
  18. goto LCD
  19. end.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Error en Lcd
« Respuesta #13 en: 07 de Noviembre de 2007, 19:05:53 »
He verificado mi configuracion y tienes razon:

RA5 -> RA3 -> LCD DB7
RA3 -> RA2 -> LCD DB6
RA2 -> RA1 -> LCD DB5
RA1 -> RA0 -> LCD DB4

Es lo maximo que me puedo aproximar ya que el bus de datos del LCD en mi
lenguaje solo permite seleccionar nible alto o nible bajo de un unico puerto.

« Última modificación: 07 de Noviembre de 2007, 19:12:38 por dogflu66 »
Saludos desde Granada, España.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Error en Lcd
« Respuesta #14 en: 07 de Noviembre de 2007, 19:15:38 »
Perdon!!
Igual es mas permisivo el C con sus librerias, je..je.. :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything