Foro de elhacker.net

Informática => Electrónica => Mensaje iniciado por: Meta en 3 Septiembre 2010, 07:32 am



Título: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 3 Septiembre 2010, 07:32 am
Hola:

Quiero hacer la tabla de 6 bits y me parece el error de los 256 bits usados. ¿Hay alguna manera de resolverlo?

Código:

; ZONA DE DATOS **********************************************************************

    TITLE        "LCD Sensor PS2"
    SUBTITLE    "Revisión 1.00"
    LIST        P=16F886
    INCLUDE        <P16F886.INC>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

    CBLOCK    0x20
    CONTADOR
    ENDC

#DEFINE        RESET_RC0    PORTC,0
#DEFINE        EJECT_RC1    PORTC,1
#DEFINE        OPEN_RC2    PORTC,2
#DEFINE        CLOSE_RC3    PORTC,3
#DEFINE        GREEN_RC4    PORTC,4
#DEFINE        RED_RC5        PORTC,5
#DEFINE        Auxiliar_6    PORTC,6
#DEFINE        Auxiliar_7    PORTC,7

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                        ; El programa comienza en la dirección 0.

Inicio
    call    LCD_Inicializa
    BANKSEL    TRISC                    ; Banco 1.
    bsf        RESET_RC0                    ; Se configura como entradas.
    bsf        EJECT_RC1
    bsf        OPEN_RC2
    bsf        CLOSE_RC3                   
    bsf        GREEN_RC4
    bsf        RED_RC5
    bsf        Auxiliar_6
    bsf        Auxiliar_7
    BANKSEL    PORTC                    ; Banco 0.
    clrw

Principal
    movf    PORTC,W                ; Lee los sensores.
    andlw    b'00111111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0        ; 0 0 0 0 0 0
    goto    Configuracion1        ; 0 0 0 0 0 1
    goto    Configuracion2        ; 0 0 0 0 1 0
    goto    Configuracion3        ; 0 0 0 0 1 1
    goto    Configuracion4        ; 0 0 0 1 0 0
    goto    Configuracion5        ; 0 0 0 1 0 1
    goto    Configuracion6        ; 0 0 0 1 1 0
    goto    Configuracion7        ; 0 0 0 1 1 1
    goto    Configuracion8        ; 0 0 1 0 0 0
    goto    Configuracion9        ; 0 0 1 0 0 1
    goto    Configuracion10        ; 0 0 1 0 1 0
    goto    Configuracion11        ; 0 0 1 0 1 1
    goto    Configuracion12        ; 0 0 1 1 0 0
    goto    Configuracion13        ; 0 0 1 1 0 1
    goto    Configuracion14        ; 0 0 1 1 1 0
    goto    Configuracion15        ; 0 0 1 1 1 1
    goto    Configuracion16        ; 0 1 0 0 0 0
    goto    Configuracion17        ; 0 1 0 0 0 1
    goto    Configuracion18        ; 0 1 0 0 1 0
    goto    Configuracion19        ; 0 1 0 0 1 1
    goto    Configuracion20        ; 0 1 0 1 0 0
    goto    Configuracion21        ; 0 1 0 1 0 1
    goto    Configuracion22        ; 0 1 0 1 1 0
    goto    Configuracion23        ; 0 1 0 1 1 1
    goto    Configuracion24        ; 0 1 1 0 0 0
    goto    Configuracion25        ; 0 1 1 0 0 1
    goto    Configuracion26        ; 0 1 1 0 1 0
    goto    Configuracion27        ; 0 1 1 0 1 1
    goto    Configuracion28        ; 0 1 1 1 0 0
    goto    Configuracion29        ; 0 1 1 1 0 1
    goto    Configuracion30        ; 0 1 1 1 1 0
    goto    Configuracion31        ; 0 1 1 1 1 1
    goto    Configuracion32
    goto    Configuracion33
    goto    Configuracion34
    goto    Configuracion35
    goto    Configuracion36
    goto    Configuracion37
    goto    Configuracion38
    goto    Configuracion39
    goto    Configuracion40
    goto    Configuracion41
    goto    Configuracion42
    goto    Configuracion43
    goto    Configuracion44
    goto    Configuracion45
    goto    Configuracion46
    goto    Configuracion47
    goto    Configuracion48
    goto    Configuracion49
    goto    Configuracion50
    goto    Configuracion51
    goto    Configuracion52
    goto    Configuracion53
    goto    Configuracion54
    goto    Configuracion55
    goto    Configuracion56
    goto    Configuracion57
    goto    Configuracion58
    goto    Configuracion59
    goto    Configuracion60
    goto    Configuracion61
    goto    Configuracion62
    goto    Configuracion63
Configuracion0                       
    goto    ActivaSalida
Configuracion1                       
    goto    ActivaSalida
Configuracion2                   
    goto    ActivaSalida
Configuracion3                   
    goto    ActivaSalida
Configuracion4
    goto    ActivaSalida
Configuracion5
    goto    ActivaSalida
Configuracion6
    goto    ActivaSalida
Configuracion7
    goto    ActivaSalida
Configuracion8
    goto    ActivaSalida
Configuracion9
    goto    ActivaSalida
Configuracion10
    goto    ActivaSalida
Configuracion11
    goto    ActivaSalida
Configuracion12
    goto    ActivaSalida
Configuracion13
    goto    ActivaSalida
Configuracion14
    goto    ActivaSalida
Configuracion15
    goto    ActivaSalida
Configuracion16
    goto    ActivaSalida
Configuracion17
    goto    ActivaSalida
Configuracion18
    goto    ActivaSalida
Configuracion19
    goto    ActivaSalida
Configuracion20
    goto    ActivaSalida
Configuracion21
    goto    ActivaSalida
Configuracion22
    goto    ActivaSalida
Configuracion23
    goto    ActivaSalida
Configuracion24
    goto    ActivaSalida
Configuracion25
    goto    ActivaSalida
Configuracion26
    goto    ActivaSalida
Configuracion27
    goto    ActivaSalida
Configuracion28
    goto    ActivaSalida
Configuracion29
    goto    ActivaSalida
Configuracion30
    goto    ActivaSalida
Configuracion31
    goto    ActivaSalida
Configuracion32
    goto    ActivaSalida
Configuracion33
    goto    ActivaSalida
Configuracion34
    goto    ActivaSalida
Configuracion35
    goto    ActivaSalida
Configuracion36
    goto    ActivaSalida
Configuracion37
    goto    ActivaSalida
Configuracion38
    goto    ActivaSalida
Configuracion39
    goto    ActivaSalida
Configuracion40
    goto    ActivaSalida
Configuracion41
    goto    ActivaSalida
Configuracion42
    goto    ActivaSalida
Configuracion43
    goto    ActivaSalida
Configuracion44
    goto    ActivaSalida
Configuracion45
    goto    ActivaSalida
Configuracion46
    goto    ActivaSalida
Configuracion47
    goto    ActivaSalida
Configuracion48
    goto    ActivaSalida
Configuracion49
    goto    ActivaSalida
Configuracion50
    goto    ActivaSalida
Configuracion51
    goto    ActivaSalida
Configuracion52
    goto    ActivaSalida
Configuracion53
    goto    ActivaSalida
Configuracion54
    goto    ActivaSalida
Configuracion55
    goto    ActivaSalida
Configuracion56
    goto    ActivaSalida
Configuracion57
    goto    ActivaSalida
Configuracion58
    goto    ActivaSalida
Configuracion59
    goto    ActivaSalida
Configuracion60
    goto    ActivaSalida
Configuracion61
    goto    ActivaSalida
Configuracion62
    goto    ActivaSalida
Configuracion63
    goto    ActivaSalida
ActivaSalida
;    movwf    PORTB               
    goto     Principal

;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
Mensaje1
    DT    "      STAND BY      ", 0x00
Mensaje2
    DT    "MEnsaje             1.", 0x00
Mensaje3
    DT     "Mensaje 2            ", 0x00
Mensaje4
    DT    "Mensaje 3             ", 0x00
Mensaje5
    DT     "     Msm             ", 0x00
Mensaje6
    DT    "Motor girando...", 0x00
Mensaje7
    DT     "marca", 0x00
Mensaje8
    DT    "Mensaje 4-2     ", 0x00
FinTabla
;MensajeAnuncio
;    DT " anuncio---       ", 0x00   

    IF (FinTabla > 0xFF)
        ERROR    "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
        MESSG    "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
    ENDIF

    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    END

Saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 3 Septiembre 2010, 18:07 pm
Estimado Meta:

Es aquí donde debes usar el registro PCLATH, ya que la instrucción ADDWF   PCL,F suma dos registros de un byte cada  uno, por lo cual el resultado es de un byte y sólo puedes direccionar de entre 255 direcciones de una subpágina. Por tanto, si el registro PCLATH no selecciona la página correspondiente, el programa no funcionará correctamente.

Una manera de solucionarlo consiste en, antes de llamar a la tabla, sumar los valores del registro W y de la dirección (tabla + 1) (recordemos que al ejecutarse la instrucción ADDWF   PCL,F el registro PCL está direccionando la siguiente instrucción). El byte alto del resultado lo cargamos en PCLATH y, posteriormente, llamamos la tabla como siempre. Ejemplo:

Supongamos que queremos tomar los 6 bits menos significativos de PORTA como entradas de la tabla, haríamos lo siguiente:

Código
  1. movf PORTA,W
  2.                andlw        b'00111111'
  3. addlw low(Tabla+.1)  ; Suma el valor de desplazamiento con la dirección (Tabla + 1).
  4. movlw high(Tabla+.1) ; Obtiene el byte alto de la dirección (Tabla + 1).
  5. btfsc STATUS,C ; Si la suma de bytes bajos dió acarreo...
  6. addlw .1             ; lo suma al byte alto de la dirección (Tabla + 1)
  7. movwf PCLATH     ; y lo carga en PCLATH para seleccionar la página correspondiente.
  8. movf PORTA,W   ; Ahora llama la tabla normalmente.
  9.                andlw        b'00111111'
  10. call Tabla

Es un poco tedioso, pero funciona. Lamentablemente, ese arreglo también lo tendrás que hacer en la librería LCD_MENS.INC y en todas las librerías que usen tablas. Una vez que hagas ese arreglo, puedes quitar la directiva IF Fin_Tabla...

Espero te sirva. Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 3 Septiembre 2010, 20:51 pm
Hola:

Eso suenaalgo parecido como suena por aquí. No sabía que en todas las librerías tenía que hacer lo mismo.
http://www.pic16f84a.org/index.php?option=com_docman&task=doc_download&gid=3&Itemid=59

Como voy a usar quizás muchos mensajitos para el LCD. ¿Hay algún problema para hacer con una EEPROM 24LC256 externa?

Empezaré la programación con ellas.

Saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 3 Septiembre 2010, 21:43 pm
Meta:

Te dejo un programa ejemplo con el PIC16F876A junto con la librería "LCD_MENS.INC" mdificada para que no tenga error al acceder a una tabla que rebasa los primeros 256 bytes; analízalo.

Código
  1. #include "p16f876a.inc"
  2. __config _XT_OSC & _PWRTE_ON & _LVP_OFF & _DEBUG_OFF & _WDT_OFF & _BODEN_OFF
  3.  
  4. cblock 20h
  5. endc
  6.  
  7. org 00h
  8. call LCD_Inicializa
  9.  
  10. call LCD_Linea1
  11. call LCD_LineaEnBlanco
  12. call LCD_Linea1
  13. movlw MensajeHola
  14. call LCD_Mensaje
  15.  
  16. call LCD_Linea2
  17. call LCD_LineaEnBlanco
  18. call LCD_Linea2
  19. movlw MensajeAmigos
  20. call LCD_Mensaje
  21.  
  22. goto $
  23.  
  24. org .250
  25. Mensajes
  26. addwf PCL,F
  27. MensajeHola
  28. dt "Hola a todos...",0
  29. MensajeAmigos
  30. dt "Amigos mios...",0
  31.  
  32. INCLUDE "RETARDOS.INC"
  33. INCLUDE "LCD_4BIT.INC"
  34. INCLUDE "LCD_MENS.INC"
  35.  
  36. end

Nota que los mensajes los puse a partir de la dirección 250 para que la tabla de mensajes rebase los primeros 256 bytes y así comprobar que el código funciona aún en esas circunstancias.

La librería "LCD_MENS" modificada es la siguiente:

