Encontrar error de compilación con MPLAB

Hola:

Con este código me da error y no se que falla ni coom corregirlo. Uso MPLAB X v2.00.

Código:
; ZONA DE DATOS **********************************************************************


    LIST        P=16F88
    INCLUDE        <P16F88.INC>
    __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
    __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
    __IDlOCS    0001               ; Versión del programa.

Variables UDATA_SHR
RAM     RES 1
RAM_1   RES 1
RAM_2   RES 1
RAM_3   RES 1
RAM_4   RES 1
RAM_5   RES 1
RAM_6   RES 1
RAM_7   RES 1
RAM_8   RES 1
RAM_9   RES 1
RAM_10  RES 1
RAM_11  RES 1
RAM_12  RES 1
RAM_13  RES 1
RAM_14  RES 1
RAM_15  RES 1
RAM_16  RES 1
RAM_17  RES 1

#DEFINE Pulsador_1    PORTA,4        ; Pulsador conectado a RA4.
#DEFINE Pulsador_2  PORTA,3     ; Pulsador conectado a RA3.
#DEFINE Pulsador_3  PORTA,2     ; Pulsador conectado a RA2.
#DEFINE Pul_STOP    PORTA,1     ; Pulsador de parada del motor.
#DEFINE Motor        PORTB,7        ; Línea donde se conecta el motor.
#DEFINE Led_1       PORTB,6     ; Led 1.
#DEFINE Led_2       PORTB,5     ; Led 2.
#DEFINE Led_3       PORTB,4     ; Led 3.

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

    ORG    0                        ; El programa comienza en la dirección 0.
Inicio
    BANKSEL ANSEL               ; Acceso al Banco 1.
    clrf    ANSEL
    bsf        Pulsador_1            ; La línea RA4 se configura como entrada.
    bsf        Pulsador_2            ; La línea RA3 se configura como entrada.
    bsf        Pulsador_3            ; La línea RA2 se configura como entrada.
    bsf        Pul_STOP            ; La línea RA1 se configura como entrada.
    bcf        Motor                ; Se configura como salida.
    bcf     Led_1               ; Led de aviso 5 minutos en activo.
    bcf     Led_2               ; Led de aviso 10 minutos en activo.
    bcf     Led_3               ; Led de aviso 20 minutos en activo.
    BANKSEL PORTB            ; Acceso al Banco 0.
    bcf        Motor                ; En principio Motor apagado igual
    bcf     Led_1               ; que los Leds.
    bcf     Led_2
    bcf     Led_3

Principal
    btfsc    Pulsador_1            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_1            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_1               ; enciende el Led 1 que significa
    call    Retardo5m              ; los 5 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_1               ; el Led 1.
EsperaDejePulsar_1
    btfss    Pulsador_1            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_1    ; No. Espera que deje de pulsar.
Fin

    btfsc    Pulsador_2            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin2                ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_2            ; Comprueba si es un rebote.
    goto    Fin2                ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_2               ; enciende el Led 2 que significa
    call    Retardo10m          ; los 10 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_2               ; el Led 2.
EsperaDejePulsar_2
    btfss    Pulsador_2            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_2    ; No. Espera que deje de pulsar.
Fin2

    btfsc    Pulsador_3            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin3                ; No. Vuelve a leerlo.
    call    Retardo20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_3            ; Comprueba si es un rebote.
    goto    Fin3                ; Era un rebote y sale fuera.
    bsf     Motor               ; Activa el motor y
    bsf     Led_3               ; enciende el Led 3 que significa
    call    Retardo20m          ; los 10 minutos encendido.
    bcf     Motor               ; Apaga el motor y
    bcf     Led_3               ; el Led 3.
EsperaDejePulsar_3
    btfss    Pulsador_3            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar_3    ; No. Espera que deje de pulsar.
Fin3    goto    Principal

; Subrutinas ****************************************************************

Retardo20ms
            ;199993 cycles
    movlw    0x3E
    movwf    RAM_8
    movlw    0x9D
    movwf    RAM_9
Retardo20ms_0
    decfsz    RAM_8, f
    goto    $+2
    decfsz    RAM_9, f
    goto    Retardo20ms_0

            ;3 cycles
    goto    $+1
    nop

            ;4 cycles (including call)
    return

