elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Problemas con programación de pantalla de LCD
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con programación de pantalla de LCD  (Leído 3,693 veces)
Fox_Neo

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Problemas con programación de pantalla de LCD
« en: 7 Mayo 2013, 00:39 am »

Hola a tods gracias por leer mi duda. El profesor nos ha mandado un trabajo para acabar la asignatura de Sistemas basados en microprocesador. Para ello nos ha dado unos ejemplos del autor Mikel Etxebarria.
Para entender como funcinan los programas estoy trateando con ellos para entender coo funcionan y aprovechar lo que  puedad de cada ejemplo para el trabajo.

Pues me ha atascado en uno de los primeros ejemplos supuestamente son muy faciles pero lo he modificado y no hace lo que quiero. Para ello lo he simulado con el Proteus 7 Professional, el codigo es el siguiente:

Código
  1. List p=16F886 ;Tipo de procesador
  2. include "P16F886.INC" ;Definiciones de registros internos
  3.  
  4. ;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
  5. ;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
  6.  
  7. __config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF ;Palabra 1 de configuración
  8. __config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
  9.  
  10.  
  11. Lcd_var equ 0x70 ;Variables (3) empleadas por las rutinas de manejo del LCD
  12. MSE_Delay_V equ 0x79
  13. org 0x00 ;Vector de RESET
  14. goto Inicio
  15. org 0x05
  16.  
  17. include "LCD4bitsPIC16.inc" ;Incluye las rutinas de manejo del LCD
  18. include "MSE_Delay.inc"
  19. Inicio   clrf PORTB
  20. clrf PORTA ;Borra los latch de salida
  21. bsf STATUS,RP0
  22. bsf STATUS,RP1 ;Banco 3
  23. clrf ANSEL ;Puerta A digital
  24. clrf ANSELH ;Puerta B digital
  25. bcf STATUS,RP1 ;Banco 1
  26. movlw b'11110001'
  27. movwf TRISA ;RA1-RA3 salidas
  28. movlw 0xf0
  29. movwf TRISB ;RB0-RB3 salidas
  30. bcf STATUS,RP0 ;Banco 0
  31.  
  32. call UP_LCD ;Configura puertos para LCD
  33. call LCD_INI ;Secuencia de inicio del LCD
  34.  
  35. movlw b'00001111'
  36. call LCD_REG ;Envía instrucción: LCD ON, Cursor ON y blink ON
  37. movlw 'H'
  38. call LCD_DATO ;Visualiza H
  39. movlw 'o'
  40. call LCD_DATO ;Visualiza o
  41. movlw 'l'
  42. call LCD_DATO ;Visualiza l
  43. movlw 'a'
  44. call LCD_DATO ;Visualiza a
  45. movlw ' '
  46. call LCD_DATO ;Visualiza blanco
  47. Delay 1000 Milis
  48. movlw 'M'
  49. call LCD_DATO
  50. movlw 'a'
  51. call LCD_DATO
  52. movlw 'n'
  53. call LCD_DATO
  54. movlw 'u'
  55. call LCD_DATO
  56. Loop sleep ;Puesta en Standby
  57.  
  58. end ;Fin del programa fuente


