;El módulo EUSART. Control remoto y monitorización
;
;Este ejemplo recibe una serie de comandos ('0'-'7') que permiten cambiar de estado las salidas
;RB7:RB0. Constantemente se transmite, previa conversión a ASCII, el estado actual de esas salidas
;a modo de monitorización.
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
Salidas equ 0x20 ;Refleja el estado actual de las salidas
Contador equ 0x21 ;Variable temporal
Comando equ 0x22 ;Guarda el comando recibio remotamente
org 0x00
goto Inicio ;Vector de reset
org 0x04
goto Inter ;Vector de interrupción
org 0x05
;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W
Tx_Dato bcf PIR1,TXIF ;Restaura el flag del transmisor
movwf TXREG ;Almacena el byte a transmitir
bsf STATUS,RP0 ;Banco 1
Tx_Dato_Wait btfss TXSTA,TRMT ;Byte transmitido ??
goto Tx_Dato_Wait;No, esperar
bcf STATUS,RP0 ;Banco 0
return
;***********************************************************************************************
;Programa de tratamiento de la interrupción que se produce al recibir un carácter. Analiza el
;comando recibido ('0' -'7') y actua sobre la salida apropiada haciéndola cambiar de estado.
;Finalmenta transmite vía serie el estado actual de esas salidas
Inter btfss PIR1,RCIF ;Ha sido interrupción en la recepción ??
retfie ;No, falsa interrupción
bcf PIR1,RCIF ;Si, restaurar el flag de interrupción
movf RCREG,W
movwf Comando ;Salva el comando recibido
movlw '0'
subwf Comando,W
btfsc STATUS,Z
goto Es_0 ;Es el comando '0'
movlw '1'
subwf Comando,W
btfsc STATUS,Z
goto Es_1 ;Es el comando '1'
movlw '2'
subwf Comando,W
btfsc STATUS,Z
goto Es_2 ;Es el comando '2'
movlw '3'
subwf Comando,W
btfsc STATUS,Z
goto Es_3 ;Es el comando '3'
movlw '4'
subwf Comando,W
btfsc STATUS,Z
goto Es_4 ;Es el comando '4'
movlw '5'
subwf Comando,W
btfsc STATUS,Z
goto Es_5 ;Es el comando '5'
movlw '6'
subwf Comando,W
btfsc STATUS,Z
goto Es_6 ;Es el comando '6'
movlw '7'
subwf Comando,W
btfsc STATUS,Z
goto Es_7 ;Es el comando '7'
retfie ;Se ha recibido un carácter erróneo
Es_0 movlw b'00000001'
xorwf PORTB,F ;RB0 cambia de estado
goto Inter_Fin
Es_1 movlw b'00000010'
xorwf PORTB,F ;RB1 cambia de estado
goto Inter_Fin
Es_2 movlw b'00000100'
xorwf PORTB,F ;RB2 cambia de estado
goto Inter_Fin
Es_3 movlw b'00001000'
xorwf PORTB,F ;RB3 cambia de estado
goto Inter_Fin
Es_4 movlw b'00010000'
xorwf PORTB,F ;RB4 cambia de estado
goto Inter_Fin
Es_5 movlw b'00100000'
xorwf PORTB,F ;RB5 cambia de estado
goto Inter_Fin
Es_6 movlw b'01000000'
xorwf PORTB,F ;RB6 cambia de estado
goto Inter_Fin
Es_7 movlw b'10000000'
xorwf PORTB,F ;RB7 cambia de estado
;Transmite el actual estado de las salidas para su monitorización
Inter_Fin movlw 0x0d
call Tx_Dato ;Transmite CR
movf PORTB,W
movwf Salidas ;Lee el estado actual de las salidas
movlw .8
movwf Contador ;Inicia contador con Nº de bits a chequear
Inter_Fin_1 movlw '0' ;Código ASCII del "0"
rlf Salidas,F ;Desplaza a la izda. hasta el carry el valor actual de las salidas
btfsc STATUS,C ;El Carry = 1 ??
addlw .1 ;Si, código ASCII del "1"
call Tx_Dato ;Transmite el código ASCII
decfsz Contador,F ;Ultimo bit ??
goto Inter_Fin_1 ;No, chequear y transmitir el siguiente bit
retfie
;Programa principal
Inicio clrf PORTB ;Borra salidas
bsf STATUS,RP0
bsf STATUS,RP1 ;banco 3
clrf ANSEL ;Puerta A digital
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;banco 1
clrf TRISB ;RB7:RB0 salidas
movlw b'10111111'
movwf TRISC ;RC7/Rx entrada, RC6/Tx salida
movlw b'00100100'
movwf TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad
movlw .25
movwf SPBRG ;9600 baudios con Fosc=4MHz
bsf PIE1,RCIE ;Habilita interrupción en la recepción
bcf STATUS,RP0 ;Selecciona banco 0
movlw b'10010000'
movwf RCSTA ;USART en On, recepción contínua
bsf INTCON,PEIE ;Activa interrupción de periféricos
bsf INTCON,GIE ;Activa interrupciones
;Transmite inicialmente CR y avance de línea
movlw 0x0d
call Tx_Dato ;Transmite CR
movlw 0x0a
call Tx_Dato ;Transmite avance de línea
;Bucle principal. Consiste en leer el estado actual de las salidas y transmitirlo
Loop nop
goto Loop ;Repetir la lectura
end ;Fin del programa fuente