Autor Tema: Problema al migrar de mpasm a XC8 PIC Assembler  (Leído 7669 veces)

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

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Problema al migrar de mpasm a XC8 PIC Assembler
« en: 24 de Noviembre de 2020, 01:15:26 »
Saludos

Cuanto tiempo sin pasarme por aca.
Espero les vaya bien a todos.

Estoy intentando migrar un proyecto de mpasm a MPLAB XC8 PIC Assembler (MPLAB v5.45, XC8 v2.31).

Para seleccionar el procesador lo estoy intentando de esta manera:

  PROCESSOR 16f877a
  #include   <p16f877a.inc>

pero me arroja el siguiente error:

  AMC_MAIN_204D.asm:83:10: fatal error: 'p16f877a.inc' file not found

No encuentra el archivo .inc y, parece que es cierto, buscando en la carpeta donde esta instalado el MPLAB no lo encuento por ningun sitio...

De donde puedo sacar el .inc?
Alguien me puede contar si le ha pasado lo mismo?

Les agradezco su ayuda por adelantado.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #1 en: 24 de Noviembre de 2020, 08:52:31 »
Ahora pones

#include <xc.inc>

Y listo... Como C que solo dentro tienen todos los PICs incorporados. Y se ajusta a la selección de tu proyecto.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #2 en: 24 de Noviembre de 2020, 09:21:02 »
Gracias por su respuesta

Ahora pones

#include <xc.inc>


Lo he puesto pero sigue sin compilar, aunque ahora el error es diferente:

  AMC_MAIN_204D.asm:84:10: error: 'p16F877a.inc' file not found with <angled> include; use "quotes" instead

Parece que no lo encuentra con <parentesis> y me pide que lo intente con "comillas" pero tambien lo he intentado y el resultado es el mismo :?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #3 en: 24 de Noviembre de 2020, 09:32:36 »
Por las dudas... La extensión del archivo es .s no ?
No tengo instalado esa versión, sino ya veo de bajarlo y si podes pasar un ejemplo "mínimo" de código, como para ver que funcione.

Mejor dicho, trata de reducir tu codigo al minimo, de esa forma vas probando por partes
« Última modificación: 24 de Noviembre de 2020, 09:35:24 por KILLERJC »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #4 en: 24 de Noviembre de 2020, 09:43:28 »

Por las dudas... La extensión del archivo es .s no ?


El archivo es extension .asm (AMC_MAIN_204D.asm), es un programa de hace bastante tiempo que escribi en Mplab 5 (creo recordar)  y que todavia utilizo de vez en cuando.

Seguire tu consejo y manana intentare reducir el codigo...

Siento dejarte con la palabra en la boca pero tengo que ir a dormir a los ninos  :lol:

Saludos.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #5 en: 02 de Diciembre de 2020, 11:03:59 »
Saludos

Si me permiten retomar el tema les comento que el error descrito arriba se ha solucionado.
La parte de:

PROCESSOR 16f877a

parece que debia ir en mayusculas. Y, como bien decia KILLERJC, con incluir el xc.inc es suficiente.
Con esta secuencia ya no el da error:

PROCESSOR   16F877A
#include    <xc.inc>

Despues de esto me salieron diferentes errores de sintaxis relacionados con la escritura de algunas instrucciones
que consultando estos documentos

https://ww1.microchip.com/downloads/en/DeviceDoc/MPASM%20to%20MPLAB%20XC8%20PIC%20Assembler%20Migration%20Guide%2050002973A.pdf
https://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB%20XC8%20PIC%20Assembler%20User%27s%20Guide%2050002974A.pdf

 he podido ir resolviendo poco a poco. Pero hay una pared con la que me he topado y no puedo superar.
 
Y es que hasta ahora en assembler para colocar el codigo en diferentes bancos de memoria utilizaba la directiva ORG:

ORG  0x0010     ; Esto va al BANK0 de memoria (PIC16F877A)
ORG  0x0850   ; Esto va al BANK1