Retardo5m
            ;299999995 cycles
    movlw    0x54
    movwf    RAM_10
    movlw    0xA1
    movwf    RAM_11
    movlw    0xFD
    movwf    RAM_12
    movlw    0x02
    movwf    RAM_13
Retardo5m_0
    decfsz    RAM_10, f
    goto    $+2
    decfsz    RAM_11, f
    goto    $+2
    decfsz    RAM_12, f
    goto    $+2
    decfsz    RAM_13, f
    goto    Retardo5m_0

            ;1 cycle
    nop

            ;4 cycles (including call)
    return

Retardo10m
            ;599999992 cycles
    movlw    0xA9
    movwf    RAM_4
    movlw    0x41
    movwf    RAM_5
    movlw    0xFA
    movwf    RAM_6
    movlw    0x04
    movwf    RAM_7
Retardo10m_0
    decfsz    RAM_4, f
    goto    $+2
    decfsz    RAM_5, f
    goto    $+2
    decfsz    RAM_6, f
    goto    $+2
    decfsz    RAM_7, f
    goto    Retardo10m_0

            ;4 cycles
    goto    $+1
    goto    $+1

            ;4 cycles (including call)
    return

    cblock
    RAM
    RAM_1
    RAM_2
    RAM_3
    endc

Retardo20m
            ;1199999995 cycles
    movlw    0x54
    movwf    RAM_14
    movlw    0x82
    movwf    RAM_15
    movlw    0xF3
    movwf    RAM_16
    movlw    0x08
    movwf    RAM_17
Retardo20m_0
    decfsz    RAM_14, f
    goto    $+2
    decfsz    RAM_15, f
    goto    $+2
    decfsz    RAM_16, f
    goto    $+2
    decfsz    RAM_17, f
    goto    Retardo20m_0

            ;1 cycle
    nop

            ;4 cycles (including call)
    return

    END

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `D:/Electronica/PIC/Motor DC PIC16F88/Motor_DC_PIC16F88.X'
make -f nbproject/Makefile-default.mk dist/default/production/Motor_DC_PIC16F88.X.production.hex
make[2]: Entering directory `D:/Electronica/PIC/Motor DC PIC16F88/Motor_DC_PIC16F88.X'
"C:\Program Files (x86)\Microchip\MPLABX\mpasmx\mpasmx.exe" -q -p16f88 -l"build/default/production/Motor_DC_PIC16F88.lst" -e"build/default/production/Motor_DC_PIC16F88.err" -o"build/default/production/Motor_DC_PIC16F88.o" "Motor_DC_PIC16F88.asm"
Message[302] D:\ELECTRONICA\PIC\MOTOR DC PIC16F88\MOTOR_DC_PIC16F88.X\MOTOR_DC_PIC16F88.ASM 46 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[313] D:\ELECTRONICA\PIC\MOTOR DC PIC16F88\MOTOR_DC_PIC16F88.X\MOTOR_DC_PIC16F88.ASM 181 : CBLOCK constants will start with a value of 0.
"C:\Program Files (x86)\Microchip\MPLABX\mpasmx\mplink.exe" -p16f88 -w -m"dist/default/production/Motor_DC_PIC16F88.X.production.map" -z__MPLAB_BUILD=1 -odist/default/production/Motor_DC_PIC16F88.X.production.cof build/default/production/Motor_DC_PIC16F88.o
MPLINK 5.00, LINKER
Device Database Version 1.17
Copyright (c) 1998-2013 Microchip Technology Inc.
Error - section 'Variables' can not fit the section. Section 'Variables' length=0x00000012
Errors : 1

make[2]: Leaving directory `D:/Electronica/PIC/Motor DC PIC16F88/Motor_DC_PIC16F88.X'
make[1]: Leaving directory `D:/Electronica/PIC/Motor DC PIC16F88/Motor_DC_PIC16F88.X'
make[2]: *** [dist/default/production/Motor_DC_PIC16F88.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 2s)
 
