Autor Tema: Problema con librerias en MPLAB  (Leído 7524 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
Problema con librerias en MPLAB
« en: 16 de Marzo de 2006, 17:50:00 »
Hola a todos. Hace poco empecé a trabajar con MPLAB incluyendo librerias en mis programas y la verdad he tenido muchos inconvenientes.

Para empezar, baje una libreria para el manejo del LCD a 4 bits con el 16F84 (LCD_4BIT.INC). Esta libreria necesita de otra llamada RETARDOS.INC, la cual decidí crear por mi propia cuenta. La libreria LCD_4BIT.INC la modifique un poco para que funcionara con el PIC16F877 (basicamente cambie el include del 16f84 por el del 16f877 y añadi algunas constantes para facilitar la comprension del programa). Finalmente cree un archivo LCDEXAMP.ASM que incluye la libreria LCD_4BIT.INC y que hace un llamado a la funcion LCD_Inicializa definida en dicha funcion. Cuando le doy "Build All" me sale un listado de errores de "Overwriting":

Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:Archivos de programaMicrochipMPASM SuiteMPAsmWin.exe" /q /p18F452 "lcdExamp.asm" /l"lcdExamp.lst" /e"lcdExamp.err"
Warning[215] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 1 : Processor superseded by command line.  Verify processor symbol.
Warning[215] D:\_PROJECTSIMULARUTINASLCD_4BIT.INC 24 : Processor superseded by command line.  Verify processor symbol.
Message[301] D:\_PROJECTSIMULARUTINASP16F877.INC 37 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0000)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0001)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0002)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0003)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 16 : Overwriting previous address contents (0004)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 16 : Overwriting previous address contents (0005)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 19 : Overwriting previous address contents (0006)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 19 : Overwriting previous address contents (0007)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 20 : Overwriting previous address contents (0008)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 20 : Overwriting previous address contents (0009)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 21 : Overwriting previous address contents (000A)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 21 : Overwriting previous address contents (000B)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 22 : Overwriting previous address contents (000C)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 22 : Overwriting previous address contents (000D)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 24 : Overwriting previous address contents (000E)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 24 : Overwriting previous address contents (000F)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 24 : Overwriting previous address contents (0010)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 24 : Overwriting previous address contents (0011)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 26 : Overwriting previous address contents (0012)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 26 : Overwriting previous address contents (0013)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 27 : Overwriting previous address contents (0014)
Error[118]   D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 27 : Overwriting previous address contents (0015)
Halting build on first failure as requested.
BUILD FAILED: Thu Mar 16 18:56:30 2006


No entiendo a que se deba. ¿Como puedo solucionar ese problema?.  

Muchas gracias de antemano!

PD: Intente subir los fuentes pero el servidor dice que no tiene espacio ... Divertido ... y eso que el comprimido solo pesa 6.56 KB Sonrisa Gigante

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
RE: Problema con librerias en MPLAB
« Respuesta #1 en: 16 de Marzo de 2006, 17:52:00 »
Creo que con los fuentes es mas facil entender el problema .... asi que mejor los pongo ...

;*********************************** Librería "LCD_4BIT.INC" **************************************
;
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================
;
; 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 <DB7Muchas risasB4>  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.
;
; *************************************************************************************************

   list      p=16F877         ; list directive to define processor

#include <p16F877.inc>          ; processor specific variable definitions
   errorlevel -302               ; suppress "register not in bank0, check page bits" message.   
#include <retardos.inc>


   CBLOCK         0x23
      LCD_Dato
      LCD_GuardaDato
      LCD_GuardaDatosTRIS
      LCD_Auxiliar1
      LCD_Auxiliar2
   ENDC

LCD_CaracteresPorLinea   EQU   .20   ; Número de caracteres por línea de la pantalla.

;#DEFINE   LCD_Control         PORTA
#DEFINE   LCD_DATOS      PORTB
#DEFINE   LCD_DATOS_TRIS   TRISB

#DEFINE  LCD_RS      LCD_DATOS,0
#DEFINE  LCD_RW      LCD_DATOS,1
#DEFINE  LCD_ENABLE   LCD_DATOS,2

