Autor
|
Tema: Resolver problemas con tablas 6 bits. (Leído 20,787 veces)
|
Meta
|
Hola: Quiero hacer la tabla de 6 bits y me parece el error de los 256 bits usados. ¿Hay alguna manera de resolverlo? ; 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.
|
|
|
En línea
|
|
|
|
Tokes
Desconectado
Mensajes: 140
|
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: movf PORTA,W andlw b'00111111' addlw low(Tabla+.1) ; Suma el valor de desplazamiento con la dirección (Tabla + 1). movlw high(Tabla+.1) ; Obtiene el byte alto de la dirección (Tabla + 1). btfsc STATUS,C ; Si la suma de bytes bajos dió acarreo... addlw .1 ; lo suma al byte alto de la dirección (Tabla + 1) movwf PCLATH ; y lo carga en PCLATH para seleccionar la página correspondiente. movf PORTA,W ; Ahora llama la tabla normalmente. andlw b'00111111' 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.
|
|
« Última modificación: 3 Septiembre 2010, 18:09 pm por Tokes »
|
En línea
|
|
|
|
|
Tokes
Desconectado
Mensajes: 140
|
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. #include "p16f876a.inc" __config _XT_OSC & _PWRTE_ON & _LVP_OFF & _DEBUG_OFF & _WDT_OFF & _BODEN_OFF cblock 20h endc org 00h call LCD_Inicializa call LCD_Linea1 call LCD_LineaEnBlanco call LCD_Linea1 movlw MensajeHola call LCD_Mensaje call LCD_Linea2 call LCD_LineaEnBlanco call LCD_Linea2 movlw MensajeAmigos call LCD_Mensaje goto $ org .250 Mensajes addwf PCL,F MensajeHola dt "Hola a todos...",0 MensajeAmigos dt "Amigos mios...",0 INCLUDE "RETARDOS.INC" INCLUDE "LCD_4BIT.INC" INCLUDE "LCD_MENS.INC" 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: ;**************************** Librería "LCD_MENS.INC" ******************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; =================================================================== ; ; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD. CBLOCK LCD_ApuntaCaracter ; Indica la posición del carácter a visualizar ; respecto del comienzo de todos los mensajes, ; (posición de la etiqueta "Mensajes"). LCD_ValorCaracter ; Código ASCII del carácter a ENDC ; visualizar. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la ; memoria de programa, es decir, no pueden superar la dirección 0FFh. ; Subrutina "LCD_Mensaje" --------------------------------------------------------------- ; ; Visualiza por pantalla el mensaje apuntado por el registro W. ; ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que ; tenga la siguiente estructura: ; ; Mensajes ; ¡Etiqueta obligatoria! ; addwf PCL,F ; Mensaje0 ; Posición inicial del mensaje. ; DT ".. ..", 0x00 ; Mensaje terminado en 0x00. ; Mensaje1 ; ... ; ... ; FinMensajes ; ; La llamada a esta subrutina se realizará siguiendo este ejemplo: ; ; movlw Mensaje0 ; Carga la posición del mensaje. ; call LCD_Mensaje ; Visualiza el mensaje. ; LCD_Mensaje movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje. movlw Mensajes ; haya la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". LCD_VisualizaOtroCaracter movf LCD_ApuntaCaracter,W ; Modificado para evitar desvíos en el programa addlw low(Mensajes + .1) movlw high(Mensajes + .1) btfsc STATUS,C addlw .1 movwf PCLATH movf LCD_ApuntaCaracter,W ;... call Mensajes ; Obtiene el código ASCII del carácter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMensaje ; de mensaje, sale fuera. LCD_NoUltimoCaracter call LCD_Caracter ; Visualiza el carácter ASCII leído. incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter goto LCD_VisualizaOtroCaracter ; dentro del mensaje. LCD_FinMensaje return ; Vuelve al programa principal. ; Subrutina "LCD_MensajeMovimiento" ----------------------------------------------------- ; ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse ; en una línea, por tanto se desplaza a través de la pantalla. ; ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para ; conseguir que el desplazamiento del mensaje sea lo más legible posible. ; CBLOCK LCD_CursorPosicion ; Contabiliza la posición del cursor dentro de la ENDC ; pantalla LCD LCD_MensajeMovimiento movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje. movlw Mensajes ; haya la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". LCD_PrimeraPosicion clrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y LCD_VisualizaCaracter ; borra la pantalla. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea? subwf LCD_CursorPosicion,W btfss STATUS,Z goto LCD_NoEsFinalLinea LCD_EsFinalLinea call Retardo_200ms ; Lo mantiene visualizado durante este tiempo. call Retardo_200ms movlw LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizado subwf LCD_ApuntaCaracter,F ; en pantalla, que será el primero en la siguiente goto LCD_PrimeraPosicion ; visualización de línea, para producir el efecto LCD_NoEsFinalLinea ; de desplazamiento hacia la izquierda. movf LCD_ApuntaCaracter,W ; Modificado para evitar desvíos en el programa addlw low(Mensajes + .1) movlw high(Mensajes + .1) btfsc STATUS,C addlw .1 movwf PCLATH movf LCD_ApuntaCaracter,W ;... call Mensajes ; Obtiene el ASCII del carácter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMovimiento ; de mensaje, sale fuera. LCD_NoUltimoCaracter2 call LCD_Caracter ; Visualiza el carácter ASCII leído. incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del ; cursor en la pantalla. incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar. goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter LCD_FinMovimiento ; de la línea. return ; Vuelve al programa principal. ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. www.pic16f84a.com ; Editorial Ra-Ma. www.ra-ma.es ; ===================================================================
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: org 0 goto Inicio Tabla_1 addwf PCL,F retlw 0x33 retlw 0x68 . . Tabla_2 addwf PCL,F retlw 0x67 retlw 0x87 . . Mensajes addwf PCL,F Mensaje0 DT "MENSAJE NUM 0",0 Mensaje1 DT "MENSAJE NUM 1",0 . . Inicio call LCD_Inicializa movlw Mensaje0 . . INCLUDE "LCD_MENS.INC" INCLUDE "LCD_4BIT.INC" . . end
Espero te sea útil. Saludos.
|
|
« Última modificación: 3 Septiembre 2010, 21:58 pm por Tokes »
|
En línea
|
|
|
|
Meta
|
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. Ver mejor imagen.Descargar código fuente y esquema proteus. Si no pudes descargarlo, desde estar registrado. Saludo.
|
|
« Última modificación: 5 Septiembre 2010, 05:37 am por Meta »
|
En línea
|
|
|
|
Tokes
Desconectado
Mensajes: 140
|
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
|
|
|
En línea
|
|
|
|
Meta
|
Hola:
Espero que estén bien configuradas las entradas o salidas en digitales en vez de analógico. ; 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 Apuntador ENDC PAGINA EQU 0x00 ULTIMO_MENSAJE EQU .10 ; Señala el número del último mensaje. #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 clrf Apuntador ; Inicializa el contador Principal movf Apuntador,W ; Apunta al inicio de cada mensaje ya que esta call M24LC256_Mensaje_a_LCD ; subrutina lo carga en (M24LC256_AddressHigh). call Retardo_2s ; Visualiza el mensaje durante este tiempo. incf Apuntador,F ; Apunta al siguiente mensaje. movf Apuntador,W ; Comprueba si ha llegado al último mensaje. sublw ULTIMO_MENSAJE ; (W)=ULTIMO_MENSAJE-(Apuntador). btfss STATUS,C ; ¿C=1?, ¿(W) positivo? clrf Apuntador ; Ha resultado ULTIMO_MENSAJE<(Apuntador). goto 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 "aaaaaaaaaaaaaaaaaaaa", 0x00 Mensaje2 DT "bbbbbbbbbbbbbbbbbbbb", 0x00 Mensaje3 DT "cccccccccccccccccccc", 0x00 Mensaje4 DT "dddddddddddddddddddd", 0x00 Mensaje5 DT "e", 0x00 Mensaje6 DT "M", 0x00 Mensaje7 DT "S", 0x00 Mensaje8 DT "M", 0x00 ; FinTabla ;MensajeAnuncio ; DT " fgfd ", 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 <BIN_BCD.INC> INCLUDE <BUS_I2C.INC> ; Subrutinas de control del bus I2C. INCLUDE <M24LC256.INC> ; Subrutinas de control de la memoria 24LC256. INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END
Librería LCD_4BIT.INC por aquí configuro los puertos y espero que no estén en analógicos.;**************************** Librería "LCD_4BIT.INC" ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2 ; líneas por 16 caracteres, compatible con el modelo LM016L. ; ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las ; conexiones son: ; - Las 4 líneas superiores del módulo LCD, pines <DB7:DB4> se conectan a las 4 ; líneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; - Pin RS del LCD a la línea RA0 del PIC. ; - Pin R/W del LCD a la línea RA1 del PIC, o a masa. ; - Pin Enable del LCD a la línea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería ; RETARDOS.INC. ; ; ZONA DE DATOS ********************************************************************* CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU .20 ; Número de caracteres por línea de la pantalla. #DEFINE LCD_PinRS PORTB,0 #DEFINE LCD_PinRW PORTB,1 #DEFINE LCD_PinEnable PORTB,2 #DEFINE LCD_BusDatos PORTB ; Subrutina "LCD_Inicializa" ------------------------------------------------------------ ; ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software, ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la ; configuración inicial hay que hacerla como sigue: ; LCD_Inicializa BANKSEL ANSEL clrf ANSEL ; E/S Digitales. clrf ANSELH BANKSEL TRISB bcf LCD_PinRS ; R/W y E. bcf LCD_PinEnable bcf LCD_PinRW BANKSEL TRISA clrf TRISA clrf TRISB BANKSEL PORTA bcf LCD_PinRW ; En caso de que esté conectado le indica ; que se va a escribir en el LCD. bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0. bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0. call Retardo_20ms movlw b'00110000' call LCD_EscribeLCD ; Escribe el dato en el LCD. call Retardo_5ms movlw b'00110000' call LCD_EscribeLCD call Retardo_200micros movlw b'00110000' call LCD_EscribeLCD call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS. movlw b'00100000' ; Interface de 4 bits. call LCD_EscribeLCD call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS. ; Ahora configura el resto de los parámetros: call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos. call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio call LCD_CursorOFF ; de la línea 1. Cursor apagado. call LCD_CursorIncr ; Cursor en modo incrementar. return ; Subrutina "LCD_EscribeLCD" ----------------------------------------------------------- ; ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se ; vuelve a enviar este dato sin cambiarlo. LCD_EscribeLCD andlw b'11110000' ; Se queda con el nibble alto del dato que es el movwf LCD_Dato ; que hay que enviar y lo guarda. movf LCD_BusDatos,W ; Lee la información actual de la parte baja andlw b'00001111' ; del Puerto B, que no se debe alterar. iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada ; y en la parte baja lo que había antes. BANKSEL TRISB ; Acceso al Banco 1. movf TRISB,W ; Guarda la configuración que tenía antes TRISB. movwf LCD_GuardaTRISB movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan andwf PORTB,F ; como estaban y las 4 superiores como salida. BANKSEL PORTB ; Acceso al Banco 0. ; movf LCD_Dato,W ; Recupera el dato a enviar. movwf LCD_BusDatos ; Envía el dato al módulo LCD. bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD. BANKSEL TRISB ; Acceso al Banco 1. Restaura el antiguo valor en movf LCD_GuardaTRISB,W ; la configuración del Puerto B. movwf TRISB BANKSEL PORTB ; Acceso al Banco 0. return ; Subrutinas variadas para el control del módulo LCD ----------------------------------------- ; ;Los comandos que pueden ser ejecutados son: ; LCD_CursorIncr ; Cursor en modo incrementar. movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 ; Cursor al principio de la Línea 1. movlw b'10000000' ; Dirección 00h de la DDRAM goto LCD_EnviaComando LCD_Linea2 ; Cursor al principio de la Línea 2. movlw b'11000000' ; Dirección 40h de la DDRAM goto LCD_EnviaComando LCD_Linea3 ; Cursor al principio de la Línea 3 movlw b'10010100' ; Dirección 14h de la DDRAM goto LCD_EnviaComando LCD_Linea4 ; Cursor al principio de la Línea 4 movlw b'11010100' ; Dirección 54h de la DDRAM goto LCD_EnviaComando LCD_PosicionLinea1 ; Cursor a posición de la Línea 1, a partir de la iorlw b'10000000' ; dirección 00h de la DDRAM más el valor del goto LCD_EnviaComando ; registro W. LCD_PosicionLinea2 ; Cursor a posición de la Línea 2, a partir de la iorlw b'11000000' ; dirección 40h de la DDRAM más el valor del goto LCD_EnviaComando ; registro W. LCD_OFF ; Pantalla apagada. movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ; Pantalla encendida y cursor encendido. movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ; Pantalla encendida y cursor apagado. movlw b'00001100' goto LCD_EnviaComando LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el movlw b'00000001' ; cursor a principio de la línea 1. goto LCD_EnviaComando LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de ; goto LCD_EnviaComando ; 4 bits. ; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------ ; ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de ; comando ha sido entregada a través del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a ; a través del registro W. Trabaja en Modo Dato. ; LCD_EnviaComando bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0. goto LCD_Envia LCD_Caracter bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1. call LCD_CodigoCGROM ; Obtiene el código para correcta visualización. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. call LCD_EscribeLCD ; Primero envía el nibble alto. swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el ; nibble bajo del dato a enviar a parte alta del byte. call LCD_EscribeLCD ; Se envía al visualizador LCD. btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter. call Retardo_50micros return ; Subrutina "LCD_CodigoCGROM" ----------------------------------------------------------- ; ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh. ; ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que ; que puedan ser visualizado en el módulo LM016L. ; ; Entrada: En (W) el código ASCII del carácter que se desea visualizar. ; Salida: En (W) el código definido en la tabla CGROM. LCD_CodigoCGROM movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es LCD_EnheMinuscula ; un carácter especial. sublw 'ñ' ; ¿Es la "ñ"? btfss STATUS,Z goto LCD_EnheMayuscula ; No es "ñ". movlw b'11101110' ; Código CGROM de la "ñ". movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'Ñ' ; ¿Es la "Ñ"? btfss STATUS,Z goto LCD_Grado ; No es "Ñ". movlw b'11101110' ; Código CGROM de la "ñ". (No hay símbolo para movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM). goto LCD_FinCGROM LCD_Grado movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'º' ; ¿Es el símbolo "º"? btfss STATUS,Z goto LCD_FinCGROM ; No es "º". movlw b'11011111' ; Código CGROM del símbolo "º". movwf LCD_Dato LCD_FinCGROM movf LCD_Dato,W ; En (W) el código buscado. return ; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" -------------------------------- ; ; Visualiza espacios en blanco. LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw .1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw .2 goto LCD_EnviaBlancos LCD_TresEspaciosBlancos movlw .3 LCD_EnviaBlancos movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador. LCD_EnviaOtroBlanco movlw ' ' ; Esto es un espacio en blanco. call LCD_Caracter ; Visualiza tanto espacios en blanco como se decfsz LCD_Auxiliar1,F ; haya cargado en (LCD_Auxiliar1). goto LCD_EnviaOtroBlanco return ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" -------------------------------------------- ; ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE". ; ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE" ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante). ; ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante. ; LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada. andlw b'11110000' ; Analiza si el nibble alto es cero. btfss STATUS,Z ; Si es cero lo apaga. goto LCD_VisualizaAlto ; No es cero y lo visualiza. movlw ' ' ; Visualiza un espacio en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 ; Guarda el valor de entrada. LCD_VisualizaAlto swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja. call LCD_Nibble ; Lo visualiza. LCD_VisualizaBajo movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo. ; call LCD_Nibble ; Lo visualiza. ; return ; Subrutina "LCD_Nibble" ---------------------------------------------------------------- ; ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos: ; - Si (W)=b'01010110', se visualizará "6". ; - Si (W)=b'10101110', se visualizará "E". ; LCD_Nibble andlw b'00001111' ; Se queda con la parte baja. movwf LCD_Auxiliar1 ; Lo guarda. sublw 0x09 ; Comprueba si hay que representarlo con letra. btfss STATUS,C goto LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw '0' ; El número se pasa a carácter ASCII sumándole goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza. LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw 'A'-0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter ; Y visualiza el carácter. Se hace con un "goto" ; para no sobrecargar la pila.
El bus I2C también lo he modificado para el 16F886, espero que esté bien.;**************************** Librería "BUS_I2C.INC" ; ; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C, ; por parte de un solo microcontrolador maestro. ; ; ZONA DE DATOS ***************************** ; CBLOCK I2C_ContadorBits ; Cuenta los bits a transmitir o a recibir. I2C_Dato ; Dato a transmitir o recibido. I2C_Flags ; Guarda la información del estado del bus I2C. ENDC #DEFINE I2C_UltimoByteLeer I2C_Flags,0 ; - (I2C_UltimoByteLeer)=0, NO es el último byte a leer por el maestro. ; - (I2C_UltimoByteLeer)=1, SÍ es el último byte a leer por el maestro. ; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las ; necesidades del hardware. #DEFINE SCL PORTA,3 ; Línea SCL del bus I2C. #DEFINE SDA PORTA,4 ; Línea SDA del bus I2C. ; ; Subrutina "SDA_Bajo" ------------------------------------------------------------------ ; SDA_Bajo bcf STATUS,RP1 bsf STATUS,RP0 ; Configura la línea SDA como salida. bcf SDA bcf STATUS,RP1 bcf STATUS,RP0 bcf SDA ; SDA en bajo. return ; ; Subrutina "SDA_AltaImpedancia" -------------------------------------------------------- ; SDA_AltaImpedancia bcf STATUS,RP1 bsf STATUS,RP0 ; Configura la línea SDA entrada. bsf SDA ; Lo pone en alta impedancia y, gracias a la bcf STATUS,RP1 bcf STATUS,RP0 ; Rp de esta línea, se mantiene a nivel alto. return ; ; Subrutina "SCL_Bajo" ------------------------------------------------------------------ ; SCL_Bajo bcf STATUS,RP1 bsf STATUS,RP0 bcf SCL ; Configura la línea SCL como salida. bcf STATUS,RP1 bcf STATUS,RP0 bcf SCL ; La línea de reloj SCL en bajo. return ; ; Subrutina "SCL_AltaImpedancia" -------------------------------------------------------- ; SCL_AltaImpedancia bcf STATUS,RP1 bsf STATUS,RP0 ; Configura la línea SCL entrada. bsf SCL ; Lo pone en alta impedancia y, gracias a la Rp bcf STATUS,RP1 bcf STATUS,RP0 ; de esta línea, se mantiene a nivel alto. SCL_EsperaNivelAlto btfss SCL ; Si algún esclavo mantiene esta línea en bajo goto SCL_EsperaNivelAlto ; hay que esperar. return ; ; Subrutina "I2C_EnviaStart" ------------------------------------------------------------ ; ; Esta subrutina envía una condición de Start o inicio. ; I2C_EnviaStart call SDA_AltaImpedancia ; Línea SDA en alto. call SCL_AltaImpedancia ; Línea SCL en alto. call Retardo_4micros ; Tiempo tBUF del protocolo. call SDA_Bajo ; Flanco de bajada de SDA mientras SCL está alto. call Retardo_4micros ; Tiempo tHD;STA del protocolo. call SCL_Bajo ; Flanco de bajada del reloj SCL. call Retardo_4micros return ; ; Subrutina "I2C_EnviaStop" ------------------------------------------------------------- ; ; Esta subrutina envía un condición de Stop o parada. ; I2C_EnviaStop call SDA_Bajo call SCL_AltaImpedancia ; Flanco de subida de SCL. call Retardo_4micros ; Tiempo tSU;STO del protocolo. call SDA_AltaImpedancia ; Flanco de subida de SDA. call Retardo_4micros ; Tiempo tBUF del protocolo. return ; ; Subrutina "I2C_EnviaByte" ------------------------------------------------------------- ; ; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit ; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W. ; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte, ; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs. ; I2C_EnviaByte movwf I2C_Dato ; Almacena el byte a transmitir. movlw 0x08 ; A transmitir 8 bits. movwf I2C_ContadorBits I2C_EnviaBit rlf I2C_Dato,F ; Chequea el bit, llevándolo previamente al Carry. btfsc STATUS,C goto I2C_EnviaUno I2C_EnviaCero call SDA_Bajo ; Si es "0" envía un nivel bajo. goto I2C_FlancoSCL I2C_EnviaUno call SDA_AltaImpedancia ; Si es "1" lo activará a alto. I2C_FlancoSCL call SCL_AltaImpedancia ; Flanco de subida del SCL. call Retardo_4micros ; Tiempo tHIGH del protocolo. call SCL_Bajo ; Termina el semiperiodo positivo del reloj. call Retardo_4micros ; Tiempo tHD;DAT del protocolo. decfsz I2C_ContadorBits,F ; Lazo para los ocho bits. goto I2C_EnviaBit ; call SDA_AltaImpedancia ; Libera la línea de datos. call SCL_AltaImpedancia ; Pulso en alto de reloj para que el esclavo call Retardo_4micros ; pueda enviar el bit ACK. call SCL_Bajo call Retardo_4micros return ; ; Subrutina "I2C_LeeByte" --------------------------------------------------------------- ; ; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato ; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través ; del registro W. Se empieza a leer por el bit de mayor peso MSB. ; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte ; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs. I2C_LeeByte movlw 0x08 ; A recibir 8 bits. movwf I2C_ContadorBits call SDA_AltaImpedancia ; Deja libre la línea de datos. I2C_LeeBit call SCL_AltaImpedancia ; Flanco de subida del reloj. bcf STATUS,C ; En principio supone que es "0". btfsc SDA ; Lee el bit bsf STATUS,C ; Si es "1" carga 1 en el Carry. rlf I2C_Dato,F ; Lo introduce en el registro. call SCL_Bajo ; Termina el semiperiodo positivo del reloj. call Retardo_4micros ; Tiempo tHD;DAT del protocolo. decfsz I2C_ContadorBits,F ; Lazo para los 8 bits. goto I2C_LeeBit ; ; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento ; ACK en consecuencia. ; btfss I2C_UltimoByteLeer ; Si es el último, no debe enviar ; el bit de reconocimiento ACK. call SDA_Bajo ; Envía el bit de reconocimiento ACK ; porque todavía no es el último byte a leer. call SCL_AltaImpedancia ; Pulso en alto del SCL para transmitir el call Retardo_4micros ; bit ACK de reconocimiento. Este es tHIGH. call SCL_Bajo ; Pulso de bajada del SCL. call Retardo_4micros movf I2C_Dato,W ; El resultado se manda en el registro de return ; de trabajo W.
La EEPROM 24LC256.;**************************** Librería "M24LC256.INC" ; ; Estas subrutinas permiten realizar las tareas de manejo de la memoria EEPROM serie ; 24LC256 que transmite y recibe la información vía serie a través de un bus I2C. ; ; Subrutina "M24LC256_InicializaEscritura" ---------------------------------------------- ; ; Prepara la memoria para iniciar su escritura a partir de la posición de memoria fijada ; por los registros: ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a escribir. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque. CBLOCK M24LC256_AddressHigh ; Guarda el valor de la dirección de memoria a M24LC256_AddressLow ; escribir o leer. M24LC256_Dato ENDC ; M24LC256_DIR_ESCRITURA EQU b'10100000'; Dirección de la memoria 24LC256 para M24LC256_DIR_LECTURA EQU b'10100001'; escritura y lectura respectivamente. M24LC256_InicializaEscritura call I2C_EnviaStart ; Envía condición de Start. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del call I2C_EnviaByte ; esclavo. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los call I2C_EnviaByte ; registros M24LC256_AddressHigh y movf M24LC256_AddressLow,W ; M24LC256_AddressLow. call I2C_EnviaByte return ; Subrutina "M24LC256_InicializaLectura" ------------------------------------------------ ; ; Prepara la memoria para iniciar su lectura a partir de la posición de memoria fijada ; por los registros: ; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a leer. ; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque. M24LC256_InicializaLectura bcf I2C_UltimoByteLeer ; Todavía no ha comenzado a leer ningún dato. call I2C_EnviaStart ; Envía condición de Start. movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del call I2C_EnviaByte ; esclavo. movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los call I2C_EnviaByte ; registros M24LC256_AddressHigh y movf M24LC256_AddressLow,W ; M24LC256_AddressLow. call I2C_EnviaByte call I2C_EnviaStop ; call I2C_EnviaStart ; Envía condición de Start. movlw M24LC256_DIR_LECTURA ; Indica a la memoria 24LC256 que va a call I2C_EnviaByte ; proceder a la lectura. return ; Subrutina "M24LC256_Mensaje_a_LCD" ---------------------------------------------------- ; ; Lee el mensaje grabado en la memoria 24LC256 y lo visualiza en la pantalla del módulo LCD. ; En el registro de trabajo W se introduce la página de la memoria a partir de cuya primera ; posición se va a leer. La lectura termina cuando encuentre el código 0x00. Así por ejemplo, ; si (W)=2Fh lee el mensaje que comienza en la posición 0 de la página 2Fh de la memoria, ; que es la posición 2F00h absoluta. ; CBLOCK ; M24LC256_ValorCaracter ; Valor ASCII del carácter leído. ENDC ;M24LC256_Mensaje_a_LCD movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente. clrf M24LC256_AddressLow call M24LC256_InicializaLectura M24LC256_LeeOtroByte call I2C_LeeByte ; Lee la memoria 24LC256. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina. movf M24LC256_ValorCaracter,W ; Recupera el valor leído. call LCD_Caracter ; Lo visualiza en la pantalla del LCD. incf M24LC256_AddressLow,F ; Apunta a la siguiente posición. goto M24LC256_LeeOtroByte ;M24LC256_FinMensaje ; call M24LC_256_FinalizaLectura ; return ; Subrutina "M24LC256_FinalizaLectura" ------------------------------------------------ ; ; Activa el bit I2C_UltimoByteLeer para que la subrutina I2C_LeeByte ponga en alta ; impedancia la línea SDA y pueda ejecutarse posteriormente la condición de Start o Stop ; que fija el protocolo del bus I2C. M24LC256_FinalizaLectura bsf I2C_UltimoByteLeer ; Con estas dos instrucciones se pone en call I2C_LeeByte ; alta impedancia la línea SDA. No importa el call I2C_EnviaStop ; resultado de la lectura realizada. return ; Subrutina "M24LC256_Mensaje_a_LCD" ---------------------------------------------------- ; ; Lee un mensaje grabado en la memoria 24LC256 y lo visualiza por el módulo LCD. En caso que ; sea más largo que la longitud de la pantalla se desplaza hacia la izquierda con sensación ; de movimiento. En el registro de trabajo W se introduce la página de la memoria a partir ; de cuya primera posición va a leer. La visualización termina cuando encuentre el código ; 0x00. Así por ejemplo si (W)= 2Fh lee el mensaje que comienza en la posición 0 de la ; página 2Fh de la memoria, que es la posición 2F00h absoluta. ; CBLOCK M24LC256_ValorCaracter ; Valor ASCII del carácter leído. M24LC256_CursorPosicion ENDC M24LC256_Mensaje_a_LCD bcf I2C_UltimoByteLeer movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente. clrf M24LC256_AddressLow call M24LC256_InicializaLectura M24LC256_PrimeraPosicion clrf M24LC256_CursorPosicion ; El cursor en la posición 0 de la línea. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y M24LC256_VisualizaCaracter ; borra la pantalla. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea? subwf M24LC256_CursorPosicion,W btfss STATUS,C goto M24LC256_NoEsFinalLinea M24LC256_EsFinalLinea call Retardo_200ms ; Lo mantiene visualizado durante este tiempo. call Retardo_200ms call M24LC256_FinalizaLectura incf M24LC256_AddressLow,F call M24LC256_InicializaLectura goto M24LC256_PrimeraPosicion M24LC256_NoEsFinalLinea call I2C_LeeByte ; Obtiene el ASCII del carácter apuntado. movwf M24LC256_ValorCaracter ; Guarda el valor de carácter. movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto M24LC256_FinMensaje ; de mensaje, sale fuera. M24LC256_NoUltimoCaracter call LCD_Caracter ; Visualiza el carácter ASCII leído. incf M24LC256_CursorPosicion,F ; Contabiliza el incremento de posición del ; cursor en la pantalla. goto M24LC256_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter M24LC256_FinMensaje ; de la línea. call M24LC256_FinalizaLectura return
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.
|
|
|
En línea
|
|
|
|
Tokes
Desconectado
Mensajes: 140
|
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.
|
|
|
En línea
|
|
|
|
Meta
|
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. Ya encontré las resistencia PULLUP. No veo cambios.
|
|
« Última modificación: 5 Septiembre 2010, 23:18 pm por Meta »
|
En línea
|
|
|
|
Tokes
Desconectado
Mensajes: 140
|
¿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.
|
|
|
En línea
|
|
|
|
|
|