Hola.
Hay un detalle al usar UDATA_SHR antes de un bloque de RAM, ésta directiva sirve para declarar variables que están visibles en todos los Bancos de memoria RAM, pero sucede que en el PIC16F88 solo hay 15 registros que se pueden acceder desde el Banco 1 al 3 y no es visible en el Banco 0... lo que creo que produce el error junto al hecho de que estas excediendo la memoria compartida del F88 ya que tienes 18 variables.

Solución:
- Utiliza UDATA (si es necesario junto al control de Bancos para acceder a los mismos) y no UDATA_SHR ó
- Utiliza cblock - endc

Saludos.
 
Hola:

Pues es verdad. Sólo funciona con el CBLOCK y el UDATA. Lo que no se como sabe tanto de UDATA y lo que contaste. Uso UDATA porque refleja la memoria en dibujo en porcentaje, con el cblock no.

router-zyxel-850060.png


Una cosa que me llama la atención esta variable:

RAM RES 1, si pongo 15 en vez de uno, el PIC se comporta como situviera 15 variables y no las tengo, es como que está reservada, pero no las uso.

¿Qué idea hay sobre ello?

Muchas gracias, ahora si compila.
 
Es como dices, la directiva RES reserva memoria y el compilador da por echo que se utiliza esa cantidad de RAM...

UDATA también puede tener dirección, es decir que puedes indicar al compilador donde exactamente están las variables en RAM.

Puedes ver ésto junto a algunos ejemplos en la guia de usuario del compilador asm, en mi caso está en "...\Microchip\MPLABX\mpasmx\Docs", se llama "MPASM_MPLINK_User_Guide".
 
Hola:

He estado ojeando el UDATA en mi caso lo puedes encontrar aquí.
C:\Program Files (x86)\Microchip\MPLABX\mpasmx\Docs

Lo que no sabía que se puede unir grupos de UDATA. Ahora puse esto:

Código:
Variables   UDATA   0x20
RAM     RES 1
RAM_1   RES 1
RAM_2   RES 1

1) Con el 0x20.
Me imagino que será el 0x20 donde empieza el programa como en el CBLOCK.

En cuanto a los grupos, ¿para qué tantos grupos?

2) A parte de ello. ¿De qué me sirve?

3) Si en una variable tengo RAM RES 4. El primero me vale, pero hasta llegar el 4. ¿Qué hago con ello? Se que está reservada, pero no se para qué y como rellenarla, para eso creo otra variable. ¿No?

4) En el PIC16F84A me funciona así: "Variables UDATA_SHR 0x0C" o así "Variables UDATA_SHR". Si lo pongo así "Variables UDATA 0x0C", no compila, tampoco así "Variables UDATA". Parece que es al contrario al PIC16F88.

El PIC16F88 me funciona así "Variables UDATA 0x20" y así "Variables UDATA ". ¿Alguna conlcusión?

Saludo.
 
Para los puntos 1) a 3).
Se sabe que
a) RAM RES 1 ocupa una posición en memoria.
b) RAM RES 4 ocupa 4 posiciones en memoria.

Para el caso de (a) se puede acceder directamente usando el nombre "RAM".
Para el caso de (b) se accede al resto sumando +1 a la posición inicial del nombre "RAM".

Código:
clrf RAM       ; 1ra posición
clrf RAM + 1  ; 2da posición
clrf RAM + 2

Esto es útil por ejemplo cuando se tiene una variable que excede los 8 bits como un contador de 0 a 1000, entonces se declara Miles RES 2.

Código:
incf Miles
...
incf Miles+1

Es similar si con EQU o en cblock se declara dos variables con el nombre MilesA, MilesB... ambos para un mismo contador... (esto en C por ejemplo se simplifica usando tipos como Long, Integer, Float, etc pero en asm de PICs no se puede manejar directamente datos de más de 8 bits), es una opción más.

4) Viendo la hoja de datos de ambos PICs (Memorias) reitero... UDATA_SHR sirve para reservar memoria RAM que es compartida en todos los bancos del PIC y UDATA al igual que el anterior pero en memoria no compartida, entonces:

Para el PIC16F84A toda la memoria RAM está compartida en sus 2 bancos por eso funciona UDATA_SHR y UDATA. La memoria RAM de usuario (variables) inicia en 0x0C;

Para el PIC16F88 solo hay una porción de memoria compartida desde el banco 1, el resto es independiente. La memoria RAM de usuario (variables) banco 1 = 0x20, banco 2 = A0, etc... lamemoria compartida va de 0x70 a 0x7F (ver hoja de datos).

