TEngo un fichero de un proyecto que compilar con mplab y me da infinidad de errores. Si alguien puede echarle un vistazo y decirme que falla? es el compilador las opciones de este o que?
El fichero es de un equipo que funciona y no lo escribi yo, asi que debe estar bien.
Lo mio es el C aunque he hecho algunas cosas con assembler como un bot, pero no se porque no compila.
Lo pego y ya me direis seguro que para vosotros es facil
; UNIDAD DE EFECTOS DIGITAL
;PIC16F877-20, WDT OFF, POR ON, HS XTAL
;Configuración de bits de registro (todos por defecto excepto OS1 y OS0)
; CP1 CP0 DBG NIL WRT CPD LVP BOR CP1 CP0 POR WDT OS1 OS0
; 1 1 1 1 1 1 0 0 1 1 0 0 1 0 = h"3F32"
;N.B. Logica 1/0 significa functiones SI/NO
list p=16F877,r=dec
__config h"3F32"
#DEFINE PAGE0 BCF $03,5
#DEFINE PAGE1 BSF $03,5
INDF: EQU $00
OPTION: EQU $01 ;page 1, 3
PCL: EQU $02 ;page 0, 1, 2, 3
STATUS: EQU $03 ;page 0, 1, 2, 3
FSR: EQU $04
PORTA: EQU $05 ;page 0
TRISA: EQU $05 ;page 1
PORTB: EQU $06 ;page 0, 2
TRISB: EQU $06 ;page 1, 3
PORTC: EQU $07 ;page 0
TRISC: EQU $07 ;page 1
PORTD: EQU $08 ;page 0
TRISD: EQU $08 ;page 1
PORTE: EQU $09 ;page 0
TRISE: EQU $09 ;page 1
INTCON: EQU $0B ;page 0, 1, 2, 3
ADRESH: EQU $1E ;page 0
ADRESL: EQU $1E ;page 1
ADCON0: EQU $1F ;page 0
ADCON1: EQU $1F ;page 1
RATE: EQU $30 ; porcentaje de retardo/modulación (bit MSB)
RECORD0: .EQU $31 ; direccion para almcenar la muestra LSB
RECORD1: .EQU $32 ; direccion para almacenar la muestra MSB
REPLAY0: .EQU $33 ; direccion para re-llamar a la muestra LSB
REPLAY1: .EQU $34 ; direccion para re-llamar a la muestra MSB
HALF: .EQU $35 ; mitad del contador para usar con el "pitch" bajo
HALF2: .EQU $36 ; mitad del contrador para usar con el "pitch" bajo
FREQ: .EQU $37 ; contador para modulacion de la forma de onda en "chorus"
UP: .EQU $38 ; forma de onda "flag" arriba/abajo
STORE0: .EQU $39 ; almacenamiento general 0
STORE1: .EQU $3A ; almacenamiento general 1
STORE2: .EQU $3B ; alamacenamiento general 1
LOOPA: .EQU $3C ; bucle general
MODULATE: .EQU $3D ; nivel de modulacion para "chorus"
MODE: .EQU $3E ; camino del "flag"
RATE2: .EQU $3F ; porcentaje de retardo LSB
; locatizaciones por encima de $7F estan disponibles
;************************************************************
; Definiciones de Bit
;************************************************************
W: .EQU 0
F: .EQU 1
C: .EQU 0
DC: .EQU 1
Z: .EQU 2
RP0: .EQU 5 ; registro de ESTADO
RP1: .EQU 6 ; registro de ESTADO
GIE: .EQU 7 ; registro INTCON
GO: .EQU 2 ; registro ADCON0
.ORG $0004 ; Direccion del vector de interrupcion
GOTO GIEOFF ; salto a la rutina de interrupcion en una interrupcion
.ORG $0005 ; comienzo de la memoria de programa
GIEOFF: BCF INTCON,GIE ; apaga las interrupciones globalmente
BTFSC INTCON,GIE
goto GIEOFF
goto START
ROUTEIT: movf PORTE,W
andlw 7
addwf PCL,F
goto DELAYPATH ; 0
goto PHASER ; 5
goto CHORUS ; 2
goto LOPITCH ; 3
goto BACKWARDS ; 4
goto HIPITCH ; 5
goto HIPITCH2 ; 6
goto DELAYPATH ; 7
START: bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
PAGE1
movlw %00001011 ;RA0, RA1, RA3 como entradas, RA2, RA4-RA5 como salidas
movwf TRISA
clrf TRISB ;PORTB como salida
clrf TRISC ;PORTC como salida
clrf TRISD ;PORTD como salida
movlw 7
movwf TRISE ;PORTE como entrada
movlw %00000100 ;fija LHS , RA0, RA1, RA3 como entradas analogicas
movwf ADCON1 ;con RA2, RA5, RE0-2 digitales, respecto a +VE y 0V
movlw %00000101 ;"timer" 1:64 (1/50th segundos)
movwf OPTION
PAGE0
; movlw %01000001 ;fija Fosc/8, ADC "on"
movlw %10000001 ;fija Fosc/32, ADC "on"
movwf ADCON0
clrf RECORD0
clrf RECORD1
clrf REPLAY0
clrf REPLAY1
movlw 1
movwf RATE
goto ROUTEIT
;............................ FIN de CONFIGURACION
DELAYPATH: movf PORTE,W
andlw 7
movwf MODE
movlw 1
movwf RATE
clrf PORTB
movlw 128
movwf PORTC
PATH0: PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD a 255 - para alta impedancia (entrada)
PAGE0
movf RATE2,W
addwf RECORD0,W
movwf PORTB
movf STATUS,W
andlw 1
movwf STORE1
movf RATE,W
addwf STORE1,W
addwf RECORD1,W
iorlw %10000000
movwf PORTC
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para almacenar datos de entrada desde la memoria
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija memoria para OE alto
PAGE1 ; fija para grabar
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fja mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
movwf PORTC
PATH0A: bsf ADCON0,GO ; comienza conversion de datos
WAITAD0: btfsc ADCON0,GO
goto WAITAD0
movf ADRESH,W ; obtiene valor de audio ADC
movwf PORTD ; lo coloca en la memoria externa
bcf PORTA,4 ; coloca baja la memoria WE,luego alta
bsf PORTA,4
incfsz RECORD0,F ; incrementa el contrador de grabacion
goto PATH0
incfsz RECORD1,F
goto PATH0
bsf RECORD1,7
GETDLY: bsf ADCON0,3 ; fija para la muestra RA1 (tiempo de retardo)
call DELAYB
bsf ADCON0,GO ; arranca la conversion de datos RA1
WAITAD1: btfsc ADCON0,GO
goto WAITAD1
comf ADRESH,W ; obtiene e invierte el valor RATE
movwf RATE
PAGE1
comf ADRESL,W
andlw %11000000
PAGE0
movwf RATE2
bcf STATUS,C
rrf RATE,F
rrf RATE2,F
bcf ADCON0,3 ; fija para la muestra RA0
call DELAYB
movf PORTE,W
andlw 7
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH0
;.............
HIPITCH: movf PORTE,W
andlw 7
movwf MODE
movf RECORD0,W
movwf REPLAY0
movf RECORD1,W
movwf REPLAY1
clrf RATE
clrf HALF
movlw 128
movwf PORTC
PATH1: PAGE1 ; fija para grabar
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE bajo
movwf PORTA
movf RECORD0,W
movwf PORTB
bsf ADCON0,GO ; arranca la conversion de datos
WAITAD2: btfsc ADCON0,GO
goto WAITAD2
movf ADRESH,W ; obtiene el valor ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE alto, bajo
bsf PORTA,4
PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
movf REPLAY0,W
movwf PORTB
bcf PORTA,5 ; fija mem parar OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de entrada desde la memoria
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
movlw 2
addwf REPLAY0,F ; incrementa contador de reproduccion
btfsc STATUS,C ; hay acarreo?
incf REPLAY1,F ;
incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH1
movf PORTE,W
andlw 7
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH1
;...........
LOPITCH: movf PORTE,W
andlw 7
movwf MODE
movf RECORD0,W
movwf REPLAY0
movf RECORD1,W
movwf REPLAY1
clrf HALF
PATH2: PAGE1 ; fija para grabacion
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bsf ADCON0,GO ; comienza conversion de datos
WAITAD3: btfsc ADCON0,GO
goto WAITAD3
movf ADRESH,W ; obtiene valor ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE bajo, alto
bsf PORTA,4
PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
movf REPLAY0,W
movwf PORTB
movf REPLAY1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de entrada desde la memoria
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
incf HALF,F
btfss HALF,0
goto INC3
incfsz REPLAY0,F ; incrementa contador de reproduccion
goto INC3
incf REPLAY1,F
INC3: incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH2
incf RECORD1,F
movf PORTE,W
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH2
;..........
BACKWARDS: movf PORTE,W
andlw 7
movwf MODE
movf RECORD0,W
movwf REPLAY0
movf RECORD1,W
movwf REPLAY1
PATH3: PAGE1 ; fija para grabacion
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bsf ADCON0,GO ; arranca conversion de datos
WAITAD4: btfsc ADCON0,GO
goto WAITAD4
movf ADRESH,W ; obtiene valor ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE bajo, alto
bsf PORTA,4
PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
movf REPLAY0,W
movwf PORTB
movf REPLAY1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de entrada de la memoria
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
decfsz REPLAY0,F ; decrementa contador de reproduccion
goto INC4
decf REPLAY1,F
INC4: incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH3
incf RECORD1,F
movf PORTE,W
andlw 7
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH3
;........
CHORUS: movf PORTE,W
andlw 7
movwf MODE
movlw 1
movwf UP
clrf FREQ
clrf HALF
clrf HALF2
movlw 1
movwf MODULATE
bcf ADCON0,3 ; muestra RA0
call DELAYB
PATH5A: movf RATE,W ; porcentaje de modulacion fijado por el valor de RATE
addwf HALF,F
btfss STATUS,C
goto RECORD6A
UPIT2: btfss UP,0
goto DOWN2
incfsz FREQ,F
goto RECORD6A
clrf UP
DOWN2: decfsz FREQ,F
goto RECORD6A
bsf UP,0
RECORD6A: PAGE1 ; fija para grabacion
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bsf ADCON0,GO ; comienza la conversion de datos
WAITAD8A: btfsc ADCON0,GO
goto WAITAD8A
movf ADRESH,W ; obtiene el valor de ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE bajo, alto
bsf PORTA,4
RECALL7A: PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
clrf STORE1
movf FREQ,W
movwf STORE2
movf MODULATE,W
movwf LOOPA
bcf STATUS,C
LOOP2: rlf LOOPA,F
btfsc STATUS,C
goto LOOP2A
rrf STORE2,F
goto LOOP2
LOOP2A: movf STORE2,W
subwf RECORD0,W
movwf PORTB
btfss STATUS,C ; hay acarreo negativo?
incf STORE1,F
movf STORE1,W
subwf RECORD1,W ; resta Rate de Record1
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de la memoria externa
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH5A
bsf ADCON0,3 ; muestra RA1 (valor de retardo)
call DELAYB
bsf ADCON0,GO ; comienza conversion de datos
WAITAD7A: btfsc ADCON0,GO
goto WAITAD7A
movf ADRESH,W ; obtiene valor ADC
btfsc STATUS,Z
movlw 1
movwf RATE
bsf ADCON0,4 ; muestrea RA3 (valor de retardo)
call DELAYB
bsf ADCON0,GO ; comienza conversion de datos
WAITAD9A: btfsc ADCON0,GO
goto WAITAD9A
movf ADRESH,W ; obtiene el valor del ADC
movwf MODULATE
btfsc STATUS,Z
movlw 1
movwf MODULATE
bcf ADCON0,3 ;
bcf ADCON0,4 ; muestrea RA0
call DELAYB
incf RECORD1,F
movf PORTE,W
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH5A
;..........
PHASER: movf PORTE,W
andlw 7
movwf MODE
movlw 1
movwf UP
clrf FREQ
clrf HALF
clrf HALF2
movlw 1
movwf MODULATE
bcf ADCON0,3 ; muestrea RA0
call DELAYB
PATH5: movf RATE,W ; porcentaje de modulacion fijada por el valor de RATE
addwf HALF,F
btfss STATUS,C
goto RECORD6
movlw 1
addwf HALF2,F
btfss STATUS,DC
goto RECORD6
UPIT: btfss UP,0
goto DOWN
incfsz FREQ,F
goto RECORD6
clrf UP
DOWN: decfsz FREQ,F
goto RECORD6
bsf UP,0
RECORD6: PAGE1 ; fija para grabacion
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bsf ADCON0,GO ; comienza la conversion de los datos
WAITAD8: btfsc ADCON0,GO
goto WAITAD8
movf ADRESH,W ; obtiene el valor del ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE bajo, alto
bsf PORTA,4
RECALL7: PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
clrf STORE1
movf FREQ,W
movwf STORE2
movf MODULATE,W
movwf LOOPA
bcf STATUS,C
LOOP: rlf LOOPA,F
btfsc STATUS,C
goto LOOP1
rrf STORE2,F
goto LOOP
LOOP1: movf STORE2,W
subwf RECORD0,W
movwf PORTB
btfss STATUS,C ; hay acarreo negativo?
incf STORE1,F
movf STORE1,W
subwf RECORD1,W ; reta Rate de Record1
iorlw %10000000 ; conserva DAC WR alto
movwf PORTC
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de la memoria externa
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH5
bsf ADCON0,3 ; muestrea RA1 (valor de retardo)
call DELAYB
bsf ADCON0,GO ; comienza la conversion de datos
WAITAD7: btfsc ADCON0,GO
goto WAITAD7
movf ADRESH,W ; obtiene valor de ADC
btfsc STATUS,Z
movlw 1
movwf RATE
bsf ADCON0,4 ; muestrea RA3 (valor de retardo)
call DELAYB
bsf ADCON0,GO ; comienza conversion de datos
WAITAD9: btfsc ADCON0,GO
goto WAITAD9
movf ADRESH,W ; obtiene valor del ADC
movwf MODULATE
btfsc STATUS,Z
movlw 1
movwf MODULATE
bcf ADCON0,3 ;
bcf ADCON0,4 ; muetrea RA0
call DELAYB
incf RECORD1,F
movf PORTE,W
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH5
;.............
HIPITCH2: movf PORTE,W
andlw 7
movwf MODE
movf RECORD0,W
movwf REPLAY0
movf RECORD1,W
movwf REPLAY1
clrf RATE
clrf HALF
movlw 128
movwf PORTC
PATH6: PAGE1 ; fija para grabacion
clrf TRISD ; PORTD como salidas
PAGE0
movlw %00110000 ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
bsf ADCON0,GO ; comienza conversion de datos
WAITADB: btfsc ADCON0,GO
goto WAITADB
movf ADRESH,W ; obtiene valor del ADC
movwf PORTD ; lo pone en la memoria externa
bcf PORTA,4 ; alterna mem WE bajo, alto
bsf PORTA,4
PAGE1 ; fija para re-llamada
decf TRISD,F ; fija PORTD 255 - para alta impedancia (entrada)
PAGE0
movf REPLAY0,W
movwf PORTB
bcf PORTA,5 ; fija mem para OE bajo
bcf PORTC,7 ; fija DAC WR bajo para retener datos de entrada de la mem. externa
bsf PORTC,7 ; fija DAC WR alto de nuevo
bsf PORTA,5 ; fija mem para OE alto
movlw 3
addwf REPLAY0,F ; incrementa contador de reproduccion
btfsc STATUS,C ; hay acarreo?
incf REPLAY1,F ;
incfsz RECORD0,F ; incrementa contador de grabacion
goto PATH6
movf PORTE,W
andlw 7
xorwf MODE,W
btfss STATUS,Z
goto ROUTEIT
goto PATH6
;.......
DELAYB: movlw 8
movwf LOOPA
DELAYx: decfsz LOOPA,F
goto DELAYx
return
.END