tengo problemas para copilar este programa agradeceria su ayuda......
list p=16F84 ; Lista de las directivas que definen al microprocesador.
#include <p16F84.inc> ; procesador especifico definicion de variables.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
; '__CONFIG' directiva se utiliza para insertar los datos de configuración dentro archivo .asm
; Los mensajes siguientes de la directiva se encuentran en las respectivos archivos .Inc
;***** VARIABLE DEFINITIONS
w_temp EQU 0x0C ; variable utilizada para guardar el contexto
status_temp EQU 0x0D ; variable utilizada para guardar el contexto
irerror EQU 0x0E ; variable utilizada cuando recibe posibles errors
irtimer EQU 0x0F ; variable utilizada para guardar el tiempo bitlenght
ircounter EQU 0x10 ; variable utilizada como contador de bits
ircmd EQU 0x11 ; variable que mantenga el comando recibido
iradr EQU 0x12 ; variable que mantenga la dirección recibido
irtemp EQU 0x13 ; variable utilizada para calcular ircommand de salida
delay1 EQU 0x14 ; variable de tiempo de comparacion de entrada
delay2 EQU 0x15 ; variable de tiempo de entrada
CounterA EQU 0x16 ; variable de contador de tiempoA
CounterB EQU 0x17 ; variable de contador de tiempoB
;led EQU 0x01 ; variable que asigna la salida del LED
ir EQU 0x04 ; variable que asigna la entrada de la Señal IR
;**********************************************************************
ORG 0x000 ; restablece el vector del procesador
goto main ; envia al inicio del programa goto main
ORG 0x004 ; ubicación vector de interrupción
movwf w_temp ; save off current W register contents
movf STATUS,w ; mueve el registro status hacia el registro W
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; recupera copia de registro de status
movwf STATUS ; restablece el contenido pre-isr registro status
swapf w_temp,f
swapf w_temp,w ; restablece el contenido de pre-isr al registro W
retfie ; retornamos de la interrupcion
init
CLRF PORTA ;Inicializamos el Puerto A y sus configuraciones
BCF STATUS, RP1
BSF STATUS, RP0 ;Seleccionamos el Banco 1
MOVLW B'11110000' ;Valor usado en la inicializacion
MOVWF TRISA
MOVLW B'00000000' ;Valor usado en la inicializacion
MOVWF TRISB ;Set Rb<7:0> como salidas
BCF STATUS, RP0 ;Seleccionamos el banco 0
return ;retornamos a la subrutina
read_sony
BSF irerror,0 ;Set el errorbit (después se borrará cuando se recibe un código correcto)
BCF INTCON,GIE ;Deshabilita interrupciones temporalmente
CLRWDT ;Limpiamos el tiempo watchdog
BSF STATUS,RP0 ;Seleccionamos banco1
MOVLW b'10000101' ;Establece el temporizador y prescaler
MOVWF OPTION_REG
BCF STATUS,RP0 ;Seleccionamos el banco0
BTFSC PORTA,ir ;Si se trata de un corto sobre el señal ir dejar de leer el código de error.
GOTO end_sony
CLRF TMR0 ;Borrar temporizador para medir la longitud startbit
sony_st1
BTFSS PORTA,ir ;Medir el startbit
GOTO sony_st1
MOVF TMR0,0 ;mueve el valor de bitlength a irtimer
MOVWF irtimer
MOVLW d'32' ;Mide la longitude del startbit menos de 2 ms a continua,si no es error
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'213' ;Si la longitud del startbit fue es 2,6ms entonces la lectura final con código de error.
ADDWF irtimer,0 ;Porque cuando no es válido el startbit el código ir ya no es protocolo sony
BTFSC STATUS,C ;Así startbit debe estar entre 2 ms y 2,6 ms.
GOTO end_sony
MOVLW d'7' ;Establecer ir para de recibir 7 bits de comando.
MOVWF ircounter
rd_sony_cmd
CLRF TMR0 ;Medida la primera parte de la bitlength: Si no es entre 300 y 900µs
sony_prt1_c
BTFSC PORTA,ir ;A continuación, la salida inmediata de la rutina con un error.
GOTO sony_prt1_c
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
CLRF TMR0
CLRWDT ;limpiamos el watchdog
sony_prt2_c
BTFSS PORTA,ir ;Part2 medida del comando bits y probar si la duración es de entre 300 y 1600µs
GOTO sony_prt2_c ;Si entre estos intervalos de prueba, si bitpart segundo es más corto o más largo que 900µs
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'230'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO sony_its_1
sony_its_0
BCF STATUS,C ;si inferior a 900 µs recibido el bit es un cero
RRF ircmd,1
GOTO nxt_sony_cmd
sony_its_1
BSF STATUS,C
RRF ircmd,1
nxt_sony_cmd
DECFSZ ircounter,1 ;comprobar si todos los bits de comando son procesados en caso de no,recibir el próximo
GOTO rd_sony_cmd ;si es más de la longitud de 900µs recibido es un uno
BCF STATUS,C
RRF ircmd,1 ;Girar ircmd una posición para convertirse en comando correcto
MOVLW d'5' ;ircounter establecido para recibir 5 bits de dirección
MOVWF ircounter
rd_sony_adr
CLRF TMR0
sony_prt1_a
BTFSC PORTA,ir ;conjunto ir contar medida primer bit de longitud inferior a 300µs o más de 900µs entonces recibir 5 bits de dirección
GOTO sony_prt1_a ;luego sale inmediatamente si es error
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
CLRF TMR0
CLRWDT ;limpiamos el tiempo del watchdog
sony_prt2_a
BTFSS PORTA,ir
GOTO sony_prt2_a ;segunda medida de longitud poco más corto que si 300µs o superior 1600µs
MOVF TMR0,0 ;luego sale si es error
MOVWF irtimer ;Si entre estos intervalos de prueba si el bit es un uno o un cero (más corto o más largo que 900µs)
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'230'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO sony_its_1_a
sony_its_0_a
BCF STATUS,C ;si bitpart segundo fue más corto que 900µs es un cero
RRF iradr,1
GOTO nxt_sony_adr
sony_its_1_a
BSF STATUS,C ;si bitpart segundo fue más larga que la 900µs es uno
RRF iradr,1
nxt_sony_adr
DECFSZ ircounter,1 ;Comprueba si todos los bits son procesados en caso de no, recibir el próximo
GOTO rd_sony_adr
BCF STATUS,C ;Girar tres veces el iradr a convertirse en la dirección correcta
RRF iradr,1
BCF STATUS,C
RRF iradr,1
BCF STATUS,C
RRF iradr,1
CLRF irerror ;Porque cada bitlength se midió correcto entre los límites no se han producido errores
; bcf PORTA,led
end_sony
BCF INTCON,T0IF ;Borrar timer0 interrumpir un pabellón para evitar interrupciones
BSF STATUS,RP0
MOVLW b'00000101'
MOVWF OPTION_REG
BCF STATUS,RP0
RETURN
ir_to_outp ;Comienza la seleccion de Botones
movf ircmd,W ;Guarda ircmd en irtemp para evitar perder el código recibido
movwf irtemp
movf irtemp,W ;Check si el comando de IR es 0 (button 1) entonces la salidas es 1
sublw d'0' ;hace una resta comando y el numero de codigo
btfss STATUS,Z ;hace una comparacion
goto not_button1 ;si el resultado no es cero salta al siguiente
movlw b'00000001' ;carga la salida al Puerto B
xorwf PORTB,1 ;deja el dato grabado en el Puerto B
;call Tiempo ;tiempo que tarda el dato en el Puerto B
;goto reset ;limpia el puerto si deshabilitamos el puerto deja el codigo en la salida
goto end_output ;si queremos que el dato se quede encendido habilitamos esta funcion y deshabilitamos la anterior
not_button1
movf irtemp,W ;Check si el comando de IR es 1 (button 2) entonces la salidas es 10
sublw d'1'
btfss STATUS,Z
goto not_button2
movlw b'00000010'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button2
movf irtemp,W ;Check si el comando de IR es 2 (button 3) entonces la salidas es 11
sublw d'2'
btfss STATUS,Z
goto not_button3
movlw b'00000100'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button3
movf irtemp,W ;Check si el comando de IR es 3 (button 4) entonces la salidas es 100
sublw d'3'
btfss STATUS,Z
goto not_button4
movlw b'00001000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button4
movf irtemp,W ;Check si el comando de IR es 4 (button 5) entonces la salidas es 10000
sublw d'4'
btfss STATUS,Z
goto not_button5
movlw b'00010000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button5
movf irtemp,W ;Check si el comando de IR es 5 (button 6) entonces la salidas es 110
sublw d'5'
btfss STATUS,Z
goto not_button6
movlw b'00100000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button6
movf irtemp,W ;Check si el comando de IR es 6 (button 7) entonces la salidas es 111
sublw d'6'
btfss STATUS,Z
goto not_button7
movlw b'01000000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button7
movf irtemp,W ;Check si el comando de IR es 7 (button 8) entonces la salidas es 1000
sublw d'7'
btfss STATUS,Z
goto not_button8
movlw b'10000000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button8
movf irtemp,W ;Check si el comando de IR es 8 (button 9) entonces la salidas es 1001
sublw d'8'
btfss STATUS,Z
goto not_button9
movlw b'00000001'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button9
movf irtemp,W ;Check si el comando de IR es 9 (button 0) entonces la salidas es 2 Puerto A
sublw d'9'
btfss STATUS,Z
goto not_button16
movlw b'00000010'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button16
movf irtemp,W ;Check si el comando de IR es 16(channel up) entonces la salidas es 1010
sublw d'16'
btfss STATUS,Z
goto not_button17
movlw b'00001111'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button17
movf irtemp,W ;Check si el comando de IR es 17 (channel down) entonces la salidas es 1011
sublw d'17'
btfss STATUS,Z
goto not_button18
movlw b'11110000'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button18
movf irtemp,W ;Check si el comando de IR es 18 (volunen up) entonces la salidas es 1100
sublw d'18'
btfss STATUS,Z
goto not_button19
movlw b'00000011'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
not_button19
movf irtemp,W ;Check si el comando de IR es 19 (volumen down) entonces la salidas es 1101
sublw d'19'
btfss STATUS,Z
goto not_button20
movlw b'00001100'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
not_button20
movf irtemp,W ;Check si el comando de IR es 20 (mute) entonces la salidas es 100000
sublw d'20'
btfss STATUS,Z
goto not_button63
movlw b'00000100'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button63
movf irtemp,W ;Check si el comando de IR es 63 (prev ch) entonces la salidas es 100000
sublw d'63'
btfss STATUS,Z
goto not_button21
movlw b'00001000'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button21
movf irtemp,W ;Check si el comando de IR es 21 (Off-On) entonces la salidas es 100000
sublw d'21'
btfss STATUS,Z
goto not_button26
movlw b'11111111'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button26
movf irtemp,W ;Check si el comando de IR es 26 (PLAY) entonces la salidas es 1000000
sublw d'26'
btfss STATUS,Z
goto end_output ;Si agregamos mas botones escribimos goto not_buttonSiguiente, pero no hay mas finaliza la busqueda
movlw b'00001111'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
reset ;limpia los puertos
clrf PORTB ;PuertoB a cero
clrf PORTA ;PuertoA a cero
end_output
return ;retorna al codigo principal
delayrout1 ;tiempo de comparacion de señal IR
movlw d'255'
movwf delay2
looping2
movlw d'255'
movwf delay1
looping1
nop
nop
decfsz delay1,1
goto looping1
decfsz delay2,1
goto looping2
return
Tiempo ;Tiempo de muestra rapido
movlw d'150'
movwf CounterA
movlw d'150'
movwf CounterB
loopTiempo
decfsz CounterB,1
goto loopTiempo
decfsz CounterA,1
goto loopTiempo
return
;*************************************
;********* MAIN **************
;*************************************
main ;Codigo Principal
call init ;Inicializacion de variables
clrf PORTB ;Limpiamos PuertoB
clrf PORTA ;Limpiamos PuertoA
test
call read_sony ;Funcion que recibe la señal IR
btfsc irerror,0 ;Busqueda de Errores
goto test ;Se queda esperando nueva entrada
call ir_to_outp ;Funcion que verifica los botones y la salida
call delayrout1 ;Tiempo de comparacion de señal IR
goto test ;Se queda esperando nueva entrada
END ;Finaliza el programa