La librería de la pantalla LCD es:
Código
  1. ; LCD4bitsPIC16.inc
  2. ; Autor: Mikel Etxebarria
  3. ; (c) Ingeniería de Microsistemas Programados S.L.
  4. ; www.microcontroladores.com
  5. ; Bilbao 2010
  6. ;
  7. ;Este conjunto de rutinas diseñadas para PIC16 que permiten realizar las tareas
  8. ;básicas de control del módulo de visualización LCD, mediante un interface de 4 bits.
  9. ;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE
  10. ;
  11. ;Las rutinas están adaptadas a las velocidades más lentas de algunos módulos LCD, en las cuales
  12. ;el tiempo de activación (Tc) entre una señal ENABLE y la siguiente es de unos 4 uS. La
  13. ;velocidad de trabajo se supone de 4MHz.
  14.  
  15. ;UP_LCD: Configuración PIC para el LCD.
  16. ;
  17. ;LCD_INI: Rutina de visualización según Wintek. El LCD queda activado, borrado
  18. ; y en la 1ª posición del cursor
  19. ;
  20. ;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
  21. ;
  22. ;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W
  23. ;
  24.  
  25. ;Se supone un interface de 4 bits. RB0-RB3 es la puerta de datos. RA1-RA3 son las señales de control.
  26. ;Estas conexiones se pueden modificar según se necesite
  27.  
  28. #define ENABLE       bsf PORTA,1     ;Activa señal E (RA1)
  29. #define DISABLE       bcf PORTA,1     ;Desactiva señal E (RA1)
  30. #define LEER         bsf PORTA,2     ;Pone LCD en Modo RD (RA2)
  31. #define ESCRIBIR     bcf PORTA,2     ;Pone LCD en Modo WR (RA2)
  32. #define LCD_COMANDO   bcf PORTA,3     ;Desactiva RS (modo comando)(RA3)
  33. #define LCD_DATOS   bsf PORTA,3   ;Activa RS (modo dato)(RA3)
  34. #define LCD_C_PORT PORTA ;Puerta de control del LCD (RA1-RA3)
  35. #define LCD_C_TRIS TRISA ;Control de la puerta de control del LCD
  36. #define LCD_PORT PORTB ;Puerta de datos del LCD (RB0-RB3)
  37. #define LCD_TRIS TRISB ;Control de la puerta de datos del LCD
  38.  
  39. ;Variables empleadas por las rutinas de control del LCD
  40. CBLOCK Lcd_var ;Inicio de las variables. Será la primera
  41. Lcd_Temp_1 ;direccón libre disponible
  42. Lcd_Temp_2
  43. Lcd_Temp_3
  44. ENDC
  45.  
  46. ;*************************************************************************
  47. ;UP_LCD: Configuración PIC para el LCD.
  48. ;
  49. UP_LCD          LCD_COMANDO             ;RS=0
  50.                DISABLE                 ;E=0
  51.                ESCRIBIR ;R/W=0
  52. bsf STATUS,RP0 ;Banco 1
  53. movf LCD_C_TRIS,W
  54. andlw b'11110001'
  55. movwf LCD_C_TRIS ;Puerta de control del LCD como salida
  56. movf LCD_TRIS,W
  57. andlw 0xF0
  58. movwf   LCD_TRIS        ;Puerta de datos del LCD como salidas
  59. bcf STATUS,RP0 ;Banco 0
  60. return
  61.  
  62. ;**************************************************************************
  63. ;LCD_BUSY: Lectura del Flag Busy y de la dirección. No retorna hasta que busy sea "0"
  64. ;
  65. LCD_BUSY clrwdt
  66. bsf STATUS,RP0 ;Banco 1
  67.           movf LCD_TRIS,W
  68. andlw 0xf0
  69. iorlw 0x0f
  70. movwf LCD_TRIS        ;Puerta de interface como entradas
  71. bcf STATUS,RP0 ;Banco 0
  72.            LCD_COMANDO ;Modo dato
  73. LEER                    ;Pone el LCD en Modo RD
  74. LCD_BUSY_1 nop
  75. ENABLE                  ;Activa el LCD
  76.           swapf LCD_PORT,W
  77. andlw b'11110000'
  78. movwf Lcd_Temp_3 ;Lee y salva los 4 bits de mas peso
  79. DISABLE
  80. nop
  81. ENABLE ;Activa el LCD
  82. nop
  83. movf LCD_PORT,W
  84. andlw b'00001111'
  85. iorwf Lcd_Temp_3,F ;Lee y salva los 4 bits de menos peso
  86. nop
  87. DISABLE
  88. btfsc Lcd_Temp_3,7 ;Busy activado ??
  89. goto LCD_BUSY_1 ;Si, volver a leer
  90. ESCRIBIR ;Modo escritura
  91. bsf STATUS,RP0 ;Banco 1
  92.           movf LCD_TRIS,W
  93. andlw 0xf0
  94. movwf   LCD_TRIS        ;Puerta de interface como salida
  95. bcf STATUS,RP0 ;Banco 0
  96. return
  97.  
  98. ;**************************************************************************
  99. ;LCD_E: Pulso de Enable. En algunos LCD's esta señal debe estar a "0" un tiempo mínimo
  100. ;antes de volver a ponerse a "1". Se puede variar el valor de temporización en función
  101. ;del tipo de LCD.
  102. ;
  103. LCD_E           ENABLE              ;Activa E
  104. nop
  105. nop
  106. DISABLE             ;Desactiva E
  107. nop
  108. nop
  109. return
  110.  
  111. ;**************************************************************************
  112. ;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
  113. ;
  114. LCD_DATO movwf Lcd_Temp_2 ;Salva el dato a visualizar
  115. call LCD_BUSY ;Espera que el LCD esté libre
  116. movlw 0xf0
  117. andwf LCD_PORT,F
  118. swapf Lcd_Temp_2,W
  119. andlw 0x0F
  120. iorwf LCD_PORT,F ;Salida de los 4 bits de mas peso
  121. ESCRIBIR ;Modo escritura
  122. LCD_DATOS ;Modo datos
  123. call LCD_E ;Genera pulso de Enable
  124. movlw 0xf0
  125. andwf LCD_PORT,F
  126. movf Lcd_Temp_2,W
  127. andlw 0x0f
  128. iorwf LCD_PORT,F ;Salida de los 4 bits de menos peso
  129. call LCD_E ;Genera pulso de Enable
  130. return
  131.  
  132. ;**************************************************************************
  133. ;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W
  134.  
  135. LCD_REG         movwf Lcd_Temp_2 ;Salva el dato a visualizar
  136. call LCD_BUSY ;Espera que el LCD esté libre
  137. movlw 0xf0
  138. andwf LCD_PORT,F
  139. swapf Lcd_Temp_2,W
  140. andlw 0x0f
  141. iorwf LCD_PORT,F ;Salida de los 4 bits de mas peso
  142. ESCRIBIR ;Modo escritura
  143. LCD_COMANDO ;Modo comandos
  144. call LCD_E ;Genera pulso de Enable
  145. movlw 0xf0
  146. andwf LCD_PORT,F
  147. movf Lcd_Temp_2,W
  148. andlw 0x0f
  149. iorwf LCD_PORT,F ;Salida de los 4 bits de menos peso
  150. call LCD_E ;Genera pulso de Enable
  151. return
  152.  
  153. ;***************************************************************************
  154. ;LCD_INI: Rutina de visualización según Wintek. El LCD queda activado, borrado
  155. ;y en la 1ª posición del cursor
  156.  
  157. LCD_INI movlw .75
  158. movwf Lcd_Temp_1
  159. call LCD_DELAY ;Temporización de unos 15mS tras el Power-On
  160. DISABLE
  161. ESCRIBIR
  162. LCD_COMANDO ;Modo comando y escritura
  163. movlw 0xf0
  164. andwf LCD_PORT,F
  165. movlw 0x03
  166. iorwf LCD_PORT,F ;Comando FUNCTION SET sin chequeo de busy
  167. call LCD_E ;Genera pulso de Enable
  168. movlw .25
  169. movwf Lcd_Temp_1
  170. call LCD_DELAY ;Temporiza unos 5mS
  171. movlw 0xf0
  172. andwf LCD_PORT,F
  173. movlw 0x03
  174. iorwf LCD_PORT,F ;Comando FUNCTION SET sin chequeo de busy
  175. call LCD_E ;Genera pulso de Enable
  176. movlw .5
  177. movwf Lcd_Temp_1
  178. call LCD_DELAY ;Temporiza unos 1 ms
  179. movlw 0xf0
  180. andwf LCD_PORT,F
  181. movlw 0x02
  182. iorwf LCD_PORT,F ;Comando FUNCTION SET a 4 bits sin chequeo de busy
  183. call LCD_E ;Genera pulso de Enable
  184. movlw b'00101000'
  185. call LCD_REG ;Comando FUNCTION SET con chequeo de busy
  186. movlw b'00001000'
  187. call LCD_REG ;Display Off
  188. movlw b'00000001'
  189. call LCD_REG ;Comando HOME
  190. movlw b'00001100'
  191. call LCD_REG ;Comando Diaplay ON
  192. return
  193.  
  194. ;*****************************************************************************
  195. ;LCD_DELAY: Rutina de temporización de unos 200 uS a 4MHz que se repite tantas veces
  196. ;como indica la variable Lcd_Temp_1. Se emplean las variables Lcd_Temp_1
  197. ;y LCD_Temp_2 en lugar del TMR0. Este queda libre para las aplicaciones del usuario
  198.  
  199. LCD_DELAY: movlw .50
  200. movwf Lcd_Temp_2
  201. LCD_DELAY_1: clrwdt
  202. decfsz Lcd_Temp_2,F
  203. goto LCD_DELAY_1
  204. decfsz Lcd_Temp_1,F ;Bucle de 4uS que se repite 50 veces (200us)
  205. goto LCD_DELAY ;El bucle de 200uS se repite Lcd_Temp_1 veces
  206. return
  207.  
  208.  
