TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: sebaspla2008 en 20 de Septiembre de 2008, 17:59:37

Título: No funciona lcd programado en PICBASIC con 16f84a
Publicado por: sebaspla2008 en 20 de Septiembre de 2008, 17:59:37
Saludos a toda la comunidad del foro. Qusiera saber si me podrian ayudar con mi problema. El tema es que no consigo hacer funcionar un lcd 16x2 (HD44780), sin embargo lo mas raro es que en el PIC SIMULATOR si me funciona.
las conexiones son las siguientes (en 4 bits): RS a RA3, E a RA4, R/W a masa, D4 a RB4, D5 a RB5, D6 a RB6 y D7 a RB7.
El codigo es el siguiente:
Código: [Seleccionar]
Define CONF_WORD = 0x3ff9

Define LCD_BITS = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 3
Define LCD_EREG = PORTA
Define LCD_EBIT = 4
Define LCD_COMMANDUS = 200
Define LCD_DATAUS = 50
Define LCD_INITMS = 5
Lcdinit 0

Dim izq As Byte
Dim der As Byte
Dim cen As Byte
Dim control As Byte
Lcdcmdout LcdClear
control = 0
izq = 0
der = 0
cen = 0
TRISB.0 = 0
TRISB.1 = 0
TRISB.2 = 0
TRISB.3 = 0

grande:
If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 0 Then
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 0

If control = 0 Then
Lcdout "Buscando Linea"
Endif
control = 1

Else
loop:
If PORTA.0 = 1 And PORTA.1 = 0 And PORTA.2 = 0 Then
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 0
If cen = 0 Then
Lcdcmdout LcdClear
Lcdout "Linea recta"
Endif
izq = 0
der = 0
cen = 1
Endif

If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.2 = 1 Then
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 0
If cen = 0 Then
Lcdcmdout LcdClear
Lcdout "Linea recta"
Endif
izq = 0
der = 0
cen = 1
Endif


If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.2 = 0 Then
PORTB.0 = 0
PORTB.1 = 1
PORTB.2 = 1
PORTB.3 = 0
If der = 0 Then
Lcdcmdout LcdClear
Lcdout "Gira derecha"
Endif
izq = 0
der = 1
cen = 0
Endif

If PORTA.0 = 0 And PORTA.1 = 1 And PORTA.2 = 0 Then
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 1
PORTB.3 = 0
If der = 0 Then
Lcdcmdout LcdClear
Lcdout "Gira derecha"
Endif
izq = 0
der = 1
cen = 0
Endif

If PORTA.0 = 1 And PORTA.1 = 0 And PORTA.2 = 1 Then
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 1
If izq = 0 Then
Lcdcmdout LcdClear
Lcdout "Gira izquierda"
Endif
izq = 1
der = 0
cen = 0
Endif

If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 1 Then
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 0
If izq = 0 Then
Lcdcmdout LcdClear
Lcdout "Gira izquierda"
Endif
izq = 1
der = 0
cen = 0
Endif

If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 0 Then
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 0
PORTB.3 = 0
Endif

Goto loop
Endif
Goto grande



Creo yo que por ahi sean los delays.
Muchas gracias
Título: Re: No funciona lcd programado en PICBASIC con 16f84a
Publicado por: dogflu66 en 20 de Septiembre de 2008, 18:54:56
No he utilizado nunca el 16F84, pero por lo que veo parece que son los tiempos de espera después de enviar o recibir datos lcd.
Este PIC creo recordar que no lleva ADC, pero de todas formas no cuesta trabajo indicar que los pin serán digitales.
La frecuencia de reloj no la defines, pero imagino que se la indicas al monitor del PSI. Un pequeño error muy común es que la
frecuencia de trabajo especificada en el monitor del PSI no coincide con la frecuencia del cristal, si pasa esto no funciona el LCD
en la realidad.

