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.pdfhttps://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:
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.