Y la librería del MSE_Delay es:
Código
  1. ;************************************************************************************************************************
  2. ;
  3. ; Autor: Mikel Etxebarria
  4. ; (c) Ingeniería de Microsistemas Programados S.L.
  5. ;
  6. ;  
  7. ;
  8. ;Macro y rutina de temporización que se ajustan en función de la frecuencia de trabajo Fosc. En el programa principal
  9. ;se debe definir:
  10. ;a) La frecuencia de trabajo (en hz) mediante ... "#define Fosc xxxxxxxx"
  11. ;b) Inicio de las variables de temporización " MSE_Delay_V equ 0xXX "
  12. ;
  13. ;El usuario llama a la macro desde su programa principal mediante ... "Delay xxxx Milis"
  14. ;
  15. ;Se obtiene una precisión razonable con valores de temporización desde 1 hasta 2000 mS y a frecuencias Fosc
  16. ;que van desde 1MHz hasta 48MHz
  17.  
  18. #define         Milis * D'1000000'
  19.  
  20. CBLOCK MSE_Delay_V ;Inicio de las variables. Será la primera
  21. MSE_Delay_1 ;direccón libre disponible
  22. MSE_Delay_2
  23. MSE_Delay_3
  24. ENDC
  25.  
  26. Delay macro tiempo_ns ;tiempo_ns expresa en ns el tiempo de temporización deseado
  27.  
  28. ifndef Fosc ;En el programa principal se ha definir la frecuencia de trabajo en Hz
  29. messg "ERROR !! - Establecer la frecuencia de trabajo (p.e. #define Fosc 4000000)"
  30. exitm
  31. endif
  32.  
  33. radix dec ;Operaciones en base decimal
  34. variable ciclo_instruc_ns =  (( 1000000000 ) / (Fosc / 4 )) ;Calcula ciclo de instrucción en función de la frecuencia Fosc
  35. variable ciclos = (tiempo_ns / ciclo_instruc_ns) ;Calcula el nº de ciclos necesarios para la temporización deseada
  36.  
  37.  
  38. movlw upper (ciclos/4)+1
  39. movwf MSE_Delay_1
  40. movlw high (ciclos/4)+1
  41. movwf MSE_Delay_2
  42. movlw low (ciclos/4)
  43. movwf MSE_Delay_3 ;Carga las variables de temporización con el nº de ciclos calculado
  44. call MSE_Delay
  45.  
  46. endm
  47.  
  48. MSE_Delay clrwdt ;Bucles de temporización
  49. decfsz MSE_Delay_3,f
  50. goto MSE_Delay
  51. decfsz MSE_Delay_2,f
  52. goto MSE_Delay
  53. decfsz MSE_Delay_1,f
  54. goto MSE_Delay
  55. return
  56.  
  57.  
