Cita de: 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 (asm) [Seleccionar]M24LC256_Mensaje_a_LCD
movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
clrf M24LC256_AddressLow
call M24LC256_InicializaLectura
call LCD_Borra ; Borra la pantalla.
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 M24LC256_FinalizaLectura
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 (asm) [Seleccionar]Principal
movlw PAGINA_00
call M24LC256_Mensaje_a_LCD
call Retardo_2s
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 (asm) [Seleccionar]movf PORTC,W
andlw b'00111111'
addwf PCL,F
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 (asm) [Seleccionar]movf PORTC,W
andlw b'00111111'
call Configuracion
Y dentro de la rutina Configuracion:Código (asm) [Seleccionar]Configuracion
addwf PCL,F ; Aquí debe estar la instrucción addwf PCL,F.
goto Configuracion0 ; 0 0 0 0 0 0
goto Configuracion1 ; 0 0 0 0 0 1
goto Configuracion2 ; 0 0 0 0 1 0
.
.
.
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 (asm) [Seleccionar]Configuracion1
goto ActivaSalida
.
.
.
ActivaSalida
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.