Hola, estoy intentando configurar la interrupcion de un receptor mediante el interrupcion de RCIE: este es el codigo
;-------------------------------------------------
;
;Palabra de configuracion
;
;-------------------------------------------------
list P=16F877A ;Comando que indica el Pic usado
#include "p16F877A.inc" ;Etiquetas genéricas para el Pic16F887
; __config 0xFFFD
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
;-------------------------------------------------
;
; Definicion de variables
;
;-------------------------------------------------
W_TEMP EQU 0X21
STATUS_TEMP EQU 0X22
Cont1 EQU 0x23
Cont2 EQU 0x24
Cont3 EQU 0x25
Cont4 EQU 0x26
Cont1A EQU 0x27
Cont2A EQU 0x28
Cont3A EQU 0x29
Cont4A EQU 0x30
ContLED EQU 0x31
ContTMR EQU 0x32
FLAG EQU 0x33
Pass1 EQU 0x34
Pass2 EQU 0x35
Pass3 EQU 0x36
PassDONE EQU 0x37
Rotar_pass EQU 0x38
Pass_TEMP EQU 0x39
Flag_pass EQU 0x40
ONOFF EQU 0x41
Flag_send EQU 0x42 ; Bandera para avticar la transmicion de datos
;-------------------------------------------------
;
; Vectores de reset/interrupcion
;
;-------------------------------------------------
ORG 0x00
GOTO EMPEZAR
ORG 0x04
GOTO INTERRUPCION
;-------------------------------------------------
;
; Configuracion
;
;-------------------------------------------------
EMPEZAR
BSF STATUS, RP0 ; Banco 1
BCF STATUS, RP1
MOVWF TRISB ; Puerto B como entrada
CLRF TRISA ; Puerto C como salida
CLRF TRISD ; Puerto D como salida
;-----------------------------------------------
;---------- Configuracion Comunicacion-serie RECEPTOR
MOVLW D'6'
MOVWF SPBRG; Selecionamos el x para una determinada velocidad(8940)
BCF TXSTA, BRGH ; Seteamos que la velocidad sea baja
BCF TXSTA, SYNC ; lo definimos como ASINCRONICO
BSF PIE1, RCIE ; Activamos Interrupcion por RECEPCION COMPLETA
BCF STATUS, RP0 ; Banco 0
CLRF RCREG
BSF RCSTA, SPEN ; Activamos modulo SCI
BSF RCSTA, CREN ; Activamos RECEPCION
BSF STATUS, RP0
;-----------------------------------------------------
;----------------------------------------------
MOVLW B'00000111' ; ------ Configuramos el option REG con disivor 1:64 y R PULL up
MOVWF OPTION_REG
MOVLW B'01100000' ; ------ Habilito Interrupcione por PEIE y T0IE
MOVWF INTCON
MOVLW 0x06
MOVWF ADCON1
BCF STATUS, RP0 ; Banco 0
MOVLW B'11110000'
MOVWF PORTB
CLRF PORTA
CLRF PORTD
MOVLW D'16'
MOVWF Cont1A
MOVWF Cont2A
MOVWF Cont3A
MOVLW D'3'
MOVWF ContLED
MOVLW D'3'
MOVWF ContTMR
MOVLW D'186'
MOVWF TMR0
MOVLW D'12' ;4
MOVWF Pass3
MOVLW D'14' ;2
MOVWF Pass2
MOVLW D'15' ;1
MOVWF Pass1
MOVLW D'8'
MOVWF Rotar_pass
MOVLW B'00000110'
MOVWF Flag_send
MOVF PORTB,W ;Leo el PORTB y limpio flags antes de activar las interrupciones.
BCF INTCON, RBIF
BCF INTCON, T0IF
CLRF RCREG
BSF INTCON, GIE
;-------------------------------------------------
;
; Programa Principal
;
;-------------------------------------------------
INICIO
nop
GOTO INICIO
;-------------------------------------------------
;
; Tabla Hex - 7 segmentos
;
;-------------------------------------------------
TABLA
ADDWF PCL,F
RETLW B'00000000'
GOTO Send
GOTO Ver_contraseña ; E ( ON / OFF)
GOTO ON_OFF ;D
GOTO Velocidad_3 ;C
GOTO Velocidad_2 ;B
GOTO Velocidad_1 ;A
RETLW B'01111001' ;9 (7)
RETLW B'01111111' ;8 (8)
RETLW B'01100001' ;7 (9)
RETLW B'00111111'
RETLW B'00111011';5 (11)
RETLW B'01011001'
RETLW B'01101011';3
RETLW B'01101110'
RETLW B'01000001' ;1 (15)
RETLW B'01110111' ;0
RETLW B'01110101' ;MOSTRAR N ( N°17)
RETLW B'00000000' ; VACIO (18)
RETLW B'01010111' ; U (19)
RETLW B'00001000' ; - (20)
RETLW B'00111100' ; F (21)
;-------------------------------------------------
;
; Rutina de Interrupcion
;
;-------------------------------------------------
INTERRUPCION
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
BTFSC INTCON,T0IF ;El orden aca es importante
GOTO INTERRUPCIONINT
BTFSC PIR1, RCIF
GOTO INTERRUPCION_RCREG
RETORNA
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;
; Rutina de interrupcion del RCREG (DATO nuevo)
INTERRUPCION_RCREG
BTFSS Flag_send,1
GOTO Next_1
MOVF RCREG,W
MOVWF Cont2A
BCF Flag_send,1
GOTO RETORNA
Next_1
BTFSS Flag_send,2
GOTO Next_2
MOVF RCREG,W
MOVWF Cont1A
BCF Flag_send,2
GOTO RETORNA
Next_2
MOVLW B'00000110'
MOVWF Flag_send
MOVF RCREG,W
;BSF STATUS, RP0 ; Se podra hacer con Banksel?
;BCF PIE1, TXIE ; Se DESACTIVAN interrupciones por buffer vacio
;BCF STATUS, RP0
MOVWF Cont3A
CLRF RCREG
GOTO RETORNA
;
;-------------------------------------------------
;-------------------------------------------------
;
; Rutina de interrupcion del TMR0
;
;-------------------------------------------------
INTERRUPCIONINT
BCF INTCON,T0IF
MOVLW D'186'
MOVWF TMR0
DECFSZ ContTMR,F ; Loop contador de interrupciones de timer
GOTO RETORNA
MOVLW D'3'
MOVWF ContTMR ; Si se cumplio lo recargo
MOVF ContLED,W ; Que display tengo que encender?
CALL TABLALED
DECFSZ ContLED,F ; Llego a 0? Lo recargo y vuelvo
GOTO $+3
MOVLW D'3'
MOVWF ContLED
GOTO RETORNA
;-------------------------------------------------
;
; Funciones auxiliares de la interrupcion del TMR0
;
;-------------------------------------------------
TABLALED
ADDWF PCL,F
GOTO LED0
GOTO LED2
GOTO LED1
GOTO LED0
LED0
MOVF Cont1A,W
CALL TABLA
MOVWF PORTD
BCF PORTA,3 ; Acomode para que siempre desactive todo y luego active.
BCF PORTA,2
BSF PORTA,1
RETURN
LED1
MOVF Cont2A,W
CALL TABLA
MOVWF PORTD
BCF PORTA,1
BCF PORTA,3
BSF PORTA,2
RETURN
LED2
MOVF Cont3A,W
CALL TABLA
MOVWF PORTD
BCF PORTA,1
BCF PORTA,2
BSF PORTA,3
RETURN
END
El codigo esta sacado de contexto, pero lo que me interesa y no puedo hacer andar esta en el codigo presentado, el problema que tengo es que en el proteus funciona bien, me salta la interrupcion cuando le mando un dato , y muestra los mismos en los 3 display pero cuando lo hago en la protoboard, no me anda nada, osea ni si quiera me muestra el triple "0 0 0" que me deberia mostrar en los dysplay en caso de que no entre ninguna interrupcion. Osea apenas lo prendo me deberia mostrar el triple "0" , Y quedarse mostrando el triple 0 hasta que que llegue una interrupcion y muestre en los display los nuevos datos que entraron, y siempre me van a llegar 3 paquetes, en caso de que ingrese una interrupcion, de esta manera de actualizan los ContA1 2 , y 3 , y pasa a mostrarme esos nuevos valores.. Obviamente estoy configurando algo mal, me pase toda la noche intentando intentando hacerlo funcionar y no puedo. Cuando NO activo la interrupcion de RCIE osea cuando borro la instruccion que puse en la configuracion del receptor ( BSF PIE1, RCIE) empieza a andar bien, me muestra el triple "0" que me deberia mostrar en los display,obviamente no puedo recibir ningun dato desde el RCREG, ya que no esta habilitada la interrupcion, pero se queda en el triple "0" como deberia ser. Como puede ser que cuando pongo BSF, PIE1, RCIE me deje de andar todo? Si en el proteus anda, la transmicion de datos lo tengo en otro programa y lo logre hacer andar bien, y no entiendo como este no anda si es muy similar.
Tambien intente hacerlo sin interrupciones, haciendo que en el main pregunte por la bandera RCIF en el main y que me lleve a una subrutina en caso de ser 1 y nuevamente en el Proteus me anda perfecto y no en la vida real. Supongo que debe ser alguna configuracion que olvide poner o algo asi, porque no le veo ningun error en el codigo.
Saludos