Mmmm, veamos que veo ahi en tu código.
1) LUZ4 no lleva a ninguna parte. Lo agregué en tu código ya que sino no compilaba bien.
2) Si usas la declaracion de registros de microchip (esto lo haces cuando haces el include del
PIC16F628.inc) no necesitas declarar los registros STATUS, TRIS, etc.
3) Cambién tus STATUS,5 por STATUS,RPO, y así con otras instrucciones similares. Hacerlo de
esa manera aclara mucho el código.
4) Veo que no has hecho caso para nada a mi consejo anterior! sobre lo de hacer
subwf
!!! Ahi sique en tu código.
5) Habiendo cambiado esa línea, incluso tu código así como lo tienes ejecutará 1 vez, ya que
NUNCA vuelves de la interrupcion! Al finalizar la rutina tu haces un "goto bucle" y en
realidad estás con el GIE apagado, esto es porque se apaga automáticamente al ingresar en la
interrupcion
6) No se hacee BCF PIR1,RCIF porque esto se hace "automáticamente" al leer el RCREG.
7) Si solo tienes una interrupción habilitada, no debiera generarse interrupcion por otra
causa. Esto implica que tu chequeo al principio por el FLAG RCIF, es innecesario.
Habiendo corregido estas cositas, te paso el código corregido y que a mi me funciona.
Codigo:
LIST P=16F628
Radix HEX
#Include <P16F628.inc>
DATORX equ 0x70 ;dato a recibido
DATOTX equ 0x71 ;dato a trasmitir
ORG 0
GOTO INICIO
ORG 4
GOTO RSI
INICIO bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1
movlw .7
movwf CMCON
BSF STATUS,RP0 ;Banco 1
BCF STATUS,RP1
movlw b"11100010" ;RB1 enntrada resto salida modificar las entradas y salida
menos rb1,rb2
movwf TRISB ;EEESSSES
movlw b"11110000" ;EEEESSSS
movwf TRISA
;ESTA LINEA ESTA DE MAS Y NO LLEVA A NADA --> BORRARLA
movlw b"00100100" ;8bit dato, trasmision activa, modo asincronico
bcf STATUS,RP0
movlw b"11000000" ;Habilito las interrupciones en general
movwf INTCON
BSF STATUS,RP0
movlw b"00100000"
movwf PIE1
BCF STATUS,RP0 ;Banco cero
BSF STATUS,RP0
movlw b"00100100"
movwf TXSTA ;y alta velocidad
movlw d"25" ;se configura SPBRG de 9600 baudios
movwf SPBRG
BCF STATUS,RP0
movlw b"10010000" ;habilito el puerto serie en modo continuo
movwf RCSTA
BUCLE:
GOTO BUCLE ;bucle infinito
RSI
;Estas 2 líneas, tranquilamente podrían ser eliminadas
BTFSS PIR1,RCIF ;Comprueba si la interupcion es por recepcion
retfie ;Cambié el GOTO BUCLE por el RETFIE
;ESTA LINEA ESTA DE MAS Y NO LLEVA A NADA ya que se hace automáticamente --> BORRARLA
; BCF PIR1,RCIF ;se baja el Flag de interrupcion
movf RCREG,w ;mueve entrada a W
movwf DATORX ;Mueve la entrada a DATORX
andlw 0xF0 ;Comprueva si las 4 bit mas significativos
;ESTA LINEA ESTABA MAL... cambié subwf por sublw y eliminé el ,w ya que no es usado en dicha
instrucción
sublw b"00010000" ;Modificar para los siguientes pics
btfsc STATUS,Z
GOTO PIC
retfie ;Cambié el GOTO BUCLE por el RETFIE
PIC movf DATORX,w
andlw 0x0F
;ESTA LINEA ESTABA MAL... cambié subwf por sublw y eliminé el ,w ya que no es usado en dicha
instrucción sublw b"00000001" ;Modificar para los siguientes pasos
sublw b"00000001"
btfsc STATUS,Z
GOTO LUZ4
retfie ;Cambié el GOTO BUCLE por el RETFIE
LUZ4:
retfie ;Linea agregada por mi para que compile bien
end
Creo qeu tu error ocurrió porque has puesto la rutina de atención de interrupción pegada al
código normal y esto te confundió , seguramente pensabas que era un código normal y en
realidad estabas atendiendo una interrupción.
9) Me tomé la libertad de postearte otro código de como organizaría yo el texto de tu
software.
Moví tu rutina de interrupcion a la posicion 0x04. No es "pecado" hacer esto, para nada, es
tan bueno como ponerla en otro lugar. Además hacer un "goto" a una direccion asi sin
almacenar el estado del PLATH, STATUS, etc... te traerá muchos dolores de cabeza cuando uses
un pic mas grande. Esto está documentado en las datasheet donde se habla del "context saving"
cuando usas interrupciones.
Codigo:
LIST P=16F628
Radix HEX
#Include <P16F628.inc>
DATORX equ 0x70 ;dato a recibido
DATOTX equ 0x71 ;dato a trasmitir
ORG 0
goto INICIO
ORG 4
RSI:
movf RCREG,w ;mueve entrada a W
movwf DATORX ;Mueve la entrada a DATORX
andlw 0xF0 ;Comprueba si las 4 bit mas significativos
sublw b"00010000" ;Modificar para los siguientes pics
btfsc STATUS,Z
goto PIC
retfie
PIC
movf DATORX,w
andlw 0x0F
sublw b"00000001"
btfsc STATUS,Z
goto LUZ4
retfie
LUZ4:
retfie
INICIO
bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1
movlw .7
movwf CMCON
BSF STATUS,RP0 ;Banco 1
BCF STATUS,RP1
movlw b"11100010" ;RB1 enntrada resto salida modificar las entradas y salida
menos rb1,rb2
movwf TRISB ;EEESSSES
movlw b"11110000" ;EEEESSSS
movwf TRISA
bcf STATUS,RP0
movlw b"11000000" ;Habilito las interrupciones en general
movwf INTCON
BSF STATUS,RP0
movlw b"00100000"
movwf PIE1
BCF STATUS,RP0 ;Banco cero
BSF STATUS,RP0
movlw b"00100100"
movwf TXSTA ;y alta velocidad
movlw d"25" ;se configura SPBRG de 9600 baudios
movwf SPBRG
BCF STATUS,RP0
movlw b"10010000" ;habilito el puerto serie en modo continuo
movwf RCSTA
BUCLE:
GOTO BUCLE ;bucle infinito
end
Espero se te haya aclarado el tema. Lo probé con el MPLAB 7.3 y me andubo muy bien.
Saludos