Código: FreeBasic
  1. Define CONF_WORD = 0x3ff9 'Definicion de bit OK
  2. Define CLOCK_FREQUENCY = 4  'Frecuencia del cristal imagino que 4Mhz modo XT
  3.  
  4. Define LCD_BITS = 4
  5. Define LCD_RSREG = PORTA
  6. Define LCD_RSBIT = 3
  7. Define LCD_EREG = PORTA
  8. Define LCD_EBIT = 4
  9. Define LCD_COMMANDUS = 2000  'Es el tiempo que tarda en ejecutarce el comando mas largo, borrado completo del LCD
  10. Define LCD_DATAUS = 100  'Tiempo intermedio de espera despues de enviar dato, puede ser menor pero no todos los LCDs lo soportan
  11. Define LCD_INITMS = 50  'Tiempo de incio del LCD, puede variar tambien segun el fabricante.
  12. 'Lcdinit 0
  13.  
  14. Dim izq As Byte
  15. Dim der As Byte
  16. Dim cen As Byte
  17. Dim control As Byte
  18. Lcdcmdout LcdClear
  19.  
  20. control = 0
  21. izq = 0
  22. der = 0
  23. cen = 0
  24.  
  25. AllDigital  'En este pic puede que no haga falta, pero nocuesta trabajo ponerlo
  26. TRISB.0 = 0
  27. TRISB.1 = 0
  28. TRISB.2 = 0
  29. TRISB.3 = 0
  30.  
  31. Lcdinit 0 'Mejor aqui, despues de configurar los puertos
  32. WaitMs 100 'Espera de estabilizacion de señales, puede ser mucho mas pequeño
  33.  
  34. grande:
  35.         If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 0 Then
  36.                 PORTB.0 = 1
  37.                 PORTB.1 = 0
  38.                 PORTB.2 = 1
  39.                 PORTB.3 = 0
  40.  
  41.                 If control = 0 Then
  42.                         Lcdout "Buscando Linea"
  43.                 Endif
  44.                 control = 1
  45.  
  46.         Else
  47.  
  48. loop:
  49.         If PORTA.0 = 1 And PORTA.1 = 0 And PORTA.2 = 0 Then
  50.                 PORTB.0 = 1
  51.                 PORTB.1 = 0
  52.                 PORTB.2 = 1
  53.                 PORTB.3 = 0
  54.                 If cen = 0 Then
  55.                         Lcdcmdout LcdClear
  56.                         Lcdout "Linea recta"
  57.                 Endif
  58.                 izq = 0
  59.                 der = 0
  60.                 cen = 1
  61.         Endif
  62.  
  63.         If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.2 = 1 Then
  64.                 PORTB.0 = 1
  65.                 PORTB.1 = 0
  66.                 PORTB.2 = 1
  67.                 PORTB.3 = 0
  68.                 If cen = 0 Then
  69.                         Lcdcmdout LcdClear
  70.                         Lcdout "Linea recta"
  71.                 Endif
  72.                 izq = 0
  73.                 der = 0
  74.                 cen = 1
  75.         Endif
  76.  
  77.  
  78.         If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.2 = 0 Then
  79.                 PORTB.0 = 0
  80.                 PORTB.1 = 1
  81.                 PORTB.2 = 1
  82.                 PORTB.3 = 0
  83.                 If der = 0 Then
  84.                         Lcdcmdout LcdClear
  85.                         Lcdout "Gira derecha"
  86.                 Endif
  87.                 izq = 0
  88.                 der = 1
  89.                 cen = 0
  90.         Endif
  91.  
  92.         If PORTA.0 = 0 And PORTA.1 = 1 And PORTA.2 = 0 Then
  93.                 PORTB.0 = 0
  94.                 PORTB.1 = 0
  95.                 PORTB.2 = 1
  96.                 PORTB.3 = 0
  97.                 If der = 0 Then
  98.                         Lcdcmdout LcdClear
  99.                         Lcdout "Gira derecha"
  100.                 Endif
  101.                 izq = 0
  102.                 der = 1
  103.                 cen = 0
  104.         Endif
  105.  
  106.         If PORTA.0 = 1 And PORTA.1 = 0 And PORTA.2 = 1 Then
  107.                 PORTB.0 = 1
  108.                 PORTB.1 = 0
  109.                 PORTB.2 = 0
  110.                 PORTB.3 = 1
  111.                 If izq = 0 Then
  112.                         Lcdcmdout LcdClear
  113.                         Lcdout "Gira izquierda"
  114.                 Endif
  115.                 izq = 1
  116.                 der = 0
  117.                 cen = 0
  118.         Endif
  119.  
  120.         If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 1 Then
  121.                 PORTB.0 = 1
  122.                 PORTB.1 = 0
  123.                 PORTB.2 = 0
  124.                 PORTB.3 = 0
  125.                 If izq = 0 Then
  126.                         Lcdcmdout LcdClear
  127.                         Lcdout "Gira izquierda"
  128.                 Endif
  129.                 izq = 1
  130.                 der = 0
  131.                 cen = 0
  132.         Endif
  133.  
  134.         If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.2 = 0 Then
  135.                 PORTB.0 = 0
  136.                 PORTB.1 = 0
  137.                 PORTB.2 = 0
  138.                 PORTB.3 = 0
  139.         Endif
  140.  
  141. Goto loop
  142. Endif
  143. Goto grande 'Estructura rara con los gotos, pero si funciona pues bien

PD. Cuidado al utilizar simuladores, son una buena herramienta pero algunas veces nos despistan.