El codigo quedaba colocado donde yo queria y ya solo tenia que tener cuidado para utilizar goto y call.
Pero ahora parece ser que no se puede hacer de esta manera y hay que utilizar la directiva PSECT y aqui esta el problema porque
no me aclaro como se utiliza.

La guia de migration a XC8 assembler (el primer link de arriba) en la pagina 29 pone esto:

" The ORG directive changes the value of the location counter within the current psect to be that specified. This means
that the address set by the ORG directive is relative to the base address of the psect, which is typically not determined
until link time. For example, using ORG 0100h inside a psect that is ultimately linked to address 0x2000 will move the
location counter to address 0x2100 "

Es decir, que el ORG ya no apunta directamente a la direccion escrita detras sino que suma el numero a la direccion
especificada por el linker para el pscet... y eso parece que lo decide el linker asi que no se puede cambiar??

El caso es que he empezado a escribir un programa sencillo para encender leds en el puerto B e intentar redirigir una parte
del programa al bank1. El programa seria este:

Código: [Seleccionar]
PROCESSOR   16F877A
#include    <xc.inc>
//#include    <pic16f877a.inc>

config FOSC=XT
config WDTE=OFF
config PWRTE=ON
config BOREN=ON
config LVP=OFF
config CPD=OFF
config WRT=OFF
config DEBUG=OFF
config CP=OFF
;
;  Definicion de variables
;   
    PSECT   MainData,global,class=RAM,space=1,delta=1,noexec
    GLOBAL  del1, del2, del3, del4, temp, count, recreg
   
del1:    DS      1
del2:    DS      1
del3:    DS      1
del4:    DS      1
temp:    DS      1
count:   DS      1
recreg:  DS      1
;
; Power-On-Reset entry point
;
    PSECT   Por_Vec,global,class=CODE,delta=2
    GLOBAL  resetVec

resetVec:

    PAGESEL main
    goto    main
;
;  Definicion de variables para interrupcion

    PSECT   Isr_Data,global,class=COMMON,space=1,delta=1,noexec
    GLOBAL  W_TEMP, ST_TEMP, FS_TEMP, PL_TEMP, Guarda_RESUL

W_TEMP: DS 1
ST_TEMP: DS 1
FS_TEMP: DS 1
PL_TEMP: DS 1
Guarda_RESUL: DS 1
;   
;   Vector de interruptor and handler
;
    PSECT   Isr_Vec,global,class=CODE,delta=2

IsrVec:

movwf W_TEMP
swapf STATUS,W
        clrf STATUS
movwf ST_TEMP
movf PCLATH, w
movwf PL_TEMP
clrf PCLATH
movf FSR, w
movwf FS_TEMP

IntHandler:
nop

FinInterrupcion:
movf FS_TEMP, w
movwf FSR
movf PL_TEMP, w
movwf PCLATH
swapf ST_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie
;
; Configuracion de puertos y primera parte del programa
; Esta parte va en el BANK0
;

PSECT   MainCode,global,class=CODE,delta=2

main:

    BANKSEL(PORTB)
    clrf    PORTB
    clrf    PORTC
    movlw   0x00
    BANKSEL(TRISB)
    movwf   TRISB   ; PORT B OUTPUT
    movwf   TRISC   ; PORT C OUTPUT

LOOP:
 
    BANKSEL(PORTB)
    movlw   0x00       
    movwf   PORTB
   
    call    ChangeC
   
    call    delay
    movlw   0x0f
    movwf   PORTB

    call    ChangeC

    call    delay
    goto    LOOP
   
delay:
    BANKSEL(del1)               
    movlw   2
    movwf   BANKMASK(del1)
d2:
    movlw   0xff
    movwf   BANKMASK(del2)
d1:
    movlw   0xff
    movwf   BANKMASK(del3)
d3:
    decfsz  BANKMASK(del3),F
    goto    d3
    decfsz  BANKMASK(del2),F
    goto    d1
    decfsz  BANKMASK(del1),F
    goto    d2

    return
;
; Rutina para cambiar el puerto C   
; Y esta parte va al BANK1
;
   
PSECT   MainPort,global,class=CODE,delta=2
;ORG     08F0h    ; Si descomento esta linea sale el error (1347) da igual el numero que ponga
   
ChangeC:
    BANKSEL(PORTC)
    movwf   PORTC
    return
   
;
; Final del programa
;   
   
    END     resetVec


Poniendo todo el programa en el BANK0 compila y funciona bien (probado en protoboard). Pero al intentar poner
la rutina ChangeC en el BANK1, a partir de la direccion 08F0h  p.e.  me salta este error:

:0:: error: (1347) can't find 0x8F4 words (0x8f4 withtotal) for psect "MainPort" in class "CODE" (largest unused contiguous range 0x800)

Consultando el error 1347 te lleva al 596 que te lleva al 493 (Amo a Microchip) pero no entiendo la manera de solucionarlo...

Agradecere cualquier ayuda o comentario que puedan ofrecerme.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #6 en: 02 de Diciembre de 2020, 11:24:48 »
Estoy bajando el MPLAB X para ayudarte... Lo que me sorprendió ver que el IDE pesaba 1Gb+, que locura.... Esto sin compiladores ni nada.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #7 en: 02 de Diciembre de 2020, 11:38:36 »
Estoy bajando el MPLAB X para ayudarte... Lo que me sorprendió ver que el IDE pesaba 1Gb+, que locura.... Esto sin compiladores ni nada.

Lo siento por las molestias :oops:

Buscando por la web, sobre todo el foro de microchip, parece que no es tan facil migrar al assembler del XC8 y la gente esta teniendo diversos problemas.
Pero tampoco encuentro tantos problemas sobre el psect...

Seguire buscando

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #8 en: 02 de Diciembre de 2020, 14:00:01 »
Yo tengo problemas que ni siquiera puedo crear lo mas minimo (un loop infinito)

Código: C
  1. :0:: error: (500) undefined symbols:
  2.         _main(C:\....\FABIAN~1\AppData\Local\Temp\se18.o) start_initialization(C:\Users\....\AppData\Local\Temp\se18.o)

No estoy usando el compilador "seguro", ya que me pedía registrarme, pero tengo esos errores...

Bien... El linker no encuentra los componentes _main y start_initialization, los tendré que crear, pero veo que vos no tenes problemas, seguramente sea esa version del compilador, ya que había una diferencia sustancial de tamaño entre uno y otro.

EDIT: Logre que compilara... Codigo minimo para mi.

Código: ASM
  1. #include    <xc.inc>
  2.  
  3.     GLOBAL _main,start_initialization
  4.    
  5.     PSECT code
  6.  
  7. _main:
  8.     goto _main
  9.    
  10. start_initialization:
  11.     goto _main
  12.    
  13.    
  14.     END


Direcciones de memoria. Parece que llena desde 0x7FF hacia atras.
Es decir el vector de reset ya esta creado, no hace falta agregarlo, estoy hablando de no tocar nada... Lo que si faltaria es agregarle la linea de la interrupcion, y luego en el linker agregar el -p nombre_psect=0x04 ... Pero es una cag...

Pensé que ya deberian tener definidos ciertos sectores.
« Última modificación: 02 de Diciembre de 2020, 20:58:36 por KILLERJC »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #9 en: 02 de Diciembre de 2020, 22:06:50 »
EDIT: Logre que compilara...

Enhorabuena, creo ya es un triunfo

Direcciones de memoria. Parece que llena desde 0x7FF hacia atras.

Es verdad, no me habia dado cuenta. Lo hace al reves que hasta ahora :?.

Te cuento mis "descubrimientos":

En psect si anades asb y escribiendo asi:

Código: [Seleccionar]
PSECT   MainCode, global, class=CODE, delta=2, abs
ORG  001Fh

main:

y asi para ChangeC

Código: [Seleccionar]
PSECT   MainPort,global,class=CODE,delta=2,abs
ORG     08F0h
ChangeC:

he conseguido que compile y que empieze a partir de la posicion senalada por el ORG ((:-)).

El problema ahora es que para saltar desde el main al ChangeC escribiendo asi p.e.:

Código: [Seleccionar]
BANKSEL(ChangeC)
call   BANKMASK(ChangeC)
   