Código
  1. ;**************************** Librería "LCD_MENS.INC" ********************************
  2. ;
  3. ; ===================================================================
  4. ;  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  5. ;  E. Palacios, F. Remiro y L. López. www.pic16f84a.com
  6. ;  Editorial Ra-Ma.  www.ra-ma.es
  7. ; ===================================================================
  8. ;
  9. ; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.
  10.  
  11. CBLOCK
  12. LCD_ApuntaCaracter ; Indica la posición del carácter a visualizar
  13. ; respecto del comienzo de todos los mensajes,
  14. ; (posición de la etiqueta "Mensajes").
  15. LCD_ValorCaracter ; Código ASCII del carácter a
  16. ENDC ; visualizar.
  17.  
  18. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
  19. ; memoria de programa, es decir, no pueden superar la dirección 0FFh.
  20.  
  21. ; Subrutina "LCD_Mensaje" ---------------------------------------------------------------
  22. ;
  23. ; Visualiza por pantalla el mensaje apuntado por el registro W.
  24. ;
  25. ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
  26. ; tenga la siguiente estructura:
  27. ;
  28. ; Mensajes ; ¡Etiqueta obligatoria!
  29. ; addwf PCL,F
  30. ; Mensaje0 ; Posición inicial del mensaje.
  31. ; DT ".. ..", 0x00 ; Mensaje terminado en 0x00.
  32. ; Mensaje1
  33. ; ...
  34. ; ...
  35. ; FinMensajes
  36. ;
  37. ; La llamada a esta subrutina se realizará siguiendo este ejemplo:
  38. ;
  39. ; movlw Mensaje0 ; Carga la posición del mensaje.
  40. ; call LCD_Mensaje ; Visualiza el mensaje.
  41. ;
  42. LCD_Mensaje
  43. movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.
  44. movlw Mensajes ; haya la posición relativa del primer carácter
  45. subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes".
  46. decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".
  47. LCD_VisualizaOtroCaracter
  48. movf LCD_ApuntaCaracter,W
  49. ; Modificado para evitar desvíos en el programa
  50. addlw low(Mensajes + .1)
  51. movlw high(Mensajes + .1)
  52. btfsc STATUS,C
  53. addlw .1
  54. movwf PCLATH
  55. movf LCD_ApuntaCaracter,W
  56. ;...
  57. call Mensajes ; Obtiene el código ASCII del carácter apuntado.
  58. movwf LCD_ValorCaracter ; Guarda el valor de carácter.
  59. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  60. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  61. goto LCD_FinMensaje ; de mensaje, sale fuera.
  62. LCD_NoUltimoCaracter
  63. call LCD_Caracter ; Visualiza el carácter ASCII leído.
  64. incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter
  65. goto LCD_VisualizaOtroCaracter ; dentro del mensaje.
  66. LCD_FinMensaje
  67. return ; Vuelve al programa principal.
  68.  
  69. ; Subrutina "LCD_MensajeMovimiento" -----------------------------------------------------
  70. ;
  71. ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse
  72. ; en una línea, por tanto se desplaza a través de la pantalla.
  73. ;
  74. ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para
  75. ; conseguir que el desplazamiento del mensaje sea lo más legible posible.
  76. ;
  77. CBLOCK
  78. LCD_CursorPosicion ; Contabiliza la posición del cursor dentro de la
  79. ENDC ; pantalla LCD
  80.  
  81. LCD_MensajeMovimiento
  82. movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.
  83. movlw Mensajes ; haya la posición relativa del primer carácter
  84. subwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes".
  85. decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".
  86. LCD_PrimeraPosicion
  87. clrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea.
  88. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y
  89. LCD_VisualizaCaracter ; borra la pantalla.
  90. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?
  91. subwf LCD_CursorPosicion,W
  92. btfss STATUS,Z
  93. goto LCD_NoEsFinalLinea
  94. LCD_EsFinalLinea
  95. call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.
  96. call Retardo_200ms
  97. movlw LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizado
  98. subwf LCD_ApuntaCaracter,F ; en pantalla, que será el primero en la siguiente
  99. goto LCD_PrimeraPosicion ; visualización de línea, para producir el efecto
  100. LCD_NoEsFinalLinea ; de desplazamiento hacia la izquierda.
  101. movf LCD_ApuntaCaracter,W
  102. ; Modificado para evitar desvíos en el programa
  103. addlw low(Mensajes + .1)
  104. movlw high(Mensajes + .1)
  105. btfsc STATUS,C
  106. addlw .1
  107. movwf PCLATH
  108. movf LCD_ApuntaCaracter,W
  109. ;...
  110. call Mensajes ; Obtiene el ASCII del carácter apuntado.
  111. movwf LCD_ValorCaracter ; Guarda el valor de carácter.
  112. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  113. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  114. goto LCD_FinMovimiento ; de mensaje, sale fuera.
  115. LCD_NoUltimoCaracter2
  116. call LCD_Caracter ; Visualiza el carácter ASCII leído.
  117. incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del
  118. ; cursor en la pantalla.
  119. incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar.
  120. goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter
  121. LCD_FinMovimiento ; de la línea.
  122. return ; Vuelve al programa principal.
  123.  
  124. ; ===================================================================
  125. ;  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  126. ;  E. Palacios, F. Remiro y L. López. www.pic16f84a.com
  127. ;  Editorial Ra-Ma.  www.ra-ma.es
  128. ; ===================================================================

Te recomiendo, además, que tus tablas aparte de los mensajes las coloques al principio de tu programa y después de esas tablas pongas los mensajes. Por ejemplo:

Código
  1. org        0
  2.     goto   Inicio
  3.  
  4. Tabla_1
  5.    addwf    PCL,F
  6.    retlw      0x33
  7.    retlw      0x68
  8.             .
  9.             .
  10.  
  11. Tabla_2
  12.    addwf    PCL,F
  13.    retlw      0x67
  14.    retlw      0x87
  15.              .
  16.              .
  17.  
  18. Mensajes
  19.    addwf    PCL,F
  20. Mensaje0
  21.    DT        "MENSAJE NUM 0",0
  22. Mensaje1
  23.    DT        "MENSAJE NUM 1",0
  24.              .
  25.              .
  26.  
  27. Inicio
  28.     call      LCD_Inicializa
  29.     movlw  Mensaje0
  30.              .
  31.              .
  32.  
  33.       INCLUDE    "LCD_MENS.INC"
  34.       INCLUDE    "LCD_4BIT.INC"
  35.                   .
  36.                   .
  37.  
  38.          end

         Espero te sea útil. Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 4 Septiembre 2010, 23:29 pm
Gracias, veo que dominas el tema.

Por lo que parece hay que cambiar todo hasta en las librerías.

Hasta en el 2º nivel si hace falta.

Estaba pensando en meter una EERPOM 24LC256 ya que soporta 128 mensajes a 256 bytes cada uno. ¿Qué es más preferible y por qué?

Se que requiere más gastos en hardware, pero el programa te lo deja como un campeón sin usar cosas raras.




Edito:[/b]

Hola:

Estoy probando la EEPROM externa 24LC256. Sospecho que no tengo configuradio bien el PORTA del PIC16F886. Me aparecen carácteres sólo en negro.

En cada 100 de dirección de la EEPROM hay mensajes guardado. Supuestamente debe aparecer el 1 que indica en la diracción 0.

Dejo el esquema en Proteus y código fuente.

