Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/02/2014 #1

Avatar de Meta

Encontrar error de compilación con MPLAB X 2.0
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)
19/02/2014 #2

Avatar de ByAxel

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.
19/02/2014 #3

Avatar de Meta

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.



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.
19/02/2014 #4

Avatar de ByAxel

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".
19/02/2014 #5

Avatar de Meta

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.
19/02/2014 #6

Avatar de ByAxel

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.
19/02/2014 #7

Avatar de Meta

Gracias por la explicación, pues, si, hay que leerlo a fondo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.