Autor Tema: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)  (Leído 2989 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Hola, estoy intentando configurar la interrupcion de un receptor mediante el interrupcion de RCIE: este es el codigo

Código: [Seleccionar]
;-------------------------------------------------
;
;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
« Última modificación: 02 de Junio de 2015, 07:14:57 por rosalva40 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)
« Respuesta #1 en: 02 de Junio de 2015, 14:25:04 »
Bueno veo varios cambios....

Np me fije en la configuracion del modulo
Pero lo principal es que no limpias el flag de interrupcion de recepcion, lo cual va a estar entrando continuamente, es decir va a quedar atrapado en la interrupcion


Código: ASM
  1. INTERRUPCION_RCREG
  2.    
  3.     BTFSS Flag_send,1
  4.         GOTO Next_1
  5.         MOVF RCREG,W
  6.         MOVWF Cont2A
  7.         BCF Flag_send,1
  8.         GOTO RETORNA
  9. Next_1    
  10.     BTFSS Flag_send,2
  11.         GOTO Next_2
  12.         MOVF RCREG,W
  13.         MOVWF Cont1A
  14.         BCF Flag_send,2
  15.         GOTO RETORNA
  16. Next_2
  17.         MOVLW B'00000110'
  18.         MOVWF Flag_send
  19.         MOVF RCREG,W
  20.         ;BSF STATUS, RP0  ; Se podra hacer con Banksel?
  21.         ;BCF PIE1, TXIE ; Se DESACTIVAN interrupciones por buffer vacio
  22.         ;BCF STATUS, RP0
  23.         MOVWF Cont3A
  24.         CLRF RCREG
  25.      
  26.         GOTO RETORNA

Veo que tenes comando el TXIE, eso es cuando transmitis, y tamcpo o deberias desactivar la recepcion. Esa linea reemplazalo por un:
BCF PIR1, RXIF
Tampoco te tenes que preocupar mucho por el los datos, ya que si no me equivoco tiene un buffer de 1 solo dato, asi que entraria sacaria el dato y luego sale, esperando otro dato.

El BANKSEL es una directiva del MPASM, luego genera el codigo para el cambio de esos datos

Código: ASM
  1. BANKSEL PIE1
  2. BCF PIE1,TXIE
  3. BANKSEL PORTA
  4. BCF PIR1,TXIF

Escribirias eso y luego cada banksel se reemplaza por intrucciones que cambian el valor de los bits RPx
« Última modificación: 02 de Junio de 2015, 14:28:28 por KILLERJC »

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Re: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)
« Respuesta #2 en: 02 de Junio de 2015, 20:50:47 »
Bueno veo varios cambios....

Np me fije en la configuracion del modulo
Pero lo principal es que no limpias el flag de interrupcion de recepcion, lo cual va a estar entrando continuamente, es decir va a quedar atrapado en la interrupción


Vos decis el flag de RCIF(porque el RXIF que me dijiste mas abajo no existe) ? del registro de PIR1?... pasa que leyendo el datasheet me dice que se pone en 1 cuando se carga un dato en RCREG y se pone automaticamente a 0 cuando este vacio RCREG, (no por SOFTWARE) asi que no deberia limpiar la bandera, esto se haría automáticamente, me saltaria la interrupcion sola, de ultima me parece ami que deberia limpiar el registro RCREG (CLRF RCREG) , asi se pone en 0 de nuevo la interrupcion de RCIF, porque por software no se modifica.



Citar
Veo que tenes comando el TXIE, eso es cuando transmitis, y tamcpo o deberias desactivar la recepcion. Esa linea reemplazalo por un:
BCF PIR1, RXIF
Tampoco te tenes que preocupar mucho por el los datos, ya que si no me equivoco tiene un buffer de 1 solo dato, asi que entraria sacaria el dato y luego sale, esperando otro dato.

El BANKSEL es una directiva del MPASM, luego genera el codigo para el cambio de esos datos

Código: ASM
  1. BANKSEL PIE1
  2. BCF PIE1,TXIE
  3. BANKSEL PORTA
  4. BCF PIR1,TXIF

Escribirias eso y luego cada banksel se reemplaza por intrucciones que cambian el valor de los bits RPx