Pues yo he añadido lo siguiente al codigo  original:
Código
  1. Delay 1000 Milis
  2. movlw 'M'
  3. call LCD_DATO
  4. movlw 'a'
  5. call LCD_DATO
  6. movlw 'n'
  7. call LCD_DATO
  8. movlw 'u'
  9. call LCD_DATO
  10.  
Al simularlo en proteus me sale Manu al instante y no espera 1 segundo y no entiendo por qué no funciona.Se me queda ejecutando en la instrucción"call  LCD_INI" y no sale de hay (lo he simulado paso a paso con MPLAB). No entiendo que si no sale de ese bucle como es capaz de poner el mensaje si no puee avanzar en el programa.  Se lo he preguntado al profesor y me ha dicho que no tiene ni idea que como el no ha hecho las librerias ni los programas no sabe como funcionan y que me busque la vida,  nos da programas que ni se molesta en mirar, por eso pregunto aqui, ya que hay gente muy buena que le da mil vueltas a muchos de los profesores de universidad  :¬¬
Os dejo el montaje del LCD y el PIC en Proteus:https://dl.dropboxusercontent.com/u/68772720/CAJA%20FUERTE.DSN
Gracias por la atencion
salu2


« Última modificación: 7 Mayo 2013, 00:52 am por Fox_Neo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines