;############################################################# ; Fichero : Receptor.asm ; Autor : Felix Gomez-Arevalillo Blazquez. ; Fecha: FEBRERO 2002. ; Version:1.2 ; Sistema RAD-MICROS. ; Placa Microcontroladora: N/A. ; Placa de Aplicaciones: N/A. ; Placa de programacion: Programador Superpro Z. ( XELTEK ) ; Bus: Tx/Rx. ; Codigo para: PIC16F84 ; Clock: 4MHz , XT. -> Ciclo = 1 uS. ; Reset: Power On Reset. ; Watch dog: Inhabilitado. ; Proteccion de codigo: Inhabilitado. ; Ficheros requeridos: H16f84a.inc ; Funcion : Controla recepcion de radiomando. ;############################################################# LIST p=PIC16F84 ; Directiva para definir micro. #include ; Fichero standard de cabecera. __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;#################### DEFINICIONES ########################### w_temp EQU 0x0C ; Variable para guardar W. status_temp EQU 0x0D ; Variable para guardar STATUS. conta1 EQU 0x0E ; Variable para el contador de retraso de la recepcion. conta2 EQU 0X0F ; Variable para el contador de retraso de la recepcion. buffer EQU 0x0G ; Variable para guardar la emision. ;################ COMIENZO DEL PROGRAMA ##################### ORG 0x00 ; Vector de Reset. GOTO inicio ; Programa Principal. ;########## TRATAMIENTO DE INTERRUPCIONES #################### ORG 0x04 ; Vector de interrupcion. MOVWF w_temp ; Guarda W. MOVF STATUS,W MOVWF status_temp ; Guarda STATUS. MOVF buffer,STATUS ; Movemos Status a buffer MOVWF buffer ; Guarda buffer. BCF INTCON,GIE ; Desactivamos el Permiso Global de interrupciones (GIE). BTFSC INTCON,RBIF ; Miramos a ver si se ha pulsado alguna tecla. GOTO salir ; Salimos de la interrupcion. ; Analiza los bits de inicio. start BTFSS PORTB,4 ; Comprobamos el primer bit. GOTO salir ; El bit no es un cero y por eso no interesa. CALL desp_0 ; Buffer = 1100. CALL delay ; Nos interesa esperar 890 usegs. BTFSS PORTB,4 ; Comprobamos el segundo bit. GOTO salir ; El bit no es un cero y por eso no interesa. CALL desp_0 ; Buffer = 1000. ;Los bits de configuración son correctos y seguimos leyendo el resto de los bits emitidos. sigue CALL delay ; Interesa esperar 890 usegs. BTFSS PORTB,4 ; Analizamos el dato transmitido. GOTO uno ; Es un uno. CALL desp_0 ; Es un cero. BTFSC STATUS,C ; Comprobamos el carry. GOTO sigue ; Aun no hemos terminado. GOTO imprimir ; Lanzamos al PORTA. cero CALL desp_1 ; Desplazamos buffer. BTFSC STATUS,C ; Comprobamos el carry. GOTO sigue ; Aun no hemos terminado. imprimir BSF STATUS,RP0 ; Banco 1. MOVLW 0X0F ; Valor de inicialización del puerto. MOVWF TRISA ; Configuramos puerto A como salida. MOVLW 0X10 ; Valor de inicialización del puerto. MOVWF TRISB ; Configuración puerto B como entrada. BCF STATUS,RP0 ; Banco 0. MOVF buffer,W ; Llevamos el dato a presentar al registro W. CALL PORTA ; Lo retransmitimos por el PORTA. salir MOVF status_temp,W ; Preparamos para recuperar STATUS. MOVF STATUS ; Recuperamos STATUS. SWAPF w_temp,F ; Preparamos para recuperar W. SWAPF w_temp,W ; Recuperamos W. BCF INTCON,GIE ; Desactivamos el Permiso Global de interrupciones (GIE). BSF INTCON,GIE ; Activamos el Registro General de Interrupciones. BCF INTCON,RBIE ; Ponemos a cero el señalizador RBIF. BCF INTCON,RBIF ; Ponemos a cero el señalizador INTF. RETFIE ;########## FIN DE TRATAMIENTO DE INTERRUPCIONES ############# ;################ PROGRAMA PRINCIPAL ######################### inicio BSF STATUS,RP0 ; Banco 1. MOVLW 0X0F ; Valor de inicialiazacion del puerto A. MOVWF TRISA ; Puerto A cofigurado como salida. MOVLW 0X10 ; Valor de inicializacion del puerto B. MOVWF TRISB ; Puerto B configurado como entrada. BCF OPTION_REG,INTEDG; Interrupcion por flanco de bajada. BCF STATUS,RP0 ; Banco 0. BCF PORTB,4 ; RB4=0 para preparar la recepcion. ADDWF STATUS,C ; Muevo el registro del carry BTFSC STATUS,C ; GOTO inicio ; Vuelvo a inicializar. ;############### FIN DE PROGRAMA PRINCIPAL ################## ;************************************************************ ; RUTINA:delay ; Funcion:retraso para el envio de cada bit ; Entrada:nada ; Salida:nada ; Variables utilizadas:conta1, conta2. ;************************************************************ delay MOVLW .6 ; Retraso de 0,890 msegs. MOVWF conta1 delay_loop1 MOVLW .10 MOVWF conta2 delay_loop DECFSZ conta2,f GOTO delay_loop DECFSZ conta1,f GOTO delay_loop1 RETURN ;************************************************************ ; FIN DE RUTINA:delay ;************************************************************ ;************************************************************ ; RUTINA: desp_1 ; Funcion: Desplazamos y añadimos un bit=0 al buffer. ; Entrada: buffer ; Salida: buffer ; Variables utilizadas: buffer ;************************************************************ desp_1 RLF buffer,0 ; Desplazamos. RETURN ;************************************************************ ; FIN DE RUTINA: desp_1 ;************************************************************ ;************************************************************ ; RUTINA: desp_0 ; Funcion: Desplazamos ; Entrada: buffer ; Salida: buffer ; Variables utilizadas: buffer ;************************************************************ desp_0 RLF buffer,1 ; Desplazamos. MOVWF buffer ; Introduzco W (con el resultado de desplazar ; el buffer) en el buffer. RETURN ;************************************************************ ; FIN DE RUTINA: desp_0 ;************************************************************ ;################## FIN DE PROGRAMA ######################## END ; Fin de programa.