; Bits de linea de datos del LCD
DB7      EQU   7      ; LCD dataline 7 (MSB)
DB6      EQU   6      ; LCD dataline 6
DB5      EQU   5      ; LCD dataline 5
DB4      EQU   4      ; LCD dataline 4
DB3      EQU   3      ; LCD dataline 3
DB2      EQU   2      ; LCD dataline 2
DB1      EQU   1      ; LCD dataline 1
DB0      EQU   0      ; LCD dataline 0 (LSB)

; LCD Module commands
DISP_ON      EQU   0x00C   ; Display on
DISP_ON_C   EQU   0x00E   ; Display on, Cursor on
DISP_ON_B   EQU   0x00F   ; Display on, Cursor on, Blink cursor
DISP_OFF   EQU   0x008   ; Display off
CLR_DISP   EQU   0x001   ; Clear the Display
ENTRY_INC   EQU   0x006   ;
ENTRY_INC_S   EQU   0x007   ; El mensaje se mueve hacia la derecha
ENTRY_DEC   EQU   0x004   ;
ENTRY_DEC_S   EQU   0x005   ; El mensaje se mueve hacia la izquierda
DD_RAM_ADDR   EQU   0x080   ; Least Significant 7-bit are for address
DD_RAM_UL   EQU   0x080   ; Upper Left coner of the Display
FUNC_4_BITS   EQU   0x020   ; Modo 4 bits
FUNC_8_BITS   EQU   0x030   ; Modo 8 bits
FUNC_4_N   EQU   0x028   ; Modo 4 bits, 2 renglones
FUNC_4_F   EQU   0x02C   ; Modo 4 bits, 2 renglones, caracteres 5x10 pizeles
FUNC_8_N   EQU 0x038   ; Modo 8 bits, 2 renglones
FUNC_8_F   EQU   0x03C   ; Modo 8 bits, 2 renglones, caracteres 5x10 pixeles

; 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
    call   Retardo_5ms

;   banksel   ADCON1      ; Si se desea trabajar con un pines del conversor A/D, es necesario
;   movlw   0x02      ; establecer los pines que se van a utilizar como digitales.
;   movwf   ADCON1      ; set RE2-RE0 as digital I/O

   banksel LCD_DATOS_TRIS      ; Configura las líneas conectadas al bus de datos
   movlw   b"00000000"
   movwf   LCD_DATOS_TRIS
   clrf   STATUS
   bcf      LCD_RW            ; En caso de que esté conectado le indica
                        ; que se va a escribir en el LCD.
   bcf      LCD_ENABLE         ; Impide funcionamiento del LCD poniendo E=0.
   bcf    LCD_RS            ; Activa el Modo Comando poniendo RS=0.
   call   Retardo_20ms
   movlw   FUNC_8_BITS   
   call   LCD_EscribeLCD      ; Escribe el dato en el LCD.
   call   Retardo_5ms   
   movlw   FUNC_8_BITS   
   call   LCD_EscribeLCD
   call   Retardo_200micros
   movlw   FUNC_8_BITS   
   call   LCD_EscribeLCD
   call   Retardo_200micros
   movlw   FUNC_4_BITS         ; Interface de 4 bits.
   call   LCD_EscribeLCD

; 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_DATOS,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   LCD_DATOS_TRIS      ; Acceso al Banco 1.
   movf   LCD_DATOS_TRIS,W   ; Guarda la configuración que tenía antes LCD_DATOS_TRIS.
    banksel   LCD_DATOS
   movwf   LCD_GuardaDatosTRIS
    banksel   LCD_DATOS_TRIS
   movlw   b"00001111"         ; Las 4 líneas inferiores del Puerto B se dejan
   andwf   LCD_DATOS,F         ; como estaban y las 4 superiores como salida.
   clrf   STATUS            ; Acceso al Banco 0.
   movf   LCD_Dato,W         ; Recupera el dato a enviar.
   movwf   LCD_DATOS         ; Envía el dato al módulo LCD.
   bsf      LCD_ENABLE         ; Permite funcionamiento del LCD mediante un pequeño
   nop
   bcf      LCD_ENABLE         ; pulso y termina impidiendo el funcionamiento del LCD.
   banksel   LCD_DATOS            ; Acceso al Banco 0.
   movf   LCD_GuardaDatosTRIS,W
    banksel   LCD_DATOS_TRIS         ; Acceso al Banco 1.
   movwf   LCD_DATOS_TRIS         ; Restaura el antiguo valor en la configuración de LCD_DATOS_TRIS.
   clrf   STATUS               ; 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_PosicionLinea3            ; Cursor a posición de la Línea 3, a partir de la
   iorlw   b"10010100"         ; dirección 00h de la DDRAM más el valor del
   goto   LCD_EnviaComando   ; registro W.