Fijate que esta como comentario lo de BCF PIE, TXIE pasa que eso lo uso en el otro codigo.  Pero en si el error que no le encuentro explicacion es porque no me muestra los 3 ceros que me deberia mostrar cuando no llegan interrupciones?, y en e proteus si anda.
« Última modificación: 02 de Junio de 2015, 20:56:37 por rosalva40 »

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Re: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)
« Respuesta #3 en: 02 de Junio de 2015, 21:31:58 »
Bueno veo varios cambios....

Np me fije en la configuracion del modulo
Pero lo principal es que no limpias el flag de interrupcion de recepcion, lo cual va a estar entrando continuamente, es decir va a quedar atrapado en la interrupción


Vos decis el flag de RCIF(porque el RXIF que me dijiste mas abajo no existe) ? del registro de PIR1?... pasa que leyendo el datasheet me dice que se pone en 1 cuando se carga un dato en RCREG y se pone automaticamente a 0 cuando este vacio RCREG, (no por SOFTWARE) asi que no deberia limpiar la bandera, esto se haría automáticamente, me saltaria la interrupcion sola, de ultima me parece ami que deberia limpiar el registro RCREG (CLRF RCREG) , asi se pone en 0 de nuevo la interrupcion de RCIF, porque por software no se modifica.



Citar
Veo que tenes comando el TXIE, eso es cuando transmitis, y tamcpo o deberias desactivar la recepcion. Esa linea reemplazalo por un:
BCF PIR1, RXIF
Tampoco te tenes que preocupar mucho por el los datos, ya que si no me equivoco tiene un buffer de 1 solo dato, asi que entraria sacaria el dato y luego sale, esperando otro dato.

El BANKSEL es una directiva del MPASM, luego genera el codigo para el cambio de esos datos

Código: ASM
  1. BANKSEL PIE1
  2. BCF PIE1,TXIE
  3. BANKSEL PORTA
  4. BCF PIR1,TXIF

Escribirias eso y luego cada banksel se reemplaza por intrucciones que cambian el valor de los bits RPx

Fijate que esta como comentario lo de BCF PIE, TXIE pasa que eso lo uso en el otro codigo.  Pero en si el error que no le encuentro explicacion es porque no me muestra los 3 ceros que me deberia mostrar cuando no llegan interrupciones?, y en e proteus si anda.

[/quote]

Aca esta la subrutina de interrupcion como me habias dicho :
Código: [Seleccionar]
INTERRUPCION_RCREG
    
    BTFSS Flag_send,1
        GOTO Next_1
        MOVF RCREG,W
        MOVWF Cont2A
        BCF Flag_send,1
        CLRF RCREG
        BCF PIR1, RCIF
        GOTO RETORNA
Next_1    
    BTFSS Flag_send,2
        GOTO Next_2
        MOVF RCREG,W
        MOVWF Cont1A
        BCF Flag_send,2
        CLRF RCREG
        BCF PIR1, RCIF
        GOTO RETORNA
Next_2
        MOVLW B'00000110'
        MOVWF Flag_send
        MOVF RCREG,W
        MOVWF Cont3A
        CLRF RCREG
        BCF PIR1, RCIF
    
        GOTO RETORNA

Nuevamente anda perfecto en proteus , pero no en la proto, sigue sin mostrarme el estado inicial del triple cero, si le desactivo la interrupcion empieza a andar bien.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)
« Respuesta #4 en: 03 de Junio de 2015, 21:23:55 »
Entonces sinceramente no se que es... Normalmente cuando anda en la simulacion y no en real es por:

Los fuses
El Hardware (PIC o conexiones)
Fin..

xD

Desconectado rosalva40

  • PIC10
  • *
  • Mensajes: 19
Re: Problema interrupcion (RCIE) de RECEPTOR en comunicacion serie (USART)
« Respuesta #5 en: 04 de Junio de 2015, 07:12:23 »
Entonces sinceramente no se que es... Normalmente cuando anda en la simulacion y no en real es por:

Los fuses
El Hardware (PIC o conexiones)
Fin..

xD

Gracias por la ayuda! , al final resulto ser por un cable nomas que estaba roto y la velocidad era muy baja creo. Renegue pero lo logre hacer andar.
Saludos ((:-))