Autor Tema: Ayuda con MPlab 7.21  (Leído 1810 veces)

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Ayuda con MPlab 7.21
« en: 13 de Septiembre de 2005, 13:49:00 »
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


Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Ayuda con MPlab 7.21
« Respuesta #1 en: 16 de Septiembre de 2005, 05:38:00 »
Muchas cosas erroneas:

1.-   .EQU no es válido. Debe ser EQU a secas
2.-   .END mas de lo mismo. Es END
3.-   No se puede definir un registro con el nombre OPTION. Es una directiva del mpasm. Te lo he cambiado por OP.
4.-   Para definir un byte en binario no se hace asi %01010101. Es b"01010101"
5.-   Para definir un byte en hexadecimal no se hace asi $05. Es 0x05

El resto son tropecientos mil warnings [203] por no tener bien tabulado el programa. Esto no afecta en nada al resultado final. Por eso te he puesto la directiva "errorlevel -203". Para que no aparezcan.

Bueno aqui esta corregido:

Codigo:
; 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

   errorlevel -203



list p=16F877,r=dec
__config h"3F32"

#DEFINE PAGE0 BCF 0x03,5
#DEFINE PAGE1 BSF 0x03,5

INDF: EQU 0x00
OP: EQU 0x01 ;page 1, 3
PCL: EQU 0x02 ;page 0, 1, 2, 3
STATUS: EQU 0x03 ;page 0, 1, 2, 3
FSR: EQU 0x04
PORTA: EQU 0x05 ;page 0
TRISA: EQU 0x05 ;page 1
PORTB: EQU 0x06 ;page 0, 2
TRISB: EQU 0x06 ;page 1, 3
PORTC: EQU 0x07 ;page 0
TRISC: EQU 0x07 ;page 1
PORTD: EQU 0x08 ;page 0
TRISD: EQU 0x08 ;page 1
PORTE: EQU 0x09 ;page 0
TRISE: EQU 0x09 ;page 1

INTCON: EQU 0x0B ;page 0, 1, 2, 3
ADRESH: EQU 0x1E ;page 0
ADRESL: EQU 0x1E ;page 1

ADCON0: EQU 0x1F ;page 0
ADCON1: EQU 0x1F ;page 1

RATE: EQU 0x30 ; porcentaje de retardo/modulación (bit MSB)
RECORD0: EQU 0x31 ; direccion para almcenar la muestra LSB
RECORD1: EQU 0x32 ; direccion para almacenar la muestra MSB
REPLAY0: EQU 0x33 ; direccion para re-llamar a la muestra LSB
REPLAY1: EQU 0x34 ; direccion para re-llamar a la muestra MSB
HALF: EQU 0x35 ; mitad del contador para usar con el "pitch" bajo
HALF2: EQU 0x36 ; mitad del contrador para usar con el "pitch" bajo
FREQ: EQU 0x37 ; contador para modulacion de la forma de onda en "chorus"
UP: EQU 0x38 ; forma de onda "flag" arriba/abajo
STORE0: EQU 0x39 ; almacenamiento general 0
STORE1: EQU 0x3A ; almacenamiento general 1
STORE2: EQU 0x3B ; alamacenamiento general 1
LOOPA: EQU 0x3C ; bucle general
MODULATE: EQU 0x3D ; nivel de modulacion para "chorus"
MODE: EQU 0x3E ; camino del "flag"
RATE2: EQU 0x3F ; porcentaje de retardo LSB

; locatizaciones por encima de 0x7F 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 0x0004 ; Direccion del vector de interrupcion
GOTO GIEOFF ; salto a la rutina de interrupcion en una interrupcion
ORG 0x0005 ; 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 b"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 b"00000100" ;fija LHS , RA0, RA1, RA3 como entradas analogicas
movwf ADCON1 ;con RA2, RA5, RE0-2 digitales, respecto a +VE y 0V
movlw b"00000101" ;"timer" 1:64 (1/50th segundos)
movwf OP
PAGE0
; movlw b"01000001" ;fija Fosc/8, ADC "on"
movlw b"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 b"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 b"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 b"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 b"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 b"00110000" ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw b"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 b"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 b"00110000" ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw b"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 b"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 b"00110000" ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw b"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 b"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 b"00110000" ; fija mem WE alto, OE alto
movwf PORTA
movf RECORD0,W
movwf PORTB
movf RECORD1,W
iorlw b"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 b"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 b"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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Ayuda con MPlab 7.21
« Respuesta #2 en: 23 de Septiembre de 2005, 14:58:00 »
Muchas gracias me ha sido de gran ayuda, perdoname el retraso en responderte para darte las gracias pero es que me fui de vacaciones.
Gracias de nuevo


 

anything