LCD_PosicionLinea4            ; Cursor a posición de la Línea 4, a partir de la
   iorlw   b"11010100"         ; 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 4 bits.
;   goto   LCD_EnviaComando

; 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_RS            ; Activa el Modo Comando, poniendo RS=0.
   goto   LCD_Envia
LCD_Caracter
   bsf      LCD_RS            ; 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_RS            ; 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.

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
RE: Problema con librerias en MPLAB
« Respuesta #2 en: 16 de Marzo de 2006, 17:53:00 »
La otra libreria ...

;**************************** Librería "RETARDOS.INC" ***********************************
;
; Subrutinas de retardos de 1 ms y 10 us. Llamadas a estas funciones con un valor "n"
; cargado previamente en W logran un retardo n veces el de la rutina original.
;
; ***********************************************************************************

   CBLOCK         0x20
      Ret_Loops
      Ret_Loops2
   ENDC

; Subrutina "Retardo" -------------------------------------------------------------------
;
; Subrutina de retardo en milisegundos. El valor cargado en W antes del llamado a la
; subrutina indica el número de milisegundos del retardo.
;

Retardo
      movwf   Ret_Loops
top2    movlw   .110             ; Numero de veces que se repetirá el ciclo para generar 1 ms
        movwf   Ret_Loops2
top     nop
          nop
        nop
        nop
        nop
        nop
        decfsz  Ret_Loops2        ; Pregunta si termino 1 ms
        goto    top
        decfsz  Ret_Loops         ; Pregunta si termina el retardo
        goto    top2
        retlw   0

; Subrutina "Retardo_micros" ------------------------------------------------------------
;
; Subrutina de retardo de 10 microsegundos. El valor cargado en W antes del llamado a la
; subrutina indica el número de microsegundos del retardo x 10.
;

Retardo_micros
      movwf   Ret_Loops
top_us   nop
      nop
      nop
      nop
      nop
      nop
      nop
      decfsz   Ret_Loops
      goto   top_us
      retlw 0

; Retardo de 5 ms ----------------------------------------------------------------------
Retardo_2ms
      movlw   .002
      call   Retardo
      retlw   0

; Retardo de 5 ms ----------------------------------------------------------------------
Retardo_5ms
      movlw   .005
      call   Retardo
      retlw   0

; Retardo de 20 ms ----------------------------------------------------------------------
Retardo_20ms
      movlw   .020
      call   Retardo
      retlw   0

; Retardo de 50 ms ----------------------------------------------------------------------
Retardo_50micros
      movlw   .005
      call   Retardo_micros
      retlw   0

; Retardo de 200 ms ---------------------------------------------------------------------
Retardo_200micros
      movlw   .020
      call   Retardo_micros
      retlw   0

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
RE: Problema con librerias en MPLAB
« Respuesta #3 en: 16 de Marzo de 2006, 17:55:00 »
Finalmente el .ASM (LCDEXAMP.ASM)

;****************************************************************
   list p=16f877

;#include <p16f877a.inc>
#include <lcd_4bit.inc>

; Variables usadas en el programa
   CBLOCK         0x30
      MAX_CONT
      CONT
   ENDC

      org 0x000
      goto inicio
;      org 0x005

inicio   bsf STATUS,RP0      ; Se cambia a Banco1
;      movlw 0xF8
;      movwf TRISA         ; Los 3 LSB de PuertoE son salidas
      movlw 0x00
      movwf PORTB         ; Todos los bits de PuertoD son salidas
      clrf PORTB
      bcf STATUS,RP0      ; Se regresa a Banco0

      call LCD_Inicializa

      bsf PORTB,3   