Con UDATA sin dirección asume la primera posición de memoria RAM de usuario y con dirección se debe de tener cuidado donde inicia y termina la RAM de usuario.

Con UDATA_SHR sin dirección solo sirve para los PICs cuya memoria sea totalmente compartida en todos los bancos, para el resto se debe de especificar la dirección.

Me falta comprobar....
En conclusión... saber que hace cada directiva y se tiene que leer la hoja de datos!!!... si o si.
 
Última edición:
Buenas compañeros:

Tengo un problema al compilar un código en Mplab con c18, ya que al realizar esta acción me aparece el siguiente aviso:

(WARNING: Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.)

Quisiera saber a que se debe esto? Ya que el código esta bien..

Gracias. ...
 
Eso es sólo un aviso porque tienes la versión de prueba del C18, básicamente te avisa que tienes habilitado el compilador en el modo de "set extendido de instrucciones" (es decir, el código está optimizado) y que después de que caduque tu tiempo de prueba esta opción se desactivará y tu código no será compatible hasta que lo recompiles con el set normal de instrucciones

Saludos bienvenido al foro
 
Buenas compañeros:

Tengo un problema al compilar un código en Mplab con c18, ya que al realizar esta acción me aparece el siguiente aviso:

(WARNING: Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.)

Quisiera saber a que se debe esto? Ya que el código está bien..

Gracias.
Pues el mensaje lo dice muy claramente.

* La ejecución del compilador en modo extendido no será soportada cuando termine el periodo de evaluación.

Por lo tanto, para que se apliquen nuevamente las características del modo extendido, se tiene que registrar para poder usarlo en modo profesional. (PRO Mode)

Edito:
Se me adelantó Daniel. :)

Saludos.
 
Última edición:
Muchas Gracias, Daniel y D@rkbytes....




Pues el mensaje lo dice muy claramente.

* La ejecución del compilador en modo extendido no será soportada cuando termine el periodo de evaluación.

Por lo tanto, para que se apliquen nuevamente las características del modo extendido, se tiene que registrar para poder usarlo en modo profesional. (PRO Mode)

Edito:
Se me adelantó Daniel. :)

Saludos.

Gracias, y en donde me tengo que registrar? :D
 
Última edición:
Código:
list p=16f877a
#include<p16f877a.inc>

            
    __CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_OFF       
CBLOCK 0X20
T1
T2
T3
ENDC

            
            
            ORG 0X0000
        BCF STATUS, RP1
        BSF STATUS, RP0
        MOVLW B'00000000'
        MOVWF TRISB
        MOVWF TRISC
        BCF STATUS, RP0
INICIO
        BSF PORTB,0 ;    PUERTO B VERDE
        BCF PORTB,1 ;    PUERTO B AMARILLO
        BCF PORTB,2 ;    PUERTO B ROJO
        
        BCF PORTC,0 ;    PUERTO C ROJO
        BCF PORTC,1 ;    PUERTO C AMARILLO
        BSF PORTC,2 ;    PUERTO C VERDE
        
        BSF TRISD;0 ;    PUERTO D BOTON RAPIDO
        BSF TRISD;1;    PUERTO D BOTON LENTO
        
PRESIONARCORTO 
        BTFSS PORTD,0 ; BOTON PARA PASAR CORTO
        GOTO PRESIONARCORTO
        BCF PORTB,0;    APAGA VERDE    PUERTO B
        BCF PORTC,2;    APAGA VERDE    PUERTO C
        CALL RETARDOPARPADEO ; 0.5 SEGUNDOS
        BSF PORTB,0;    PRENDE VERDE    PUERTO B
        BSF PORTC,2;    PRENDE VERDE    PUERTO C
        CALL RETARDOPARPADEO ; 0.5 SEGUNDOS
        BCF PORTB,0;    APAGA VERDE    PUERTO B
        BCF PORTC,2;    APAGA VERDE    PUERTO C
        CALL RETARDOPARPADEO ; 0.5 SEGUNDOS
        BSF PORTB,0;    PRENDE VERDE    PUERTO B
        BSF PORTC,2;    PRENDE VERDE    PUERTO C
        CALL RETARDOPARPADEO ; 0.5 SEGUNDOS
        BCF PORTB,0;    APAGA VERDE    PUERTO B
        BCF PORTC,2;    APAGA VERDE    PUERTO C
        BSF PORTB,1;    PRENDE AMARILLO    PUERTO B
        BSF PORTC,1;    PRENDE AMARILLO    PUERTO C
        CALL RETARDOCAMBIO ; 1 SEGUNDO
        BCF PORTB,1;    APAGA AMARILLO    PUERTO B
        BCF PORTC,1;    APAGA AMARILLO    PUERTO C
        BSF PORTB,2;    PRENDE ROJO    PUERTO B
        BSF PORTC,0;    PRENDE ROJO    PUERTO C
        CALL RETARDOLARGO ; 5 SEGUNDOS
        GOTO INICIO
        