salta a la posicion 0137h del banco0  :shock:.
De todas maneras es la primera vez que utilizo BANKMASK y el problema ahora puede venir de aqui, pero la utilizacion de PSECT todavia no me convence :z).

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #10 en: 02 de Diciembre de 2020, 22:44:03 »
Nuevamente, a no ser que vos le agregaste algo mas, por ejemplo ubicaciones al linker.

El codigo NO sirve.
Porque los lugares se van ocupando en esas direcciones y no en los lugares que uno desea, por ejemplo la interrupcion en 0x04.

Respecto a lo que comentas, seguramente sea porque cambia de pagina, los bancos son de la RAM.
Asi que tenes que usar el PAGESEL

Código: ASM
  1. PAGESEL ChangeC
  2.     call  ChangeC

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #11 en: 02 de Diciembre de 2020, 23:02:47 »

Nuevamente, a no ser que vos le agregaste algo mas, por ejemplo ubicaciones al linker.


No le he agregado nada, por lo menos de forma consciente. Mis conocimientos no me llegan como para jugar con el linker...

Respecto a lo que comentas, seguramente sea porque cambia de pagina, los bancos son de la RAM.
Asi que tenes que usar el PAGESEL

Código: ASM
  1. PAGESEL ChangeC
  2.     call  ChangeC


Cambiando a PAGESEL como dices salen estos dos errores:

 main.s:129:: error: (1357) fixup overflow storing 0x8F0 in 2 bytes at 0x5C/0x2 -> 0x2E (build/default/production/main.o 48/0x1E)
 main.s:136:: error: (1357) fixup overflow storing 0x8F0 in 2 bytes at 0x66/0x2 -> 0x33 (build/default/production/main.o 48/0x28)

pero si quito el ORG y el abs de la definicion de PSECT compila y funciona.
Pero entonces pone el codigo donde le da la gana y vuelvo al principio del problema :(.

La utilizacion del ORG era facil pero se ha complicado demasiado.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #12 en: 06 de Diciembre de 2020, 22:37:28 »
Despues de casi dos semanas buscando, leyendo e investigando no he conseguido dar con la formula para conseguir que funcione el progrma descrito arriba :oops:.

Asi que, no me gusta decir esto, pero en este caso me rindo :8}.

He decidido que cogiendo tiempo voy a intentar pasar los codigos que tengo de assembler a c para evitarme este tipo de problemas en el futuro.

Me imagino que en la migracion me saldran dudas de todo tipo asi que les ruego me dejen consultarles en otro thread.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #13 en: 07 de Diciembre de 2020, 11:57:46 »
Hola Loudness, yo no pude seguir probando, estos dias son caoticos en la escuela, porque hay que hacer informes, cerrar calificaciones, etc. Y los tiempos libres son nulos.

Yo probe poner en el linker la opcion -P  para definir el lugar de cada PSECT, pero no me lo toma, es como que el linker es otro al especificado por el documento de Microchip. Entonces no funciona... Tampoco probé demasiado porque no pude.

Tengo que revisar todavia las opciones de pic-as para pasarle el -P al linker. por que -P no pertenece al executable pic-as

Código: [Seleccionar]
  -Wl                       Pass comma-separated options directly to the linker
  -Xlinker                  Pass option directly to the linker
« Última modificación: 07 de Diciembre de 2020, 12:00:44 por KILLERJC »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Problema al migrar de mpasm a XC8 PIC Assembler
« Respuesta #14 en: 08 de Diciembre de 2020, 02:39:23 »

Hola Loudness, yo no pude seguir probando, estos dias son caoticos en la escuela, porque hay que hacer informes, cerrar calificaciones, etc. Y los tiempos libres son nulos.


No te preocupes, ya te he molestado bastante.


Tampoco probé demasiado porque no pude.


El diciembre tambien es bastante ocupado para mi asi que, como te escribi, lo he dejado de momento y cuando tenga tiempo intentare pasarlo todo a c para evitar dolores de cabeza.

Por cierto, aunque se va un poco del tema pero una pregunta: los profesionales utilizais assembler alguna vez, o lo haceis todo con c?