TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Miquel_S en 08 de Octubre de 2009, 14:03:45
-
Hola chicos y chicas, tengo un problema con un programa para sacar un mensaje por el LCD y despues de muchos intentos no encuentro los errores, podriais decirme porque tengo duplicados los registros.
LIST P=16F877A
INCLUDE <P16F877A.INC>
INCLUDE <Rutina_5ms.inc>
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS.
#define DISABLE bcf PORTA,2 ;Desactiva señal E.
#define LEER bsf PORTA,1 ;Pone LCD en modo lectura.
#define ENABLE bsf PORTA,2 ;Activa señal E.
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en modo escritura.
#define ON_COMANDO bsf PORTA,0 ;Activa RS.
;
;------------------------------------------------------------------------------------------------------------
; VARIABLES
;------------------------------------------------------------------------------------------------------------
;
CBLOCK H'20'
cantms ;Variable para Rutina_5ms
cursor ;Variable para Rutina_LCD.
curdisp ;Variable para Rutina_LCD.
poeslcd ;Variable para Rutina_LCD.
ENDC
;
RESET ORG 0X00
GOTO INICIO
ORG 0X05 ;Salva vector de interrupcion.
INICIO bsf STATUS,5 ;Cambio al banco 1
bcf STATUS,6
clrf TRISB ;RB se programa como salida.
movlw b'00000110' ;RA<4:3> se programan como entradas.
movwf ADCON1 ;RA<2:0> se programan como salidas.
movlw b'00011000' ;Puerta A E\S digitales
movwf TRISA
bcf STATUS,5 ;Cambio al banco 0
OFF_COMANDO ;Desactiva RS del modulo LCD.
DISABLE ;Desactiva E del modulo LCD.
LCD_INI movlw b'00111000'
call LCD_REG ;Codigo de instruccion
call Rutina_5ms ;Temporiza 5 mS.
movlw b'00111000'
call LCD_REG ;Codigo de instruccion
call Rutina_5ms ;Temporiza 5 mS.
movlw b'00111000'
call LCD_REG ;Codigo de instruccion
call Rutina_5ms ;Temporiza 5 mS.
RETURN
B_DISPLAY movlw b'00000001'
call LCD_REG
RETURN
LCD_REG OFF_COMANDO ;Desactiva RS (Modo instruccion).
movwf PORTB ;Saca el codigo de instruccion.
call LCD_BUSY
LCD_E ENABLE ;Activa señal E.
nop ;Espera 1us.
DISABLE ;Desactiva señal E.
RETURN
LCD_BUSY LEER ;Pone el LCD en modo lectura.
bsf STATUS,5 ;Selecciona el Banco 1
movlw 0xFF
movwf PORTB ;Puerta B actua de entrada
bcf STATUS,5 ;Selecciona el Banco 0
ENABLE ;Activa el LCD (Señal E)
nop
L_BUSY btfsc PORTB,7 ;Chequea el bit BUSY
goto L_BUSY ;Est a "1" (Ocupado)
DISABLE ;Desactiva el LCD (Se¤al E)
bsf STATUS,5 ;Selecciona el Banco 1
clrf PORTB ;Puerta B actua como salida
bcf STATUS,5 ;Selecciona el Banco 0
ESCRIBIR ;Pone el LCD en modo escritura
RETURN
movlw b'00000110' ;Cargamos en cursor la config. deseada.
MOV_DESP movwf cursor
call LCD_REG
RETURN
movlw b'00001100' ;Cargamos en curdisp la config. deseada.
CUR_DISP movwf curdisp
call LCD_REG
RETURN
movlw b'10000000' ;Cargamos en poeslcd la config. deseada.
POES_LCD movwf poeslcd
call LCD_REG
RETURN
LCD_DATO OFF_COMANDO ;Desactiva RS (Modo instruccion)
movwf PORTB ;Valor ASCII a sacar por PB.
call LCD_BUSY ;Espera a que se libere el LCD.
ON_COMANDO ;Activa RS (Modo dato).
goto LCD_E ;Genera pulso en señal E.
PRINCIPAL movlw DATOS1
call LCD_DATO
;------------------------------------------------------------------------------------------------------------
;MENSAJES
;------------------------------------------------------------------------------------------------------------
DATOS1 addwf PCL,1
retlw ' '
retlw 'A'
retlw 'J'
retlw 'U'
retlw 'S'
retlw 'T'
retlw 'E'
retlw ' '
retlw 'I'
retlw 'N'
retlw 'I'
retlw 'C'
retlw 'I'
retlw 'A'
retlw 'L'
retlw ' '
retlw 0x00
call LCD_DATO
END
Aqui los errors
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F877A "Alarma.asm" /l"Alarma.lst" /e"Alarma.err" /d__DEBUG=1
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 25 : Overwriting previous address contents (0000)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 25 : Overwriting previous address contents (0000)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 29 : Overwriting previous address contents (0005)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 29 : Overwriting previous address contents (0005)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 30 : Overwriting previous address contents (0006)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 30 : Overwriting previous address contents (0006)
Message[302] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 31 : Register in operand not in bank 0. Ensure that bank bits are correct.
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 31 : Overwriting previous address contents (0007)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 31 : Overwriting previous address contents (0007)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 32 : Overwriting previous address contents (0008)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 32 : Overwriting previous address contents (0008)
Message[302] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 33 : Register in operand not in bank 0. Ensure that bank bits are correct.
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 33 : Overwriting previous address contents (0009)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 33 : Overwriting previous address contents (0009)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 34 : Overwriting previous address contents (000A)
Error[118] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 34 : Overwriting previous address contents (000A)
Message[302] D:\PROYECTOS\PROYECTO1\ALARMA.ASM 35 : Register in operand not in bank 0. Ensure that bank bits are correct.
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `D:\PROYECTOS\Proyecto1\Alarma.mcp' failed.
Language tool versions: MPASMWIN.exe v5.33, mplink.exe v4.33
Preprocessor symbol `__DEBUG' is defined.
Thu Oct 08 18:42:54 2009
----------------------------------------------------------------------
BUILD FAILED
Gracias.
-
Hola Miquel_S.
Te comento que compile tu proyecto y no me dio ningun error, eso si, tuve que sacar <Rutina_5ms.inc> porque no tengo una rutina de retardo armada. Por eso se me ocurre que se podrian estar superponiendo los registros de esta rutina y los del programa principal pero no puedo asegurarlo ya que nunca me ha pasado.
Bueno, espero que encuentres la solucion a tu problema, Saludos!
-
es interesante que quieras hacer tu propia libreria de arranque de lcd, pero te recomiendo que busques otras librerias y mires lo que pasa en ellas, tengo un poco abandonado el lenguaje ensamblador (C me ha facilitado las cosas y me ha vuelto algo flojo... eso de pasar de un banco a otro! viejos recuerdos jajaja).
No te imaginas cuanto nos simplifica la vida las librerias!! si estan disponibles USALAS!
-
.
En la documentación de Microchip encontré esta explicación para el error 118:
"Code was previously generated for this adress"
(Ya se generó código para esta dirección, mas o menos).
Por eso, y por lo que dice martincnc, creería que estás poniendo la directiva ORG 0x00 en el archivo Rutina_5ms.inc.
Si así fuera, te sugiero borrar la línea y poner el include luego de ORG 0x05 en el programa principal.
¡Espero estar en lo cierto y que mi intromisión sirva de algo! Saludos.
-
Gracias a todos por la ayuda, efectivamente mtristan el problema era este, cambie el include de sitio y se resolvio el problema. Creia que se podia hacer como en el lenguaje C que las declaras al principio.
Saludos
Miquel_S
-
Hola de nuevo, sigo liado con la LCD al no poder simularla en proteus ya que me queda siempre a 1 el bit 7 del PB, se que el motivo de dicho fallo es que hay que meter una rutina de temporizacion pero no se donde (lo vi en el foro pero la he buscado y no la encuentro) lo siento, alguien puede echarme una mano.
Os dejo los archivos por si el fallo fuese del programa.
Muchas gracias.
Saludos.
-
.
.. No se si esa sea la forma de usar tablas para enviar tu mensaje al LCD. Yo haría algo como:
CLRF CONTADOR
msj1
MOVF CONTADOR,W ;Un registro contador declarado previamente
CALL MENSAJE1
BTFSC STATUS,Z ;Cuando MENSAJE1 devuelva 0x00
GOTO $+4 ;sale del lazo
CALL LCD_DATO
INCF CONTADOR,F
GOTO msj1
-
Hola mtristan gracias por tu respuesta, pero el problema esta en la simulacion, ya que he probado otros programas que usan lcd los cuales funcionan correctamente y tampoco se simulan. Como comente antes para que la simulacion funcione en proteus hay que meter unas demoras, perooo no me acuerdo de los tiempos ni donde ponerlas, y no las encuentro. (Soy asi de burro :mrgreen: :mrgreen:)
Saludos.
-
En proteus no se simula la bandera del LCD que indica si esta disponible, para ello se debe cambiar este testeo por una demora de 60us.
Saludos!
-
En proteus no se simula la bandera del LCD que indica si esta disponible, para ello se debe cambiar este testeo por una demora de 60us.
Saludos!
Nojoda suky tu a que te dedicas!! te la sabes todas!! jajajaja
-
Gracias Suky por tu respuesta, probe lo de temporizacion y el programa llega hasta el final cosa que antes no hacia, pero no se visualiza en el LCD ningun mensaje. Eso me da a entender que tengo algun fallo en el programa aunque se me compile bien, voy a revisar el programa y ya dire cosas.
Saludos.
-
Hola de nuevo estoy desesperado, he intentado simular un lcd con Pic Simulator Ide y no hay manera.
1º El programa funciona en la realidad.
2º No se que valor poner en el Setup LCD Module Busy Delays, he probado el valor por defecto, con 40us,con 60us y nada.
Donde estoy fallando?
PD: No puedo estar grabando y borrando el pic cada vez hasta conseguir lo que quiero, necesito simular antes de grabar.
Saludos de nuevo.
Miquel_S
-
Coloca el código que estas utilizando hasta el momento (Entre [ code=asm ][ /code ] para que sea mas entendible) ;-)
Saludos!
-
Gracias Suky estoy haciendo las prubas con tu programa que tienes en dicho enlace:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
Control del LCD.
-
Perdona Suky me he dejado parte del mensaje sin responder:
Estoy simulando tu programa porque doy por seguro que funciona, de esta manera cuuando simule el mio sabre si es que no lo se simular o si es fallo del programa. :mrgreen:
-
Hola de nuevo, al fin consegui simular el lcd con proteus.
Aqui os dejo el programa copiado del foro y la libreria Rutina_LCD.inc modificada para poder ser simulada con proteus en un pic 16F877A por si alguien se encuentra con el mismo problema que yo.
Ya puedo seguir con mi proyecto, cuando lo tenga listo lo posteo :-/
Proyecto:
Alarma para cambio de clase y salida al patio (los profesores estan cansados de darle al pulsador del timbre) :D :D
Miquel_S
-
:? Te olvidaste de adjuntar la librería :mrgreen:
-
Sorry Suky. :mrgreen:
-
Hola de nuevo, necesito un poco de ayuda, despues de un par de horas estudiando el programa no acierto a ver el fallo. El problema es que me salen los segundos en el sitio de los minutos, los minutos donde las horas y claro al llegar a 24 los minutos se ponen a 0 y los segundos no andan.
Alguien puede decirme donde esta el fallo lo agradeceria.
PD: El programa no es mio esta copiado de Microsystems. :oops:
Aqui os dejo los archivos de la simulacion.
Gracias de nuevo.
Miquel_S