PRESIONARLARGO
        BTFSS PORTD,1;    BOTON PARA PASAR LARGO
        GOTO PRESIONARLARGO
Mensaje automáticamente combinado:

Hice este codigo para hacer 2 semaforos en una avenida, que se mantengan en verde y que cuando alguien presione un boton, comience la secuencia y se cambie a rojo, pero cuando intento compilarlo, me manda este error.

"C:\Program Files\Microchip\xc8\v2.31\bin\xc8-cc.exe" -c -mcpu=16F877A -mdfp="C:/Program Files/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/SemaforoEuropeo.o SemaforoEuropeo.asm
::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries
SemaforoEuropeo.asm:2:9: fatal error: 'p16f877a.inc' file not found
 
Te está indicando que NO encuentra la librería de incluír: p16f877a.inc

Revisa que esta se encuentre y que esté en el lugar correcto
 
Hola:

Tengo este código de ejemplo en asm del PIC16F886 y me da errores.

C++:
List    p=16F886        ;Tipo de procesador

Resultado     equ 0x20                ;Define una variable para guardar el resultado

            org    0x00
            goto    Inicio            ;Vector de reset
            org    0x05   

Inicio        movlw    .12                ;Carga el 1er. sumando (12)
            addlw    .24                ;Suma el 2� sumando (24)
            movwf    Resultado        ;Guarda el resultado parcial
            movlw    .6                ;Carga el sustraendo (6)
            subwf    Resultado,1        ;Se resta al minuendo y guarda el resultado
Fin            goto    Fin                ;Bucle infinito

            end                        ;Fin del programa fuente

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'D:/MPLAB/Ejemplo2-1.asm.X'
make -f nbproject/Makefile-default.mk dist/default/production/Ejemplo2-1.asm.X.production.hex
make[2]: Entering directory 'D:/MPLAB/Ejemplo2-1.asm.X'
make[2]: Leaving directory 'D:/MPLAB/Ejemplo2-1.asm.X'
nbproject/Makefile-default.mk:85: recipe for target '.build-conf' failed
make[1]: Leaving directory 'D:/MPLAB/Ejemplo2-1.asm.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** No rule to make target 'build/default/production/Ejemplo 2-1.o', needed by 'dist/default/production/Ejemplo2-1.asm.X.production.hex'. Stop.
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 672ms)
 
A mí me da 0 errores con el MPLAB 8.92
MPLAB 8.92.png
Con el MPLABX no lo probé porque no suelo programar en ensamblador en ese entorno y no le he instalado el Toolchain para ensamblador.
 
La verdad que los MPLAB nuevos joroban mucho. Tendré que usar los viejos.

Lo malo, que ya no sacan libros sobre PIC con ASM como antes.
Tan nuevo no es, pero el compilador asm clásico ya no tiene soporte en las nuevas versiones del MPLABX, creo ya hace 2 o 3 versiones atrás ya no se incluye eso por defecto ya que venia sin necesidad de instalar algún toolchain.

En fin... la sintaxis tiene cosas nuevas...
 
Solo falta que hagan libros nuevos, los autores están tanto al Arduino con el lenguaje C, más la Raspberry Pi con Python y C++, el asm de los PIC en general no interesa, tampoco el C de los PIC tampoco por lo que se ve. Impresionante como cambió el panorama.
 
Atrás
Arriba