(http://www.subeimagenes.com/img/lcd-ps2-16f886-eeprom-24lc2-1531.jpg)

Ver mejor imagen. (http://www.subeimagenes.com/img/lcd-ps2-16f886-eeprom-24lc2-1531.jpg)

Descargar (http://www.forosdeelectronica.com/attachment.php?attachmentid=38903&d=1283651086) código fuente y esquema proteus.

Si no pudes descargarlo, desde estar registrado (http://www.forosdeelectronica.com).

Saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 5 Septiembre 2010, 20:57 pm
Meta:

Una pequeña pregunta: ¿Cómo le cargas el valor inicial a la 24LC256? Yo no pude cargarle contenidos iniciales.

Un comentario: Asegúrate de configurar las terminales del puerto A como dgitales, por defecto son analógicas.

          Por el momeno es todo. Saludos


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 5 Septiembre 2010, 22:35 pm
Hola:

Espero que estén bien configuradas las entradas o salidas en digitales en vez de analógico.


Código
  1.  
  2.  
  3. ; ZONA DE DATOS **********************************************************************
  4.  
  5. TITLE "LCD Sensor PS2"
  6. SUBTITLE "Revisión 1.00"
  7. LIST P=16F886
  8. INCLUDE <P16F886.INC>
  9. __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
  10. __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  11.  
  12. CBLOCK 0x20
  13. Contador
  14. Apuntador
  15. ENDC
  16.  
  17. PAGINA EQU 0x00
  18. ULTIMO_MENSAJE EQU .10 ; Señala el número del último mensaje.
  19.  
  20. #DEFINE RESET_RC0 PORTC,0
  21. #DEFINE EJECT_RC1 PORTC,1
  22. #DEFINE OPEN_RC2 PORTC,2
  23. #DEFINE CLOSE_RC3 PORTC,3
  24. #DEFINE GREEN_RC4 PORTC,4
  25. #DEFINE RED_RC5 PORTC,5
  26. #DEFINE Auxiliar_6 PORTC,6
  27. #DEFINE Auxiliar_7 PORTC,7
  28.  
  29. ; ZONA DE CÓDIGOS ********************************************************************
  30.  
  31. ORG 0 ; El programa comienza en la dirección 0.
  32.  
  33. Inicio
  34. call LCD_Inicializa
  35. BANKSEL TRISC ; Banco 1.
  36. bsf RESET_RC0 ; Se configura como entradas.
  37. bsf EJECT_RC1
  38. bsf OPEN_RC2
  39. bsf CLOSE_RC3
  40. bsf GREEN_RC4
  41. bsf RED_RC5
  42. bsf Auxiliar_6
  43. bsf Auxiliar_7
  44. BANKSEL PORTC ; Banco 0.
  45. clrw
  46. clrf Apuntador ; Inicializa el contador
  47. Principal
  48. movf Apuntador,W ; Apunta al inicio de cada mensaje ya que esta
  49. call M24LC256_Mensaje_a_LCD ; subrutina lo carga en (M24LC256_AddressHigh).
  50. call Retardo_2s ; Visualiza el mensaje durante este tiempo.
  51. incf Apuntador,F ; Apunta al siguiente mensaje.
  52. movf Apuntador,W ; Comprueba si ha llegado al último mensaje.
  53. sublw ULTIMO_MENSAJE ; (W)=ULTIMO_MENSAJE-(Apuntador).
  54. btfss STATUS,C ; ¿C=1?, ¿(W) positivo?
  55. clrf Apuntador ; Ha resultado ULTIMO_MENSAJE<(Apuntador).
  56. goto Principal
  57.  
  58. movf PORTC,W ; Lee los sensores.
  59. andlw b'00111111' ; Máscara para quedarse con el valor de los sensores.
  60. addwf PCL,F ; Salta a la configuración adecuada.
  61. goto Configuracion0 ; 0 0 0 0 0 0
  62. goto Configuracion1 ; 0 0 0 0 0 1
  63. goto Configuracion2 ; 0 0 0 0 1 0
  64. goto Configuracion3 ; 0 0 0 0 1 1
  65. goto Configuracion4 ; 0 0 0 1 0 0
  66. goto Configuracion5 ; 0 0 0 1 0 1
  67. goto Configuracion6 ; 0 0 0 1 1 0
  68. goto Configuracion7 ; 0 0 0 1 1 1
  69. goto Configuracion8 ; 0 0 1 0 0 0
  70. goto Configuracion9 ; 0 0 1 0 0 1
  71. goto Configuracion10 ; 0 0 1 0 1 0
  72. goto Configuracion11 ; 0 0 1 0 1 1
  73. goto Configuracion12 ; 0 0 1 1 0 0
  74. goto Configuracion13 ; 0 0 1 1 0 1
  75. goto Configuracion14 ; 0 0 1 1 1 0
  76. goto Configuracion15 ; 0 0 1 1 1 1
  77. goto Configuracion16 ; 0 1 0 0 0 0
  78. goto Configuracion17 ; 0 1 0 0 0 1
  79. goto Configuracion18 ; 0 1 0 0 1 0
  80. goto Configuracion19 ; 0 1 0 0 1 1
  81. goto Configuracion20 ; 0 1 0 1 0 0
  82. goto Configuracion21 ; 0 1 0 1 0 1
  83. goto Configuracion22 ; 0 1 0 1 1 0
  84. goto Configuracion23 ; 0 1 0 1 1 1
  85. goto Configuracion24 ; 0 1 1 0 0 0
  86. goto Configuracion25 ; 0 1 1 0 0 1
  87. goto Configuracion26 ; 0 1 1 0 1 0
  88. goto Configuracion27 ; 0 1 1 0 1 1
  89. goto Configuracion28 ; 0 1 1 1 0 0
  90. goto Configuracion29 ; 0 1 1 1 0 1
  91. goto Configuracion30 ; 0 1 1 1 1 0
  92. goto Configuracion31 ; 0 1 1 1 1 1
  93. goto Configuracion32
  94. goto Configuracion33
  95. goto Configuracion34
  96. goto Configuracion35
  97. goto Configuracion36
  98. goto Configuracion37
  99. goto Configuracion38
  100. goto Configuracion39
  101. goto Configuracion40
  102. goto Configuracion41
  103. goto Configuracion42
  104. goto Configuracion43
  105. goto Configuracion44
  106. goto Configuracion45
  107. goto Configuracion46
  108. goto Configuracion47
  109. goto Configuracion48
  110. goto Configuracion49
  111. goto Configuracion50
  112. goto Configuracion51
  113. goto Configuracion52
  114. goto Configuracion53
  115. goto Configuracion54
  116. goto Configuracion55
  117. goto Configuracion56
  118. goto Configuracion57
  119. goto Configuracion58
  120. goto Configuracion59
  121. goto Configuracion60
  122. goto Configuracion61
  123. goto Configuracion62
  124. goto Configuracion63
  125. Configuracion0
  126. goto ActivaSalida
  127. Configuracion1
  128. goto ActivaSalida
  129. Configuracion2
  130. goto ActivaSalida
  131. Configuracion3
  132. goto ActivaSalida
  133. Configuracion4
  134. goto ActivaSalida
  135. Configuracion5
  136. goto ActivaSalida
  137. Configuracion6
  138. goto ActivaSalida
  139. Configuracion7
  140. goto ActivaSalida
  141. Configuracion8
  142. goto ActivaSalida
  143. Configuracion9
  144. goto ActivaSalida
  145. Configuracion10
  146. goto ActivaSalida
  147. Configuracion11
  148. goto ActivaSalida
  149. Configuracion12
  150. goto ActivaSalida
  151. Configuracion13
  152. goto ActivaSalida
  153. Configuracion14
  154. goto ActivaSalida
  155. Configuracion15
  156. goto ActivaSalida
  157. Configuracion16
  158. goto ActivaSalida
  159. Configuracion17
  160. goto ActivaSalida
  161. Configuracion18
  162. goto ActivaSalida
  163. Configuracion19
  164. goto ActivaSalida
  165. Configuracion20
  166. goto ActivaSalida
  167. Configuracion21
  168. goto ActivaSalida
  169. Configuracion22
  170. goto ActivaSalida
  171. Configuracion23
  172. goto ActivaSalida
  173. Configuracion24
  174. goto ActivaSalida
  175. Configuracion25
  176. goto ActivaSalida
  177. Configuracion26
  178. goto ActivaSalida
  179. Configuracion27
  180. goto ActivaSalida
  181. Configuracion28
  182. goto ActivaSalida
  183. Configuracion29
  184. goto ActivaSalida
  185. Configuracion30
  186. goto ActivaSalida
  187. Configuracion31
  188. goto ActivaSalida
  189. Configuracion32
  190. goto ActivaSalida
  191. Configuracion33
  192. goto ActivaSalida
  193. Configuracion34
  194. goto ActivaSalida
  195. Configuracion35
  196. goto ActivaSalida
  197. Configuracion36
  198. goto ActivaSalida
  199. Configuracion37
  200. goto ActivaSalida
  201. Configuracion38
  202. goto ActivaSalida
  203. Configuracion39
  204. goto ActivaSalida
  205. Configuracion40
  206. goto ActivaSalida
  207. Configuracion41
  208. goto ActivaSalida
  209. Configuracion42
  210. goto ActivaSalida
  211. Configuracion43
  212. goto ActivaSalida
  213. Configuracion44
  214. goto ActivaSalida
  215. Configuracion45
  216. goto ActivaSalida
  217. Configuracion46
  218. goto ActivaSalida
  219. Configuracion47
  220. goto ActivaSalida
  221. Configuracion48
  222. goto ActivaSalida
  223. Configuracion49
  224. goto ActivaSalida
  225. Configuracion50
  226. goto ActivaSalida
  227. Configuracion51
  228. goto ActivaSalida
  229. Configuracion52
  230. goto ActivaSalida
  231. Configuracion53
  232. goto ActivaSalida
  233. Configuracion54
  234. goto ActivaSalida
  235. Configuracion55
  236. goto ActivaSalida
  237. Configuracion56
  238. goto ActivaSalida
  239. Configuracion57
  240. goto ActivaSalida
  241. Configuracion58
  242. goto ActivaSalida
  243. Configuracion59
  244. goto ActivaSalida
  245. Configuracion60
  246. goto ActivaSalida
  247. Configuracion61
  248. goto ActivaSalida
  249. Configuracion62
  250. goto ActivaSalida
  251. Configuracion63
  252. goto ActivaSalida
  253. ActivaSalida
  254. ; movwf PORTB
  255. goto Principal
  256.  
  257. ;
  258. ; "Mensajes" ----------------------------------------------------------------------------
  259. ;
  260. Mensajes
  261. addwf PCL,F
  262. Mensaje1
  263. DT "aaaaaaaaaaaaaaaaaaaa", 0x00
  264. Mensaje2
  265. DT "bbbbbbbbbbbbbbbbbbbb", 0x00
  266. Mensaje3
  267. DT "cccccccccccccccccccc", 0x00
  268. Mensaje4
  269. DT "dddddddddddddddddddd", 0x00
  270. Mensaje5
  271. DT "e", 0x00
  272. Mensaje6
  273. DT "M", 0x00
  274. Mensaje7
  275. DT "S", 0x00
  276. Mensaje8
  277. DT "M", 0x00
  278. ;
  279. FinTabla
  280. ;MensajeAnuncio
  281. ; DT " fgfd ", 0x00
  282.  
  283. IF (FinTabla > 0xFF)
  284. ERROR "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
  285. MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
  286. ENDIF
  287.  
  288. INCLUDE <BIN_BCD.INC>
  289. INCLUDE  <BUS_I2C.INC> ; Subrutinas de control del bus I2C.
  290. INCLUDE  <M24LC256.INC> ; Subrutinas de control de la memoria 24LC256.
  291. INCLUDE  <LCD_4BIT.INC>
  292. INCLUDE  <LCD_MENS.INC>
  293. INCLUDE  <RETARDOS.INC>
  294. END
  295.  
  296.  
  297.  

Librería LCD_4BIT.INC por aquí configuro los puertos y espero que no estén en analógicos.

Código
  1. ;**************************** Librería "LCD_4BIT.INC"
  2. ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
  3. ; líneas por 16 caracteres, compatible con el modelo LM016L.
  4. ;
  5. ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
  6. ; conexiones son:
  7. ; - Las 4 líneas superiores del módulo LCD, pines <DB7:DB4>  se conectan a las 4
  8. ; líneas superiores del Puerto B del PIC, pines <RB7:RB4>.
  9. ; - Pin RS del LCD a la línea RA0 del PIC.
  10. ; - Pin R/W del LCD a la línea RA1 del PIC, o a masa.
  11. ; - Pin Enable del LCD a la línea RA2 del PIC.
  12. ;
  13. ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería
  14. ; RETARDOS.INC.
  15. ;
  16. ; ZONA DE DATOS *********************************************************************
  17.  
  18. CBLOCK
  19. LCD_Dato
  20. LCD_GuardaDato
  21. LCD_GuardaTRISB
  22. LCD_Auxiliar1
  23. LCD_Auxiliar2
  24. ENDC
  25.  
  26. LCD_CaracteresPorLinea EQU .20 ; Número de caracteres por línea de la pantalla.
  27.  
  28. #DEFINE   LCD_PinRS PORTB,0
  29. #DEFINE   LCD_PinRW PORTB,1
  30. #DEFINE   LCD_PinEnable PORTB,2
  31. #DEFINE LCD_BusDatos PORTB
  32.  
  33. ; Subrutina "LCD_Inicializa" ------------------------------------------------------------
  34. ;
  35. ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
  36. ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
  37. ; configuración inicial hay que hacerla como sigue:
  38. ;
  39. LCD_Inicializa
  40. BANKSEL ANSEL                                    
  41.    clrf ANSEL ; E/S Digitales.
  42. clrf ANSELH
  43. BANKSEL TRISB
  44. bcf LCD_PinRS ; R/W y E.
  45. bcf LCD_PinEnable
  46. bcf LCD_PinRW
  47. BANKSEL TRISA
  48. clrf TRISA
  49. clrf TRISB
  50. BANKSEL PORTA
  51. bcf LCD_PinRW ; En caso de que esté conectado le indica
  52. ; que se va a escribir en el LCD.
  53. bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0.
  54. bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0.
  55. call Retardo_20ms
  56. movlw b'00110000'
  57. call LCD_EscribeLCD ; Escribe el dato en el LCD.
  58. call Retardo_5ms
  59. movlw b'00110000'
  60. call LCD_EscribeLCD
  61. call Retardo_200micros
  62. movlw b'00110000'
  63. call LCD_EscribeLCD
  64. call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
  65. movlw b'00100000' ; Interface de 4 bits.
  66. call LCD_EscribeLCD
  67. call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
  68.  
  69. ; Ahora configura el resto de los parámetros:
  70.  
  71. call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos.
  72. call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio
  73. call LCD_CursorOFF ; de la línea 1. Cursor apagado.
  74. call LCD_CursorIncr ; Cursor en modo incrementar.
  75. return
  76.  
  77. ; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
  78. ;
  79. ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
  80. ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
  81. ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
  82. ; vuelve a enviar este dato sin cambiarlo.
  83.  
  84. LCD_EscribeLCD
  85. andlw b'11110000' ; Se queda con el nibble alto del dato que es el
  86. movwf LCD_Dato ; que hay que enviar y lo guarda.
  87. movf LCD_BusDatos,W ; Lee la información actual de la parte baja
  88. andlw b'00001111' ; del Puerto B, que no se debe alterar.
  89. iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada
  90. ; y en la parte baja lo que había antes.
  91. BANKSEL TRISB ; Acceso al Banco 1.
  92. movf TRISB,W ; Guarda la configuración que tenía antes TRISB.
  93. movwf LCD_GuardaTRISB
  94. movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan
  95. andwf PORTB,F ; como estaban y las 4 superiores como salida.
  96. BANKSEL PORTB ; Acceso al Banco 0.
  97. ;
  98. movf LCD_Dato,W ; Recupera el dato a enviar.
  99. movwf LCD_BusDatos ; Envía el dato al módulo LCD.
  100. bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
  101. bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
  102. BANKSEL TRISB ; Acceso al Banco 1. Restaura el antiguo valor en
  103. movf LCD_GuardaTRISB,W ; la configuración del Puerto B.
  104. movwf TRISB
  105. BANKSEL PORTB ; Acceso al Banco 0.
  106. return
  107.  
  108. ; Subrutinas variadas para el control del módulo LCD -----------------------------------------
  109. ;
  110. ;Los comandos que pueden ser ejecutados son:
  111. ;
  112. LCD_CursorIncr ; Cursor en modo incrementar.
  113. movlw b'00000110'
  114. goto LCD_EnviaComando
  115. LCD_Linea1 ; Cursor al principio de la Línea 1.
  116. movlw b'10000000' ; Dirección 00h de la DDRAM
  117. goto LCD_EnviaComando
  118. LCD_Linea2 ; Cursor al principio de la Línea 2.
  119. movlw b'11000000' ; Dirección 40h de la DDRAM
  120. goto LCD_EnviaComando
  121. LCD_Linea3 ; Cursor al principio de la Línea 3
  122. movlw b'10010100' ; Dirección 14h de la DDRAM
  123. goto LCD_EnviaComando
  124. LCD_Linea4 ; Cursor al principio de la Línea 4
  125. movlw b'11010100' ; Dirección 54h de la DDRAM
  126. goto LCD_EnviaComando
  127. LCD_PosicionLinea1 ; Cursor a posición de la Línea 1, a partir de la
  128. iorlw b'10000000' ; dirección 00h de la DDRAM más el valor del
  129. goto LCD_EnviaComando ; registro W.
  130. LCD_PosicionLinea2 ; Cursor a posición de la Línea 2, a partir de la
  131. iorlw b'11000000' ; dirección 40h de la DDRAM más el valor del
  132. goto LCD_EnviaComando ; registro W.
  133. LCD_OFF ; Pantalla apagada.
  134. movlw b'00001000'
  135. goto LCD_EnviaComando
  136. LCD_CursorON ; Pantalla encendida y cursor encendido.
  137. movlw b'00001110'
  138. goto LCD_EnviaComando
  139. LCD_CursorOFF ; Pantalla encendida y cursor apagado.
  140. movlw b'00001100'
  141. goto LCD_EnviaComando
  142. LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el
  143. movlw b'00000001' ; cursor a principio de la línea 1.
  144. goto LCD_EnviaComando
  145. LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres
  146. movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de
  147. ; goto LCD_EnviaComando ; 4 bits.
  148.  
  149. ; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
  150. ;
  151. ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
  152. ; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
  153. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
  154. ; a través del registro W. Trabaja en Modo Dato.
  155. ;
  156. LCD_EnviaComando
  157. bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0.
  158. goto LCD_Envia
  159. LCD_Caracter
  160. bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1.
  161. call LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
  162. LCD_Envia
  163. movwf LCD_GuardaDato ; Guarda el dato a enviar.
  164. call LCD_EscribeLCD ; Primero envía el nibble alto.
  165. swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el
  166. ; nibble bajo del dato a enviar a parte alta del byte.
  167. call LCD_EscribeLCD ; Se envía al visualizador LCD.
  168. btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo
  169. call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter.
  170. call Retardo_50micros
  171. return
  172.  
  173. ; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
  174. ;
  175. ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
  176. ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
  177. ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
  178. ;
  179. ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
  180. ; que puedan ser visualizado en el módulo LM016L.
  181. ;
  182. ; Entrada: En (W) el código ASCII del carácter que se desea visualizar.
  183. ; Salida: En (W) el código definido en la tabla CGROM.
  184.  
  185. LCD_CodigoCGROM
  186. movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es
  187. LCD_EnheMinuscula ; un carácter especial.
  188. sublw 'ñ' ; ¿Es la "ñ"?
  189. btfss STATUS,Z
  190. goto LCD_EnheMayuscula ; No es "ñ".
  191. movlw b'11101110' ; Código CGROM de la "ñ".
  192. movwf LCD_Dato
  193. goto LCD_FinCGROM
  194. LCD_EnheMayuscula
  195. movf LCD_Dato,W ; Recupera el código ASCII de entrada.
  196. sublw 'Ñ' ; ¿Es la "Ñ"?
  197. btfss STATUS,Z
  198. goto LCD_Grado ; No es "Ñ".
  199. movlw b'11101110' ; Código CGROM de la "ñ". (No hay símbolo para
  200. movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM).
  201. goto LCD_FinCGROM
  202. LCD_Grado
  203. movf LCD_Dato,W ; Recupera el código ASCII de entrada.
  204. sublw 'º' ; ¿Es el símbolo "º"?
  205. btfss STATUS,Z
  206. goto LCD_FinCGROM ; No es "º".
  207. movlw b'11011111' ; Código CGROM del símbolo "º".
  208. movwf LCD_Dato
  209. LCD_FinCGROM
  210. movf LCD_Dato,W ; En (W) el código buscado.
  211. return
  212.  
  213. ; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
  214. ;
  215. ; Visualiza espacios en blanco.
  216.  
  217. LCD_LineaEnBlanco
  218. movlw LCD_CaracteresPorLinea
  219. goto LCD_EnviaBlancos
  220. LCD_UnEspacioBlanco
  221. movlw .1
  222. goto LCD_EnviaBlancos
  223. LCD_DosEspaciosBlancos
  224. movlw .2
  225. goto LCD_EnviaBlancos
  226. LCD_TresEspaciosBlancos
  227. movlw .3
  228. LCD_EnviaBlancos
  229. movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador.
  230. LCD_EnviaOtroBlanco
  231. movlw ' ' ; Esto es un espacio en blanco.
  232. call LCD_Caracter ; Visualiza tanto espacios en blanco como se
  233. decfsz LCD_Auxiliar1,F ; haya cargado en (LCD_Auxiliar1).
  234. goto LCD_EnviaOtroBlanco
  235. return
  236.  
  237. ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
  238. ;
  239. ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
  240. ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
  241. ;
  242. ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
  243. ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
  244. ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
  245. ;
  246. ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
  247. ;
  248. LCD_Byte
  249. movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
  250. andlw b'11110000' ; Analiza si el nibble alto es cero.
  251. btfss STATUS,Z ; Si es cero lo apaga.
  252. goto LCD_VisualizaAlto ; No es cero y lo visualiza.
  253. movlw ' ' ; Visualiza un espacio en blanco.
  254. call LCD_Caracter
  255. goto LCD_VisualizaBajo
  256.  
  257. LCD_ByteCompleto
  258. movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
  259. LCD_VisualizaAlto
  260. swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja.
  261. call LCD_Nibble ; Lo visualiza.
  262. LCD_VisualizaBajo
  263. movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo.
  264. ; call LCD_Nibble ; Lo visualiza.
  265. ; return
  266.  
  267. ; Subrutina "LCD_Nibble" ----------------------------------------------------------------
  268. ;
  269. ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
  270. ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
  271. ; - Si (W)=b'01010110', se visualizará "6".
  272. ; - Si (W)=b'10101110', se visualizará "E".
  273. ;
  274. LCD_Nibble
  275. andlw b'00001111' ; Se queda con la parte baja.
  276. movwf LCD_Auxiliar1 ; Lo guarda.
  277. sublw 0x09 ; Comprueba si hay que representarlo con letra.
  278. btfss STATUS,C
  279. goto LCD_EnviaByteLetra
  280. movf LCD_Auxiliar1,W
  281. addlw '0' ; El número se pasa a carácter ASCII sumándole
  282. goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza.
  283. LCD_EnviaByteLetra
  284. movf LCD_Auxiliar1,W
  285. addlw 'A'-0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'.
  286. LCD_FinVisualizaDigito
  287. goto LCD_Caracter ; Y visualiza el carácter. Se hace con un "goto"
  288. ; para no sobrecargar la pila.
  289.  


El bus I2C también lo he modificado para el 16F886, espero que esté bien.

Código
  1. ;**************************** Librería "BUS_I2C.INC"
  2. ;
  3. ; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C,
  4. ; por parte de un solo microcontrolador maestro.
  5. ;
  6. ; ZONA DE DATOS *****************************
  7. ;
  8. CBLOCK
  9. I2C_ContadorBits ; Cuenta los bits a transmitir o a recibir.
  10. I2C_Dato ; Dato a transmitir o recibido.
  11. I2C_Flags ; Guarda la información del estado del bus I2C.
  12. ENDC
  13.  
  14. #DEFINE I2C_UltimoByteLeer I2C_Flags,0
  15. ;    -  (I2C_UltimoByteLeer)=0, NO es el último byte a leer por el maestro.
  16. ;    -  (I2C_UltimoByteLeer)=1, SÍ es el último byte a leer por el maestro.
  17.  
  18. ; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las
  19. ; necesidades del hardware.
  20.  
  21. #DEFINE SCL PORTA,3 ; Línea SCL del bus I2C.
  22. #DEFINE SDA PORTA,4 ; Línea SDA del bus I2C.
  23. ;
  24. ; Subrutina "SDA_Bajo" ------------------------------------------------------------------
  25. ;
  26. SDA_Bajo
  27. bcf STATUS,RP1
  28. bsf STATUS,RP0 ; Configura la línea SDA como salida.
  29. bcf SDA
  30. bcf STATUS,RP1
  31. bcf STATUS,RP0
  32. bcf SDA ; SDA en bajo.
  33. return
  34. ;
  35. ; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
  36. ;
  37. SDA_AltaImpedancia
  38. bcf STATUS,RP1
  39. bsf STATUS,RP0 ; Configura la línea SDA entrada.
  40. bsf SDA ; Lo pone en alta impedancia y, gracias a la
  41. bcf STATUS,RP1
  42. bcf STATUS,RP0 ; Rp de esta línea, se mantiene a nivel alto.
  43. return
  44. ;
  45. ; Subrutina "SCL_Bajo" ------------------------------------------------------------------
  46. ;
  47. SCL_Bajo
  48. bcf STATUS,RP1
  49. bsf STATUS,RP0
  50. bcf SCL ; Configura la línea SCL como salida.
  51. bcf STATUS,RP1
  52. bcf STATUS,RP0
  53. bcf SCL ; La línea de reloj SCL en bajo.
  54. return
  55. ;
  56. ; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
  57. ;
  58. SCL_AltaImpedancia
  59. bcf STATUS,RP1
  60. bsf STATUS,RP0 ; Configura la línea SCL entrada.
  61. bsf SCL ; Lo pone en alta impedancia y, gracias a la Rp
  62. bcf STATUS,RP1
  63. bcf STATUS,RP0 ; de esta línea, se mantiene a nivel alto.
  64. SCL_EsperaNivelAlto
  65. btfss SCL ; Si algún esclavo mantiene esta línea en bajo
  66. goto SCL_EsperaNivelAlto ; hay que esperar.
  67. return
  68. ;
  69. ; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
  70. ;
  71. ; Esta subrutina envía una condición de Start o inicio.
  72. ;
  73. I2C_EnviaStart
  74. call SDA_AltaImpedancia ; Línea SDA en alto.
  75. call SCL_AltaImpedancia ; Línea SCL en alto.
  76. call Retardo_4micros ; Tiempo tBUF del protocolo.
  77. call SDA_Bajo ; Flanco de bajada de SDA mientras SCL está alto.
  78. call Retardo_4micros ; Tiempo tHD;STA del protocolo.
  79. call SCL_Bajo ; Flanco de bajada del reloj SCL.
  80. call Retardo_4micros
  81. return
  82. ;
  83. ; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
  84. ;
  85. ; Esta subrutina envía un condición de Stop o parada.
  86. ;
  87. I2C_EnviaStop
  88. call SDA_Bajo
  89. call SCL_AltaImpedancia ; Flanco de subida de SCL.
  90. call Retardo_4micros ; Tiempo tSU;STO del protocolo.
  91. call SDA_AltaImpedancia ; Flanco de subida de SDA.
  92. call Retardo_4micros ; Tiempo tBUF del protocolo.
  93. return
  94. ;
  95. ; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
  96. ;
  97. ; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
  98. ; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
  99. ; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte,
  100. ; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
  101. ;
  102. I2C_EnviaByte
  103. movwf I2C_Dato ; Almacena el byte a transmitir.
  104. movlw 0x08 ; A transmitir 8 bits.
  105. movwf I2C_ContadorBits
  106. I2C_EnviaBit
  107. rlf I2C_Dato,F ; Chequea el bit, llevándolo previamente al Carry.
  108. btfsc STATUS,C
  109. goto I2C_EnviaUno
  110. I2C_EnviaCero
  111. call SDA_Bajo ; Si es "0" envía un nivel bajo.
  112. goto I2C_FlancoSCL
  113. I2C_EnviaUno
  114. call SDA_AltaImpedancia ; Si es "1" lo activará a alto.
  115. I2C_FlancoSCL
  116. call SCL_AltaImpedancia ; Flanco de subida del SCL.
  117. call Retardo_4micros ; Tiempo tHIGH del protocolo.
  118. call SCL_Bajo ; Termina el semiperiodo positivo del reloj.
  119. call Retardo_4micros ; Tiempo tHD;DAT del protocolo.
  120. decfsz I2C_ContadorBits,F ; Lazo para los ocho bits.
  121. goto I2C_EnviaBit
  122. ;
  123. call SDA_AltaImpedancia ; Libera la línea de datos.
  124. call SCL_AltaImpedancia ; Pulso en alto de reloj para que el esclavo
  125. call Retardo_4micros ; pueda enviar el bit ACK.
  126. call SCL_Bajo
  127. call Retardo_4micros
  128. return
  129. ;
  130. ; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
  131. ;
  132. ; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
  133. ; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
  134. ; del registro W. Se empieza a leer por el bit de mayor peso MSB.
  135. ; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
  136. ; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.
  137.  
  138. I2C_LeeByte
  139. movlw 0x08 ; A recibir 8 bits.
  140. movwf I2C_ContadorBits
  141. call SDA_AltaImpedancia ; Deja libre la línea de datos.
  142. I2C_LeeBit
  143. call SCL_AltaImpedancia ; Flanco de subida del reloj.
  144. bcf STATUS,C ; En principio supone que es "0".
  145. btfsc SDA ; Lee el bit
  146. bsf STATUS,C ; Si es "1" carga 1 en el Carry.
  147. rlf I2C_Dato,F ; Lo introduce en el registro.
  148. call SCL_Bajo ; Termina el semiperiodo positivo del reloj.
  149. call Retardo_4micros ; Tiempo tHD;DAT del protocolo.
  150. decfsz I2C_ContadorBits,F ; Lazo para los 8 bits.
  151. goto I2C_LeeBit
  152. ;
  153. ; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento
  154. ; ACK en consecuencia.
  155. ;
  156. btfss I2C_UltimoByteLeer ; Si es el último, no debe enviar
  157. ; el bit de reconocimiento ACK.
  158. call SDA_Bajo ; Envía el bit de reconocimiento ACK
  159. ; porque todavía no es el último byte a leer.
  160. call SCL_AltaImpedancia ; Pulso en alto del SCL para transmitir el
  161. call Retardo_4micros ; bit ACK de reconocimiento. Este es tHIGH.
  162. call SCL_Bajo ; Pulso de bajada del SCL.
  163. call Retardo_4micros
  164. movf I2C_Dato,W ; El resultado se manda en el registro de
  165. return ; de trabajo W.
  166.  
  167.  

La EEPROM 24LC256.

Código
  1. ;**************************** Librería "M24LC256.INC"
  2. ;
  3. ; Estas subrutinas permiten realizar las tareas de manejo de la memoria EEPROM serie
  4. ; 24LC256 que transmite y recibe la información vía serie a través de un bus I2C.
  5. ;
  6. ; Subrutina "M24LC256_InicializaEscritura" ----------------------------------------------
  7. ;
  8. ; Prepara la memoria para iniciar su escritura a partir de la posición de memoria fijada
  9. ; por los registros:
  10. ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a escribir.
  11. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
  12.  
  13. CBLOCK
  14. M24LC256_AddressHigh ; Guarda el valor de la dirección de memoria a
  15. M24LC256_AddressLow ; escribir o leer.
  16. M24LC256_Dato
  17. ENDC
  18. ;
  19. M24LC256_DIR_ESCRITURA EQU b'10100000'; Dirección de la memoria 24LC256 para
  20. M24LC256_DIR_LECTURA EQU b'10100001'; escritura y lectura respectivamente.
  21.  
  22. M24LC256_InicializaEscritura
  23. call I2C_EnviaStart ; Envía condición de Start.
  24. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
  25. call I2C_EnviaByte ; esclavo.
  26. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
  27. call I2C_EnviaByte ; registros M24LC256_AddressHigh y
  28. movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
  29. call I2C_EnviaByte
  30. return
  31.  
  32. ; Subrutina "M24LC256_InicializaLectura" ------------------------------------------------
  33. ;
  34. ; Prepara la memoria para iniciar su lectura a partir de la posición de memoria fijada
  35. ; por los registros:
  36. ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a leer.
  37. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
  38.  
  39. M24LC256_InicializaLectura
  40. bcf I2C_UltimoByteLeer ; Todavía no ha comenzado a leer ningún dato.
  41. call I2C_EnviaStart ; Envía condición de Start.
  42. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
  43. call I2C_EnviaByte ; esclavo.
  44. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
  45. call I2C_EnviaByte ; registros M24LC256_AddressHigh y
  46. movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
  47. call I2C_EnviaByte
  48. call I2C_EnviaStop
  49. ;
  50. call I2C_EnviaStart ; Envía condición de Start.
  51. movlw M24LC256_DIR_LECTURA ; Indica a la memoria 24LC256 que va a
  52. call I2C_EnviaByte ; proceder a la lectura.
  53. return
  54.  
  55. ; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
  56. ;
  57. ; Lee el mensaje grabado en la memoria 24LC256 y lo visualiza en la pantalla del módulo LCD.
  58. ; En el registro de trabajo W se introduce la página de la memoria a partir de cuya primera
  59. ; posición se va a leer. La lectura termina cuando encuentre el código 0x00. Así por ejemplo,
  60. ; si (W)=2Fh lee el mensaje que comienza en la posición 0 de la página 2Fh de la memoria,
  61. ; que es la posición 2F00h absoluta.
  62. ;
  63. CBLOCK
  64. ; M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
  65. ENDC
  66.  
  67. ;M24LC256_Mensaje_a_LCD
  68. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  69. clrf M24LC256_AddressLow
  70. call M24LC256_InicializaLectura
  71. M24LC256_LeeOtroByte
  72. call I2C_LeeByte ; Lee la memoria 24LC256.
  73. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  74. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  75. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  76. goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
  77. movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
  78. call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
  79. incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
  80. goto M24LC256_LeeOtroByte
  81. ;M24LC256_FinMensaje
  82. ; call M24LC_256_FinalizaLectura
  83. ; return
  84.  
  85. ; Subrutina "M24LC256_FinalizaLectura" ------------------------------------------------
  86. ;
  87. ; Activa el bit I2C_UltimoByteLeer para que la subrutina I2C_LeeByte ponga en alta
  88. ; impedancia la línea SDA y pueda ejecutarse posteriormente la condición de Start o Stop
  89. ; que fija el protocolo del bus I2C.
  90.  
  91. M24LC256_FinalizaLectura
  92. bsf I2C_UltimoByteLeer ; Con estas dos instrucciones se pone en
  93. call I2C_LeeByte ; alta impedancia la línea SDA. No importa el
  94. call I2C_EnviaStop ; resultado de la lectura realizada.
  95. return
  96.  
  97. ; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
  98. ;
  99. ; Lee un mensaje grabado en la memoria 24LC256 y lo visualiza por el módulo LCD. En caso que
  100. ; sea más largo que la longitud de la pantalla se desplaza hacia la izquierda con sensación
  101. ; de movimiento. En el registro de trabajo W se introduce la página de la memoria a partir
  102. ; de cuya primera posición va a leer. La visualización termina cuando encuentre el código
  103. ; 0x00. Así por ejemplo si (W)= 2Fh lee el mensaje que comienza en la posición 0 de la
  104. ; página 2Fh de la memoria, que es la posición 2F00h absoluta.
  105. ;
  106. CBLOCK
  107. M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
  108. M24LC256_CursorPosicion
  109. ENDC
  110.  
  111. M24LC256_Mensaje_a_LCD
  112. bcf I2C_UltimoByteLeer
  113. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  114. clrf M24LC256_AddressLow
  115. call M24LC256_InicializaLectura
  116. M24LC256_PrimeraPosicion
  117. clrf M24LC256_CursorPosicion ; El cursor en la posición 0 de la línea.
  118. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y
  119. M24LC256_VisualizaCaracter ; borra la pantalla.
  120. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?
  121. subwf M24LC256_CursorPosicion,W
  122. btfss STATUS,C
  123. goto M24LC256_NoEsFinalLinea
  124. M24LC256_EsFinalLinea
  125. call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.
  126. call Retardo_200ms
  127. call M24LC256_FinalizaLectura
  128. incf M24LC256_AddressLow,F
  129. call M24LC256_InicializaLectura
  130. goto M24LC256_PrimeraPosicion
  131. M24LC256_NoEsFinalLinea
  132. call I2C_LeeByte ; Obtiene el ASCII del carácter apuntado.
  133. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  134. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  135. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  136. goto M24LC256_FinMensaje ; de mensaje, sale fuera.
  137. M24LC256_NoUltimoCaracter
  138. call LCD_Caracter ; Visualiza el carácter ASCII leído.
  139. incf M24LC256_CursorPosicion,F ; Contabiliza el incremento de posición del
  140. ; cursor en la pantalla.
  141. goto M24LC256_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter
  142. M24LC256_FinMensaje ; de la línea.
  143. call M24LC256_FinalizaLectura
  144. return
  145.  

Si lo deseas, te paso los archivos completos con esquema Proteus por e-mail. No encuentro la manera de que me funcione, a lo mejor es eso del puerto que lo tengo enanalógico y no lo se.

Saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 5 Septiembre 2010, 22:43 pm
Me parece que la configuración de los puertos es correcta.

Ahora bien, las resistencias de pull-up de 4k7 cámbialas por resistencias especiales de PULLUP (las hay especiales para pullup en proteus). Pruébalo así y me cuentas.

              Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 5 Septiembre 2010, 22:59 pm
Me parece que la configuración de los puertos es correcta.

Ahora bien, las resistencias de pull-up de 4k7 cámbialas por resistencias especiales de PULLUP (las hay especiales para pullup en proteus). Pruébalo así y me cuentas.

              Saludos.

1) ¿Quieres decir que si lo monto en prpotoboard a lo mejor funciona aunque ne Proteus no?

2) ¿Lo del PullUP te refieres las resistencias internas del PIC? No creo, porque se necesitan externas.

3) Si te refieres otras resistencias que no son las que puse pues, ni idea esas resistencias especiales. Aún así gracias y voy a investigar.

(http://r.i.elhacker.net/cache?url=http://www.subeimagenes.com/img/lcd-fallos-1626.jpg)

Ya encontré las resistencia PULLUP.
(http://www.subeimagenes.com/img/lcd-pull-1627.jpg)

No veo cambios.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 5 Septiembre 2010, 23:26 pm
¿Cómo le grabaste los datos iniciales a la 24lc256?

Yo probé tu código en un pic16f876a y sí me funciona. Pero le cargo un archivo a la memoria 24lc256.

Primero visualiza un mensaje y después puros cuadros porque ya éstá vacía.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 5 Septiembre 2010, 23:30 pm
Así es como es, funciona como dices. A lo mejor no me funciona porque uso el oscilador interno.

Código
  1. LIST        P=16F886
  2.    INCLUDE        <P16F886.INC>
  3.    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
  4.    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  5.  

Juraría que lo programé a 4 MHz interno. Si tengo problemas le meteré el externo.

Edito:

Lo acaba de probar con el oscilador externo y me pasa lo mismo con o sin el pullup, las resistencias especiales.

¿Puedes pasarme el esquema del 16F876A para probarlo?

metaconta@BÓRRAMEgmail.com

Gracias.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 6 Septiembre 2010, 00:19 am
Una pregunta:

 ¿Con todo y BÓRRAME?


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 6 Septiembre 2010, 01:14 am
Una pregunta:

 ¿Con todo y BÓRRAME?

Lo de bórrame es porque no es bueno dejar tu e-mail por foros ya que los robots de buscadores lo registran en sus bases de datos y lo que conseguirás es que no te llegue SPAM en tus correos. Si metes algo entre la @, como BÓRRAMEgmail.com no existe, no te cogerán.


Una cosa que no entiendo, probé tu esquema y me falta un archivo.bin. No lo tengo, pero puse uno mio. Me aparece un pensaje con el 16F876A "Hola a todos" si en la EEPROM 24LC256 no he puesto ese mensaje. Que cosa más rara.

Cambio otra vez el .bin del 24LC256 y me parace otra vez el "Hola a todos" que no lo veo ni en el código fuente.

¿Esto es normal?

En mi caso porbando el 16F886 no lee nada.

(http://r.i.elhacker.net/cache?url=http://www.subeimagenes.com/img/lcd-ventanas-1632.jpg)

Ya se como se sacan esas ventanas.

Parace que el mensaje "Hola a todos" lo sacaste de la EEPROM interna del propio PIC que el externo 24LC256. En el .asm no aparace nada de la EEPROM interna. Pongo dentro del 24LC256 en tu esquema y el mio, no consigo que lo lean. ejejje.

A lo mejor si monto el PIC en la protoboard capaz que funcione. Debo comprar el PIC primero.

Muchas gracias.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 6 Septiembre 2010, 01:41 am
En el menú Debug puedes activar esas ventanas.

Sólo seleccionas Debug > PIC CPU (o algo así) y activas las ventanas para ver el código del micro (para ello debes cargar el archivo .COF en vez del .HEX).

"Hola a todos" es el mensaje que le dejé guardado de mi archivo .bin. Si quieres cambiárselo tienes que dar click en Debug > Reset persistent model data para que se borre ese contenido.

Si tienes alguna duda sigo a tus órdenes. Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 6 Septiembre 2010, 02:09 am
Hola:

Me funciona en el PIC16F876A que me diste. Todo perfecto ahora. (Dominas mucho el tema del Proteus y asm).

No me funciona con el 16F886. Te lo envío por correo por si acaso. Le cambié cosillas simples. (Ya está).


(http://r.i.elhacker.net/cache?url=http://www.subeimagenes.com/img/lcd-eeprom1-1634.jpg)

En mi ejemplo no viene nada de la EEPROM externa. ¿Por qué?
Lo habré conectado mal sin saber o no me he dado cuenta y tengo algo mal.
Por alguna razón no se puede mostrar como el ejemplo que me diste.

(http://r.i.elhacker.net/cache?url=http://www.subeimagenes.com/img/led-eeprom2-1635.jpg)

Saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 6 Septiembre 2010, 02:14 am
Con la novedad de que no tengo la versión más nueva de Proteus. ¿Me podrías enviar el instalador? (Si no es molestia)

           Buen día.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 6 Septiembre 2010, 02:50 am
Buenas:

Mira el correo.

Si no has mirado las imágenes ya que edité mira otra vez aquí.
http://foro.elhacker.net/electronica/resolver_problemas_con_tablas_6_bits-t303856.0.html;msg1508986#msg1508986

Guía instalar Proteus en Win 7
http://ib-electronic.com/index-6-como%20instalar%20proteus%20en%20Win7.html

Saludo.

EDITO:

Yas me funciiona, gracias. No hay que marcar nada por aquí, ejeje.
(http://www.subeimagenes.com/img/lcd-funciona-1637.jpg)


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 6 Septiembre 2010, 03:34 am
¡Vaya! La verdad que yo nunca me había fijado en Exclude from simulation.

Que bueno que ya funciona. Nos vemos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 6 Septiembre 2010, 04:02 am
Todo esto es gracias a ti.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 8 Septiembre 2010, 12:50 pm
Hola de nuevo:

Al ejecutar este código. Se me repite el mismo mensaje por todo el LCD. ¿Hay un amanera de ponerle STOP en el mensaje? Porque cada vez que lee el ciclo del goto en la configuración 0, pasa esto.

Código
  1. ; ZONA DE DATOS **********************************************************************
  2.  
  3. TITLE "LCD Sensor PS2"
  4. SUBTITLE "Revisión 1.00"
  5. LIST P=16F886
  6. INCLUDE <P16F886.INC>
  7. __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
  8. __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
  9.  
  10. CBLOCK 0x20
  11. Contador
  12. Apuntador
  13. ENDC
  14.  
  15. PAGINA_00 EQU 0x00 ;
  16. PAGINA_01 EQU 0x01 ;
  17. PAGINA_02 EQU 0x02 ;
  18. PAGINA_03 EQU 0x03 ;
  19. PAGINA_04 EQU 0x04 ;
  20. PAGINA_05 EQU 0x05 ;
  21. PAGINA_06 EQU 0x06 ;
  22. PAGINA_07 EQU 0x07 ;
  23. PAGINA_09 EQU 0x09 ; "                    " Línea .
  24. PAGINA_0A EQU 0x0A ; "                    " Línea .
  25. PAGINA_0B EQU 0x0B ; "                    " Línea .
  26. PAGINA_0C EQU 0x0C ; "                    " Línea .
  27. PAGINA_0D EQU 0x0D ; "                    " Línea .
  28. PAGINA_0E EQU 0x0E ; "                    " Línea .
  29. PAGINA_0D EQU 0x0D ; "                    " Línea .
  30. PAGINA_0F EQU 0x0F ; "                    "
  31.  
  32. #DEFINE RESET_RC0 PORTC,0
  33. #DEFINE EJECT_RC1 PORTC,1
  34. #DEFINE OPEN_RC2 PORTC,2
  35. #DEFINE CLOSE_RC3 PORTC,3
  36. #DEFINE GREEN_RC4 PORTC,4
  37. #DEFINE RED_RC5 PORTC,5
  38. #DEFINE Auxiliar_6 PORTC,6
  39. #DEFINE Auxiliar_7 PORTC,7
  40.  
  41. ; ZONA DE CÓDIGOS ********************************************************************
  42.  
  43. ORG 0 ; El programa comienza en la dirección 0.
  44.  
  45. Inicio
  46. call LCD_Inicializa
  47. BANKSEL TRISC ; Banco 1.
  48. bsf RESET_RC0 ; Se configura como entradas.
  49. bsf EJECT_RC1
  50. bsf OPEN_RC2
  51. bsf CLOSE_RC3
  52. bsf GREEN_RC4
  53. bsf RED_RC5
  54. bsf Auxiliar_6
  55. bsf Auxiliar_7
  56. BANKSEL PORTC ; Banco 0.
  57. clrw
  58. clrf Apuntador ; Inicializa el contador
  59. Principal
  60. movlw PAGINA_01
  61. call M24LC256_Mensaje_a_LCD
  62. call Retardo_2s
  63. goto Principal
  64.  
  65. movf PORTC,W ; Lee los sensores.
  66. andlw b'00111111' ; Máscara para quedarse con el valor de los sensores.
  67. addwf PCL,F ; Salta a la configuración adecuada.
  68. goto Configuracion0 ; 0 0 0 0 0 0
  69. goto Configuracion1 ; 0 0 0 0 0 1
  70. goto Configuracion2 ; 0 0 0 0 1 0
  71. goto Configuracion3 ; 0 0 0 0 1 1
  72. goto Configuracion4 ; 0 0 0 1 0 0
  73. goto Configuracion5 ; 0 0 0 1 0 1
  74. goto Configuracion6 ; 0 0 0 1 1 0
  75. goto Configuracion7 ; 0 0 0 1 1 1
  76. goto Configuracion8 ; 0 0 1 0 0 0
  77. goto Configuracion9 ; 0 0 1 0 0 1
  78. goto Configuracion10 ; 0 0 1 0 1 0
  79. goto Configuracion11 ; 0 0 1 0 1 1
  80. goto Configuracion12 ; 0 0 1 1 0 0
  81. goto Configuracion13 ; 0 0 1 1 0 1
  82. goto Configuracion14 ; 0 0 1 1 1 0
  83. goto Configuracion15 ; 0 0 1 1 1 1
  84. goto Configuracion16 ; 0 1 0 0 0 0
  85. goto Configuracion17 ; 0 1 0 0 0 1
  86. goto Configuracion18 ; 0 1 0 0 1 0
  87. goto Configuracion19 ; 0 1 0 0 1 1
  88. goto Configuracion20 ; 0 1 0 1 0 0
  89. goto Configuracion21 ; 0 1 0 1 0 1
  90. goto Configuracion22 ; 0 1 0 1 1 0
  91. goto Configuracion23 ; 0 1 0 1 1 1
  92. goto Configuracion24 ; 0 1 1 0 0 0
  93. goto Configuracion25 ; 0 1 1 0 0 1
  94. goto Configuracion26 ; 0 1 1 0 1 0
  95. goto Configuracion27 ; 0 1 1 0 1 1
  96. goto Configuracion28 ; 0 1 1 1 0 0
  97. goto Configuracion29 ; 0 1 1 1 0 1
  98. goto Configuracion30 ; 0 1 1 1 1 0
  99. goto Configuracion31 ; 0 1 1 1 1 1
  100. goto Configuracion32 ; 1 0 0 0 0 0
  101. goto Configuracion33 ; 1 0 0 0 0 1
  102. goto Configuracion34 ; 1 0 0 0 1 0
  103. goto Configuracion35 ; 1 0 0 0 1 1
  104. goto Configuracion36 ; 1 0 0 1 0 0
  105. goto Configuracion37 ; 1 0 0 1 0 1
  106. goto Configuracion38 ; 1 0 0 1 1 0
  107. goto Configuracion39 ; 1 0 0 1 1 1
  108. goto Configuracion40 ; 1 0 1 0 0 0
  109. goto Configuracion41 ; 1 0 1 0 0 1
  110. goto Configuracion42 ; 1 0 1 0 1 0
  111. goto Configuracion43 ; 1 0 1 0 1 1
  112. goto Configuracion44 ; 1 0 1 1 0 0
  113. goto Configuracion45 ; 1 0 1 1 0 1
  114. goto Configuracion46 ; 1 0 1 1 1 0
  115. goto Configuracion47 ; 1 0 1 1 1 1
  116. goto Configuracion48 ; 1 1 0 0 0 0
  117. goto Configuracion49 ; 1 1 0 0 0 1
  118. goto Configuracion50 ; 1 1 0 0 1 0
  119. goto Configuracion51 ; 1 1 0 0 1 1
  120. goto Configuracion52 ; 1 1 0 1 0 0
  121. goto Configuracion53 ; 1 1 0 1 0 1
  122. goto Configuracion54 ; 1 1 0 1 1 0
  123. goto Configuracion55 ; 1 1 0 1 1 1
  124. goto Configuracion56 ; 1 1 1 0 0 0
  125. goto Configuracion57 ; 1 1 1 0 0 1
  126. goto Configuracion58 ; 1 1 1 0 1 0
  127. goto Configuracion59 ; 1 1 1 0 1 1
  128. goto Configuracion60 ; 1 1 1 1 0 0
  129. goto Configuracion61 ; 1 1 1 1 0 1
  130. goto Configuracion62 ; 1 1 1 1 1 0
  131. goto Configuracion63 ; 1 1 1 1 1 1
  132. Configuracion0
  133. movlw PAGINA_00 ; Lee a partir de la dirección 00 de esta página
  134. call M24LC256_Mensaje_a_LCD ; de la memoria.
  135. goto ActivaSalida
  136. Configuracion1
  137. goto ActivaSalida
  138. Configuracion2
  139. goto ActivaSalida
  140. Configuracion3
  141. goto ActivaSalida
  142. Configuracion4
  143. goto ActivaSalida
  144. Configuracion5
  145. goto ActivaSalida
  146. Configuracion6
  147. goto ActivaSalida
  148. Configuracion7
  149. goto ActivaSalida
  150. Configuracion8
  151. goto ActivaSalida
  152. Configuracion9
  153. goto ActivaSalida
  154. Configuracion10
  155. goto ActivaSalida
  156. Configuracion11
  157. goto ActivaSalida
  158. Configuracion12
  159. goto ActivaSalida
  160. Configuracion13
  161. goto ActivaSalida
  162. Configuracion14
  163. goto ActivaSalida
  164. Configuracion15
  165. goto ActivaSalida
  166. Configuracion16
  167. goto ActivaSalida
  168. Configuracion17
  169. goto ActivaSalida
  170. Configuracion18
  171. goto ActivaSalida
  172. Configuracion19
  173. goto ActivaSalida
  174. Configuracion20
  175. goto ActivaSalida
  176. Configuracion21
  177. goto ActivaSalida
  178. Configuracion22
  179. goto ActivaSalida
  180. Configuracion23
  181. goto ActivaSalida
  182. Configuracion24
  183. goto ActivaSalida
  184. Configuracion25
  185. goto ActivaSalida
  186. Configuracion26
  187. goto ActivaSalida
  188. Configuracion27
  189. goto ActivaSalida
  190. Configuracion28
  191. goto ActivaSalida
  192. Configuracion29
  193. goto ActivaSalida
  194. Configuracion30
  195. goto ActivaSalida
  196. Configuracion31
  197. goto ActivaSalida
  198. Configuracion32
  199. goto ActivaSalida
  200. Configuracion33
  201. goto ActivaSalida
  202. Configuracion34
  203. goto ActivaSalida
  204. Configuracion35
  205. goto ActivaSalida
  206. Configuracion36
  207. goto ActivaSalida
  208. Configuracion37
  209. goto ActivaSalida
  210. Configuracion38
  211. goto ActivaSalida
  212. Configuracion39
  213. goto ActivaSalida
  214. Configuracion40
  215. goto ActivaSalida
  216. Configuracion41
  217. goto ActivaSalida
  218. Configuracion42
  219. goto ActivaSalida
  220. Configuracion43
  221. goto ActivaSalida
  222. Configuracion44
  223. goto ActivaSalida
  224. Configuracion45
  225. goto ActivaSalida
  226. Configuracion46
  227. goto ActivaSalida
  228. Configuracion47
  229. goto ActivaSalida
  230. Configuracion48
  231. goto ActivaSalida
  232. Configuracion49
  233. goto ActivaSalida
  234. Configuracion50
  235. goto ActivaSalida
  236. Configuracion51
  237. goto ActivaSalida
  238. Configuracion52
  239. goto ActivaSalida
  240. Configuracion53
  241. goto ActivaSalida
  242. Configuracion54
  243. goto ActivaSalida
  244. Configuracion55
  245. goto ActivaSalida
  246. Configuracion56
  247. goto ActivaSalida
  248. Configuracion57
  249. goto ActivaSalida
  250. Configuracion58
  251. goto ActivaSalida
  252. Configuracion59
  253. goto ActivaSalida
  254. Configuracion60
  255. goto ActivaSalida
  256. Configuracion61
  257. goto ActivaSalida
  258. Configuracion62
  259. goto ActivaSalida
  260. Configuracion63
  261. goto ActivaSalida
  262. ActivaSalida
  263. ; movwf PORTB
  264. goto Principal
  265.  
  266. ;
  267. ; "Mensajes" ----------------------------------------------------------------------------
  268. ;
  269. Mensajes
  270. addwf PCL,F
  271. Mensaje1
  272. DT "aaaaaaaaaaaaaaaaaaaa", 0x00
  273. Mensaje2
  274. DT "bbbbbbbbbbbbbbbbbbbb", 0x00
  275. Mensaje3
  276. DT "cccccccccccccccccccc", 0x00
  277. Mensaje4
  278. DT "dddddddddddddddddddd", 0x00
  279. Mensaje5
  280. DT "e", 0x00
  281. Mensaje6
  282. DT "M", 0x00
  283. Mensaje7
  284. DT "S", 0x00
  285. Mensaje8
  286. DT "M", 0x00
  287. ;
  288.  
  289. FinTabla
  290. ;MensajeAnuncio
  291. ; DT " fgfd ", 0x00
  292.  
  293. IF (FinTabla > 0xFF)
  294. ERROR "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
  295. MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
  296. ENDIF
  297.  
  298. INCLUDE <BIN_BCD.INC>
  299. INCLUDE  <BUS_I2C.INC> ; Subrutinas de control del bus I2C.
  300. INCLUDE  <M24LC256.INC> ; Subrutinas de control de la memoria 24LC256.
  301. INCLUDE  <LCD_4BIT.INC>
  302. INCLUDE  <LCD_MENS.INC>
  303. INCLUDE  <RETARDOS.INC>
  304. END

Un cordial saludo.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 8 Septiembre 2010, 20:03 pm
Hola, Meta:

¿Estas seguro que el mensaje guardado en la EEPROM 24lc256 termina en 0 (Me refiero al valor 0 y no al ascii '0')?

La rutina de mensaje a LCD busca el valor 0 para finalizar.

          Nos vemos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 8 Septiembre 2010, 21:50 pm
Hello:

Segurísimo, el 0 lo he puesto en la parte hexadecimal (0x00), no en la parte ASCII (0) del winpic800.

La parte modificada de esta librería. Ya que se me retaban los mensajes. Aunque no lo hay amodificado se comporta igual.

Código
  1. ;**************************** Librería "M24LC256.INC" ***********************************
  2. ;
  3.  
  4. ;
  5. ; Estas subrutinas permiten realizar las tareas de manejo de la memoria EEPROM serie
  6. ; 24LC256 que transmite y recibe la información vía serie a través de un bus I2C.
  7. ;
  8. ; Subrutina "M24LC256_InicializaEscritura" ----------------------------------------------
  9. ;
  10. ; Prepara la memoria para iniciar su escritura a partir de la posición de memoria fijada
  11. ; por los registros:
  12. ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a escribir.
  13. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
  14.  
  15. CBLOCK
  16. M24LC256_AddressHigh ; Guarda el valor de la dirección de memoria a
  17. M24LC256_AddressLow ; escribir o leer.
  18. M24LC256_Dato
  19. ENDC
  20. ;
  21. M24LC256_DIR_ESCRITURA EQU b'10100000'; Dirección de la memoria 24LC256 para
  22. M24LC256_DIR_LECTURA EQU b'10100001'; escritura y lectura respectivamente.
  23.  
  24. M24LC256_InicializaEscritura
  25. call I2C_EnviaStart ; Envía condición de Start.
  26. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
  27. call I2C_EnviaByte ; esclavo.
  28. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
  29. call I2C_EnviaByte ; registros M24LC256_AddressHigh y
  30. movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
  31. call I2C_EnviaByte
  32. return
  33.  
  34. ; Subrutina "M24LC256_InicializaLectura" ------------------------------------------------
  35. ;
  36. ; Prepara la memoria para iniciar su lectura a partir de la posición de memoria fijada
  37. ; por los registros:
  38. ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a leer.
  39. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
  40.  
  41. M24LC256_InicializaLectura
  42. bcf I2C_UltimoByteLeer ; Todavía no ha comenzado a leer ningún dato.
  43. call I2C_EnviaStart ; Envía condición de Start.
  44. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
  45. call I2C_EnviaByte ; esclavo.
  46. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
  47. call I2C_EnviaByte ; registros M24LC256_AddressHigh y
  48. movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
  49. call I2C_EnviaByte
  50. call I2C_EnviaStop
  51. ;
  52. call I2C_EnviaStart ; Envía condición de Start.
  53. movlw M24LC256_DIR_LECTURA ; Indica a la memoria 24LC256 que va a
  54. call I2C_EnviaByte ; proceder a la lectura.
  55. return
  56.  
  57. ; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
  58. ;
  59. ; Lee el mensaje grabado en la memoria 24LC256 y lo visualiza en la pantalla del módulo LCD.
  60. ; En el registro de trabajo W se introduce la página de la memoria a partir de cuya primera
  61. ; posición se va a leer. La lectura termina cuando encuentre el código 0x00. Así por ejemplo,
  62. ; si (W)=2Fh lee el mensaje que comienza en la posición 0 de la página 2Fh de la memoria,
  63. ; que es la posición 2F00h absoluta.
  64. ;
  65. CBLOCK
  66. M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
  67. ENDC
  68.  
  69. M24LC256_Mensaje_a_LCD
  70. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  71. clrf M24LC256_AddressLow
  72. call M24LC256_InicializaLectura
  73. M24LC256_LeeOtroByte
  74. call I2C_LeeByte ; Lee la memoria 24LC256.
  75. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  76. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  77. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  78. goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
  79. movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
  80. call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
  81. incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
  82. goto M24LC256_LeeOtroByte
  83. M24LC256_FinMensaje
  84. call M24LC256_FinalizaLectura
  85. return
  86.  
  87. ; Subrutina "M24LC256_FinalizaLectura" ------------------------------------------------
  88. ;
  89. ; Activa el bit I2C_UltimoByteLeer para que la subrutina I2C_LeeByte ponga en alta
  90. ; impedancia la línea SDA y pueda ejecutarse posteriormente la condición de Start o Stop
  91. ; que fija el protocolo del bus I2C.
  92.  
  93. M24LC256_FinalizaLectura
  94. bsf I2C_UltimoByteLeer ; Con estas dos instrucciones se pone en
  95. call I2C_LeeByte ; alta impedancia la línea SDA. No importa el
  96. call I2C_EnviaStop ; resultado de la lectura realizada.
  97. return
  98.  
  99. ; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
  100. ;
  101. ; Lee un mensaje grabado en la memoria 24LC256 y lo visualiza por el módulo LCD. En caso que
  102. ; sea más largo que la longitud de la pantalla se desplaza hacia la izquierda con sensación
  103. ; de movimiento. En el registro de trabajo W se introduce la página de la memoria a partir
  104. ; de cuya primera posición va a leer. La visualización termina cuando encuentre el código
  105. ; 0x00. Así por ejemplo si (W)= 2Fh lee el mensaje que comienza en la posición 0 de la
  106. ; página 2Fh de la memoria, que es la posición 2F00h absoluta.
  107. ;
  108. CBLOCK
  109. ; M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
  110. M24LC256_CursorPosicion
  111. ENDC
  112.  
  113. ;M24LC256_Mensaje_a_LCD
  114. bcf I2C_UltimoByteLeer
  115. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  116. clrf M24LC256_AddressLow
  117. call M24LC256_InicializaLectura
  118. M24LC256_PrimeraPosicion
  119. clrf M24LC256_CursorPosicion ; El cursor en la posición 0 de la línea.
  120. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y
  121. M24LC256_VisualizaCaracter ; borra la pantalla.
  122. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?
  123. subwf M24LC256_CursorPosicion,W
  124. btfss STATUS,C
  125. goto M24LC256_NoEsFinalLinea
  126. M24LC256_EsFinalLinea
  127. call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.
  128. call Retardo_200ms
  129. call M24LC256_FinalizaLectura
  130. incf M24LC256_AddressLow,F
  131. call M24LC256_InicializaLectura
  132. goto M24LC256_PrimeraPosicion
  133. M24LC256_NoEsFinalLinea
  134. call I2C_LeeByte ; Obtiene el ASCII del carácter apuntado.
  135. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  136. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  137. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  138. goto M24LC256_FinMensaje ; de mensaje, sale fuera.
  139. M24LC256_NoUltimoCaracter
  140. call LCD_Caracter ; Visualiza el carácter ASCII leído.
  141. incf M24LC256_CursorPosicion,F ; Contabiliza el incremento de posición del
  142. ; cursor en la pantalla.
  143. goto M24LC256_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter
  144. ;M24LC256_FinMensaje ; de la línea.
  145. ; call M24LC256_FinalizaLectura
  146. ; return
  147.  
  148. ; -----------------------------------------------------------------------------------------
  149.  
  150.  


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 8 Septiembre 2010, 23:48 pm
Meta:

Acabo de probar tu código y me funciona bien.

Asegúrate de dar click en Debug > Reset Persistent Model Data para que se borre lo que tenía la 24lc256 y se cargue el nuevo archivo .bin

             Hasta pronto.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 9 Septiembre 2010, 00:59 am
Hola:

Lo hago siempre tal como me enseñaste. (Contigo se aprende mucho).

Debe verse el código siempre en la primera línea del LCD. La cosa rara que hace es que al princpio se ve en la primera línea el mensaje, luego salta a la tercera, luego desplazado a la segunda y al final a la cuarta y vuelta a empezar pero con desplazamiento.

(http://www.subeimagenes.com/img/lcd-amigo-1883.jpg)

Sólo debe mostrarse en la primera línea "Hola amigo del foro", 0x00 (con su cero al final en hex).

Otra cosa que pasa, que cada vez le cuesta leer y tarda más en verse en el LCD. Ya que veo, hace un chequeo cada dos por tres en el puerto de entrada PORTC para detectar algún cambio y cambie de configuración. Como no cambia simpre lee el estado actual varias veces, pero no debería hacer cosas raras en el LCD.

¿Te voy a pasar el proyecto completo  otra vez por e-mail?



Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 9 Septiembre 2010, 02:17 am
Meta:

Envíame el archivo completo.

              Nos vemos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 9 Septiembre 2010, 03:08 am
Enviado.

Edito:

En la librería se usa el LCD a 16x2, en mi caso el 20x4. Quizás no sea igual la configuración. Me lo confirmas por si acaso.

Código
  1. LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres
  2. movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de
  3. ; goto LCD_EnviaComando ; 4 bits.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 9 Septiembre 2010, 14:23 pm
Esto de usar la EEPROM externas para cambiar de mensajes de avisos rápidamente no vale la pena. ¿Verdad?

A lo mejor es porque es muy lento.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 9 Septiembre 2010, 18:22 pm
Hola, Meta:

En verdad que esta vez sí tenías muchos errores. Te mencionaré unos pocos:

1. La rutina para enviar mensaje al LCD nunca borraba la pantalla. Por eso el mensaje ocupaba todo el LCD.

Aquí te pongo la subrutina corregida. Nota que la única diferencia es que esta vez sí se borra la pantalla.

Código
  1. M24LC256_Mensaje_a_LCD
  2. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  3. clrf M24LC256_AddressLow
  4. call M24LC256_InicializaLectura
  5. call LCD_Borra    ; Borra la pantalla.
  6. M24LC256_LeeOtroByte
  7. call I2C_LeeByte ; Lee la memoria 24LC256.
  8. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  9. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  10. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  11. goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
  12. movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
  13. call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
  14. incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
  15. goto M24LC256_LeeOtroByte
  16. M24LC256_FinMensaje
  17. call M24LC256_FinalizaLectura
  18. return

2. En tu programa principal tienes un bucle infinito:

Código
  1. Principal
  2. movlw PAGINA_00
  3. call M24LC256_Mensaje_a_LCD
  4. call Retardo_2s
  5. goto Principal

Si no lo quitas jamás vas a llegar a la zona de configuraciones (mejor, porque en la zona donde están las configuraciones tienes el error más grande).

3. En tu código tienes esto:

Código
  1. movf   PORTC,W
  2.   andlw   b'00111111'
  3.   addwf   PCL,F
  4.   call      Configuracion

Eso está bastante mal, porque la instrucción addwf   PCL,F es el encabezado de las configuraciones. Esa instrucción debería estar dentro de la subrutina Configuracion.

Código
  1. movf   PORTC,W
  2.   andlw   b'00111111'
  3.   call      Configuracion

Y dentro de la rutina Configuracion:

Código
  1. Configuracion
  2. addwf PCL,F   ; Aquí debe estar la instrucción addwf PCL,F.
  3. goto Configuracion0 ; 0 0 0 0 0 0
  4. goto Configuracion1 ; 0 0 0 0 0 1
  5. goto Configuracion2 ; 0 0 0 0 1 0
  6.                          .
  7.                          .
  8.                          .

4. Tu rutina Configuración nunca retorna (nunca ejecuta la instrucción return).

Lo que sucede es que en tu rutina Configuración pones instrucciones de brinco:

    goto   Configuracion0
    goto   Configuracíon1
          .
          .

y en las respectivas zonas de códigos ejecutas un goto al programa principal.

Código
  1. Configuracion1
  2.               goto ActivaSalida
  3.                       .
  4.                       .
  5.                       .
  6.          ActivaSalida
  7.                goto        Principal

Nunca ejecutas Return.

5. Por estética, es mejor que todos los elementos de una rutina estén todos en un mismo archivo. ¿Qué es lo que sucede con tu código?

La rutina Configuracion hace brincos (goto) hacia instrucciones que se encuentran en tu programa principal. Lo mejor es que esas instrucciones se encuentren también dentro del archivo de la subrutina de Cofiguracion.

En fín, te mandé al correo el programa corregido. Este sí debes revisarlo muy bien, porque le corregí muchas cosas.

Sigue echándole muchas ganas. Yo también empecé así. Me ocurrió casi de todo. He cometido casi todos los errores que se pueden cometer en ensamblador y es por eso que he podido resolver los tuyos.

                Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 10 Septiembre 2010, 04:21 am
Hola, Meta:

En verdad que esta vez sí tenías muchos errores. Te mencionaré unos pocos:

1. La rutina para enviar mensaje al LCD nunca borraba la pantalla. Por eso el mensaje ocupaba todo el LCD.

Aquí te pongo la subrutina corregida. Nota que la única diferencia es que esta vez sí se borra la pantalla.

Código
  1. M24LC256_Mensaje_a_LCD
  2. movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
  3. clrf M24LC256_AddressLow
  4. call M24LC256_InicializaLectura
  5. call LCD_Borra    ; Borra la pantalla.
  6. M24LC256_LeeOtroByte
  7. call I2C_LeeByte ; Lee la memoria 24LC256.
  8. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
  9. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
  10. btfsc STATUS,Z ; que sea "0x00", que es código indicador final
  11. goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
  12. movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
  13. call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
  14. incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
  15. goto M24LC256_LeeOtroByte
  16. M24LC256_FinMensaje
  17. call M24LC256_FinalizaLectura
  18. return

Si lo he hecho en el programa principal y lo he quitado, lo has hecho aquí. Hay que tener en cuenta una cosa. El LDC es de 20x4. Uso las 4 líneas independiente, es decir. En una goto de configuración puede salir un mensaje en la línea 1. Luego otra en la líena 4. Si borra el LCD completo, sólo se ve el último mensaje. Se tiene que ver las 4 líneas independiente. Para mi hay que usar la rutina "LCD_LineaEnBlanco", puede que no sea la adecuata, pero lo nombro por si acaso, debo hacer más pruebas hasta que me salga.

2. En tu programa principal tienes un bucle infinito:

Código
  1. Principal
  2. movlw PAGINA_00
  3. call M24LC256_Mensaje_a_LCD
  4. call Retardo_2s
  5. goto Principal

Si no lo quitas jamás vas a llegar a la zona de configuraciones (mejor, porque en la zona donde están las configuraciones tienes el error más grande).

Dejé ese bucle infinito adrede para hacer pruebas, lo que me olvidé quitarlos con ;.


3. En tu código tienes esto:

Código
  1. movf   PORTC,W
  2.   andlw   b'00111111'
  3.   addwf   PCL,F
  4.   call      Configuracion

Eso está bastante mal, porque la instrucción addwf   PCL,F es el encabezado de las configuraciones. Esa instrucción debería estar dentro de la subrutina Configuracion.

Código
  1. movf   PORTC,W
  2.   andlw   b'00111111'
  3.   call      Configuracion

Y dentro de la rutina Configuracion:

Código
  1. Configuracion
  2. addwf PCL,F   ; Aquí debe estar la instrucción addwf PCL,F.
  3. goto Configuracion0 ; 0 0 0 0 0 0
  4. goto Configuracion1 ; 0 0 0 0 0 1
  5. goto Configuracion2 ; 0 0 0 0 1 0
  6.                          .
  7.                          .
  8.                          .

Lo tendré en cuenta, sólo quería ahorrar espacio, mejor lo pongo en el programa principal otra vez.

4. Tu rutina Configuración nunca retorna (nunca ejecuta la instrucción return).

Lo que sucede es que en tu rutina Configuración pones instrucciones de brinco:

    goto   Configuracion0
    goto   Configuracíon1
          .
          .

y en las respectivas zonas de códigos ejecutas un goto al programa principal.

Código
  1. Configuracion1
  2.               goto ActivaSalida
  3.                       .
  4.                       .
  5.                       .
  6.          ActivaSalida
  7.                goto        Principal

Nunca ejecutas Return.

En los ejemplos del libro www.pic16f84a.org se usa sin el return. Los return se usa en subrutinas, es más aconsejable para que se sepa que si tienes un return, tienes un subrutina que el que lo llama es "call".

En realidad no hace falta los return, si hace falta se los pondré, ya que crees que hay que ponerlos. Recuerdo que en el libro jamás se usa un return en este tipo de tablas.


5. Por estética, es mejor que todos los elementos de una rutina estén todos en un mismo archivo. ¿Qué es lo que sucede con tu código?

La rutina Configuracion hace brincos (goto) hacia instrucciones que se encuentran en tu programa principal. Lo mejor es que esas instrucciones se encuentren también dentro del archivo de la subrutina de Cofiguracion.

En fín, te mandé al correo el programa corregido. Este sí debes revisarlo muy bien, porque le corregí muchas cosas.

Sigue echándole muchas ganas. Yo también empecé así. Me ocurrió casi de todo. He cometido casi todos los errores que se pueden cometer en ensamblador y es por eso que he podido resolver los tuyos.

                Saludos.

Lo voy a meter todo otra vez en el archivo principal. Los gotos. ;)

Gracias por la ayuda.

Hice cambios, puse los gotos otra vez en la primera página. Hice cosas que tocando el RC0 a 1, para que se muestre que el mensje 1 se vea en la primera línea, y si pulsas el RC0 otra vez, se muestre en la tercera línea del LCD pero se ve siempre en la primera.

Recuerda que cada entrade del LCD puede haber mensajes a la vez en diferentes líneas, no que se borre toda la pantalla y que se vea sola una línea por cada actualización. Esto de la EEPROM y asm es un poco infierno.

Gracias de nuevo por tu tiempo.
Te envío otra vez.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 10 Septiembre 2010, 20:13 pm
Hola, Meta:

Bien, para arreglar tus problemas con el LCD vamos a hacer lo siguiente:

Citar
Recuerda que cada entrade del LCD puede haber mensajes a la vez en diferentes líneas, no que se borre toda la pantalla y que se vea sola una línea por cada actualización. Esto de la EEPROM y asm es un poco infierno.

Para solucionar eso debes quitar de la subruitna "M24LC256_Mensaje_a_LCD" la instrucción que borra la pantalla (call   LCD_borra).

Bueno, hasta ahí se soluciona el problema de que se borre un mensaje al poner otro.

Ahora, debes tomar en cuenta otro aspecto importantísimo: para visualizar un mensaje en una línea determinada debes:

1. Colocar el cursor al principio de la línea correspondiente.
2. Visualizar espacios en blanco hasta que se llene la línea (es decir, borrar la línea).
3. Regresar el cursor al principio de esa línea.

Aquí te dejo las funciones que hacen eso para cada una de las líneas del LCD.

Código
  1. LCD_Linea1EnBlanco
  2. call LCD_Linea1   ; Sitúa el cursor al principio de la línea 1.
  3. call LCD_LineaEnBlanco  ; Borra la línea.
  4. call LCD_Linea1   ; Regresa el cursor al principio de la línea.
  5. return
  6.  
  7. LCD_Linea2EnBlanco    ; Similar que la anterior.
  8. call LCD_Linea2
  9. call LCD_LineaEnBlanco
  10. call LCD_Linea2
  11. return
  12.  
  13. LCD_Linea3EnBlanco   ; Similar que la anterior.
  14. call LCD_Linea3
  15. call LCD_LineaEnBlanco
  16. call LCD_Linea3
  17. return
  18.  
  19. LCD_Linea4EnBlanco   ; Similar que la anterior.
  20. call LCD_Linea4
  21. call LCD_LineaEnBlanco
  22. call LCD_Linea4
  23. return

Esas rutinas pégalas en tu archivo "LCD_4BIT.INC".

Siempre que quieras visualizar un mensaje en una línea determinada deberás llamar esas rutinas. Por ejemplo, en el caso de la Configuración0, sería algo más o menos así:

Código
  1. Configuracion0
  2.    call LCD_Linea1EnBlanco ; Borra la línea 1 y se sitúa al principio de dicha línea.
  3. movlw PAGINA_00   ; Lee a partir de la dirección 00 de esta página
  4. call M24LC256_Mensaje_a_LCD ; de la memoria.
  5. call Retardo_2s
  6. goto ActivaSalida

Hazlo así y te debería funcionar. Espero tus comentarios.

                 ¡¡¡Buen día!!!


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 11 Septiembre 2010, 06:06 am
Hola:

Pues no, no funciona, se comporta todo como desde el principio. Por lógica debería funcionar.

Código
  1. Principal
  2. movf PORTC,W ; Lee los sensores.
  3. andlw b'00111111' ; Máscara para quedarse con el valor de los sensores.
  4. addwf PCL,F ; Salta a la configuración adecuada.
  5. Configuracion0
  6. call LCD_Linea2EnBlanco
  7. movlw PAGINA_00 ; Lee a partir de la dirección 00 de esta página
  8. call M24LC256_Mensaje_a_LCD ; de la memoria.
  9. goto ActivaSalida
  10. Configuracion1
  11. call LCD_Linea4EnBlanco
  12. movlw PAGINA_01 ; Lee a partir de la dirección 01 de esta página
  13. call M24LC256_Mensaje_a_LCD ; de la memoria.
  14. goto ActivaSalida
  15.  

En l alibrería LCD_4BIT.INC he colocado las instrucciones que me dijiste.
Código
  1. LCD_Linea1EnBlanco
  2. call LCD_Linea1   ; Sitúa el cursor al principio de la línea 1.
  3. call LCD_LineaEnBlanco  ; Borra la línea.
  4. call LCD_Linea1   ; Regresa el cursor al principio de la línea.
  5. return
  6.  
  7. LCD_Linea2EnBlanco    ; Similar que la anterior.
  8. call LCD_Linea2
  9. call LCD_LineaEnBlanco
  10. call LCD_Linea2
  11. return
  12.  
  13. LCD_Linea3EnBlanco   ; Similar que la anterior.
  14. call LCD_Linea3
  15. call LCD_LineaEnBlanco
  16. call LCD_Linea3
  17. return
  18.  
  19. LCD_Linea4EnBlanco   ; Similar que la anterior.
  20. call LCD_Linea4
  21. call LCD_LineaEnBlanco
  22. call LCD_Linea4
  23. return
  24.  

Las cosas que debería funcionar por lógica a veces sorprende.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 11 Septiembre 2010, 18:00 pm
Mi buen Meta:

Te faltaron algunas intrucciones:

Código
  1.    movf   PORTC,W
  2.    andlw  b'00111111'
  3.    addwf  PCL,F
  4.    goto    Configuracion0   ; Te faltaron estas instrucciones.
  5.    goto    Configuracion1
  6.    goto    Configuracion2
  7.            .
  8.            .
  9.            .

Pero ya está corregido. Te lo envié por si las dudas.

             Saludos.


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Meta en 12 Septiembre 2010, 03:54 am
Que despiste.

Muchas gracias, voy hacer más pruebas, parece que ahora si funciona.

Saludo.

Edito:

Uffffffffffff, algo me impresiona y e decepciona el asm. Espero no recurrir al C18 o CCS por culpa de esta tontería.

He colocado los mensajes en las configuraciones de la EEPROM. Precisamente me sale este aviso:

Código
  1. IF (FinTabla > 0xFF)
  2. ERROR "&#161;CUIDADO!: La tabla ha superado el tama&#241;o de la p&#225;gina de los"
  3. MESSG "primeros 256 bytes de memoria ROM. NO funcionar&#225; correctamente."
  4. ENDIF
  5.  

He dejado de usar las tablas para no tener que cambiar de niveles, por eso uso la EEPROM y descubro que con o sin EEPROM externa me pasa lo mismo.

¿Al final debo usar el truco para superar los 256 bits por obligación aunque use la EEPROM externa?


Título: Re: Resolver problemas con tablas 6 bits.
Publicado por: Tokes en 13 Septiembre 2010, 04:45 am
Hola, Meta:

Me parece que los mensajes todavía los tienes en la programación ocupando espacio. Debes quitarlos, ya que no los ocupas puesto que ahora están en la 24LC256.

Si ya los quitaste, entonces la directiva IF FinTabla > 0xFF... debes ponerla después de los goto's, más o menos así:

Código
  1.   movf   PORTC,W
  2.   andlw  b'00111111'
  3.   addwf  PCL,F
  4.   goto    Configuracion0
  5.   goto    Configuracion1
  6.   goto    Configuracion2
  7.           .
  8.           .
  9.           .
  10.   goto    ConfiguracionX
  11. FinTabla
  12.  
  13.   IF (FinTabla > 0xFF)
  14.    ERROR "CUIDADO!: La tabla ha superado el tamaño de la página de los"
  15.   MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
  16.   ENDIF
  17.  
  18. Configuracion0
  19.    ; Código de la configuracion 0.
  20.  
  21. Configuracion1
  22.   ; Código de la configuracion 1.
  23.  
  24.         .
  25.         .
  26.         .
  27.  

Con respecto a lo de usar lenguaje C, pues te vendría mejor, ya que el compilador gestiona la memoria tanto de datos como de programa y no hay que seleccionar bancos ni páginas de programa como en ensamblador.

Si aún haciendo lo que te dije sigue marcando error, entonces sí debes usar el "truquito" para poner la tabla.

             Saludos.