bueno resulta que me dio por empezar a probar la USART del 877A, y lo estoy haciendo de la siguiente manera, estoy simulando en proteus y tengo 3 pic asi:
PIC1 PIC2
PIC3
el PIC1 esta configurado para TX/RX, siempre se encuentra enviando el contenido de una variable que se esta incrementando hacia el PIC3 que esta configurado como RX y mostrando por PORTB lo que recibe, el PIC2 lo tengo configurado solo TX, convierte A/D y envia la conversion por la USART hacia el PIC1.
El problema que tengo es en el PIC1, este es el unico q envia y recibe, resulta que le tengo una condicion al recibir, si recibe un 5 debe mostrar en PORTB el 0xF0 por un segundo, si recibe un 10 debe mostrar en PORTB un 0X0F por un segundo y seguir con el curso normal del programa que es seguir enviando hacia el PIC3 el registro que se incrementa y recibir la conversion A/D del PIC2 y mostrarla en PORTB
basicamente el problema esta en que cuando se cumple la condicion al recibir un 5 o un 10 el PIC no sigue con el curso normal..se queda mostrando lo que tiene la condicion
;ENVIA Y RECIBE SERIAL, CONDICIONES DE RECEPCION SEGUN DATO RECIBIDO
List p=16F877A ;Tipo de procesador
include "P16F877A.INC" ;Definiciones de registros internos
CBLOCK 0X20
INCRE
PDel0
PDel1
PDel2
W_TEMP
STATUS_TEMP
ENDC
org 0x00 ;Vector de Reset
goto Inicio
org 0x04 ;Vector de interrupción
goto Inter
;********************************************************************************************
;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
Tx_Dato_Wait
BTFSS TXSTA,TRMT ;Byte transmitido ??
GOTO Tx_Dato_Wait ;No, esperar
BCF STATUS,RP0 ;Si
RETURN
;******************************************************************************************
;Tratamiento de la interrupción
Inter clrf PORTB
PUSH MOVWF W_TEMP ;SALVO REGISTROS
SWAPF STATUS, W
MOVWF STATUS_TEMP
btfss PIR1,RCIF ;Ha sido interrupción en la recepción ??
GOTO POP ;No, falsa interrupción
BCF PIR1,RCIF ;Si, restaurar el flag de interrupción
MOVF RCREG,W ;Lee el dato recibido
XORLW .5 ;pregunto
BTFSC STATUS,Z ;por medio de XOR si fue 5
GOTO CONDI1
MOVF RCREG,W
XORLW .10 ;pregunto
BTFSC STATUS,Z ;por medio de XOR si fue 10
GOTO CONDI2
MOVF RCREG,W
MOVWF PORTB
GOTO POP
CONDI1 MOVLW 0XF0
MOVWF PORTB
CALL DEMORA
GOTO POP
CONDI2 MOVLW 0X0F
MOVWF PORTB
CALL DEMORA
GOTO POP
POP SWAPF STATUS_TEMP,W ;REPONGO LOS REGISTROS
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
RETFIE
;*******************************************************************************************
;Programa principal
Inicio clrf PORTC
clrf PORTB
bsf STATUS,RP0 ;Selecciona banco 1
bcf STATUS,RP1
clrf PORTB ;Puerta B salida
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
clrf RCREG
;Loop
;AQUI TU PROGRAMA
;para enviar datos sólo carga W con el valor a enviar y llama a la subrutina Tx_Dato
; Por ejemplo
INI INCF INCRE,1
MOVF INCRE,W
CALL TX_DATO
CALL DEMORA
GOTO INI
;Lo recibido te lo guarda automáticamente en el registro RCREG y te lo muestra por puerto B
;############################### 1 SEGUNDO #################################
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end ;Fin del programa fuente