Hola amigos ayudenme necesito tengo un programa en assembler que encontre en la red y quiero agregarle algunas cosas mas en C vi que en el conpilador tiene las opciones de #asm y #endasm y puse dentro de estas lineas mi codigo lo compile pero me da errores el que no encuentro la solucion, por que cada ves que compilo me señala error en las etiquetas que llama en codigo assembler aki les dejo el programa ojala me puedan ayudar .si no presento esto no paso de semestre y ya intente todo declare las variables corregi unas partes del programa o es que simplemente no puedo trabajar un programa de assembler en AYUDA!!!!!! les estare muy agradecido.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.
#INCLUDE <16F84A.H>
#FUSES XT,NOWDT,NOPUT
#USE DELAY(CLOCK=4000000)
// __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
//;***** VARIABLE DEFINITIONS
INT w_temp;// EQU 0x0C; //; variable utilizada para guardar el contexto
INT status_temp;// EQU 0x0D //; variable utilizada para guardar el contexto
INT irerror;// EQU 0x0E //; variable utilizada cuando recibe posibles errors
INT irtimer;// EQU 0x0F //; variable utilizada para guardar el tiempo bitlenght
INT ircounter;// EQU 0x10 ///; variable utilizada como contador de bits
INT ircmd ; // EQU 0x11 //; variable que mantenga el comando recibido
INT iradr ; // EQU 0x12 //; variable que mantenga la dirección recibido
INT irtemp ; // EQU 0x13 // ; variable utilizada para calcular ircommand de salida
INT irtemp2 ; // EQU 0x18
INT delay1 ; // EQU 0x14 // ; variable de tiempo de comparacion de entrada
INT delay2 ; // EQU 0x15 // ; variable de tiempo de entrada
INT CounterA ; // EQU 0x16 //; variable de contador de tiempoA
INT codecount; // EQU 0x19
INT CounterB; // EQU 0x17 // ; variable de contador de tiempoB
INT led; // EQU 0x01 // ; variable que asigna la salida del LED
INT ir; // EQU 0x04 // ; variable que asigna la entrada de la Señal IR
#BYTE STATUS =03
#BYTE TMR0 =01
#BYTE STATUS =0
#BYTE INTCONT =0X0B
//#BYTE STATUS =03
//;**********************************************************************
VOID MAIN (VOID)
{
DO{
#ASM
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
//#ENDASM
init
// #ASM
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
//;direccion de datos
MOVWF TRISA // ;Set RA<1> como salida
MOVLW b"00000000" // ;Valor usado en la inicializacion
// ;direccion de datos
MOVWF TRISB // ;Set Rb<7:0> como salidas
BCF STATUS, RP0 // ;Seleccionamos el banco 0
_return_ // ;retornamos a la subrutina
#ENDASM
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
movf ircmd,w //; guardamos el codigo recibido en irtemp
movwf PORTB
return
movwf irtemp
subwf irtemp2,w// ; comparamos con el codigo anterior
btfss STATUS,Z
goto mostrar_codigo
codigo_repetido
incf codecount,f
movf codecount,w
btfss STATUS,Z
return
mostrar_codigo
movlw 0x00
movwf codecount
movf irtemp,w
movwf irtemp2
call TABLA
movwf PORTB
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
//;*************************************
//;********* MAIN **************
//;*************************************
main // ;Codigo Principal
call init // ;Inicializacion de variables
clrf PORTB // ;Limpiamos PuertoB
clrf PORTA // ;Limpiamos PuertoA
BuclePrincipal
call read_sony // ;Funcion que recibe la señal IR
btfsc irerror,0 // ;Busqueda de Errores
goto BuclePrincipal // ;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 BuclePrincipal // ;Se queda esperando nueva entrada
//END ;Finaliza el programa
//;**************************************
TABLA
ADDWF PCL,1
RETLW B"00000000" // ; código para el 0
RETLW B"00000001" // ; código para el 1
RETLW B"00000010" // ; código para el 2
RETLW B"00000100" //; código para el 3
RETLW B"00001000" // ; código para el 4
RETLW B"00010000" // ; código para el 5
RETLW B"00100000" // ; código para el 6
RETLW B"01000000" // ; código para el 7
RETLW B"10000000" // ; código para el 8
#ENDASM
}WHILE(1);
}