;      bsf PORTD,0   

      end

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Problema con librerias en MPLAB
« Respuesta #4 en: 20 de Marzo de 2006, 20:16:00 »
Vamos por partes.

Primero
Escrito originalmente por CMaGNo

Warning[215] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 1 : Processor superseded by command line. Verify processor symbol.
Warning[215] D:\_PROJECTSIMULARUTINASLCD_4BIT.INC 24 : Processor superseded by command line. Verify processor symbol.
Message[301] D:\_PROJECTSIMULARUTINASP16F877.INC 37 : MESSAGE: (Processor-header file mismatch. Verify selected processor.)



Es un "warning" o advertencia, no un errro.  Esto significa que en el simulador tenes activado otro PIC.  Esto se corrige yendo a CONFIGURE, ,ELECT DEVICE y elegis el PIC16F877.


Segundo   
Escrito originalmente por CMaGNo

Error[118] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0000)
Error[118] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 13 : Overwriting previous address contents (0001)
...
...
Error[118] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 26 : Overwriting previous address contents (0013)
Error[118] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 27 : Overwriting previous address contents (0014)
Error[118] D:\_PROJECTSIMULARUTINASLCDEXAMP.ASM 27 : Overwriting previous address contents (0015)
Halting build on first failure as requested.
BUILD FAILED: Thu Mar 16 18:56:30 2006


Te explico que es lo que sucede.

Todo el problema está en LCDEXAMP.ASM.
Como has puesto las el include de LCDD_4BIT.INC arriba del todo de tu código, y en dichas rutinas no especificaste una ubicación dentro de la memoria de programa, el ensamblador empieza a ubicarlas a partir de la posicion 0 de Program Memory (no usaste ORG 0x....)

Luego más abajo, en tu programa pones org 0x0000 entonces el ensamblador te dice "ey,  estas sobreescribiendo algo que ya escribiste antes....."

Solucion?  

Bueno, o pones el include abajo de todo el programa en LCDEXAMP.ASM o bien en los .inc haces un ORG a otras ubicaciones de la memoria de programa.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
RE: Problema con librerias en MPLAB
« Respuesta #5 en: 21 de Marzo de 2006, 15:49:00 »
Gracias por tu colaboracion maunix ... la duda que me queda es que direccion de inicio es recomendable poner en los include para que no vuelva a suceder lo mismo ... Supongo que no puedo poner una direccion muy cercana a 0x00, por decir algo 0x01 .... Sonrisa Gigante

Desconectado CMaGNo

  • PIC10
  • *
  • Mensajes: 14
RE: Problema con librerias en MPLAB
« Respuesta #6 en: 21 de Marzo de 2006, 15:59:00 »
Por cierto ... se me olvido decir que con solo mover el include a lcd_4bit.inc despues del org 0x00 y añadiendo un include a p16f877a.inc al inicio del programa, la apliacaion ensamblo correctacemnte.

Gracias de nuevo! Rebotado

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Problema con librerias en MPLAB
« Respuesta #7 en: 21 de Marzo de 2006, 17:44:00 »
Escrito originalmente por CMaGNo
Por cierto ... se me olvido decir que con solo mover el include a lcd_4bit.inc despues del org 0x00 y añadiendo un include a p16f877a.inc al inicio del programa, la apliacaion ensamblo correctacemnte.

Gracias de nuevo! Rebotado


 A ver si nos entendemos.

Hacer include es como COPIAR Y PEGAR, solo que lo mantienes separados por razones de comodidad.  Entonces eso de que conviene y que no , depende de tu código!


Si tu include es una rutina de interrupción pues bueno, debieras en el include ponerle que se ensamble a partir de la 0x04.  

En ensamblador TU MISMO armas como será el mapa de memoria de programa y debes tener en cuenta esto SIEMPRE.

Entonces que te conviene y que no depende de cada caso, se entiende?


No entendi mucho eso que dijiste que que pusiste el include abajo o arriba o lo que sea Sonrisa

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)