;-------------------------------------------------
;
;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
ENDBueno 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
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 datosCódigo: ASM
BANKSEL PIE1 BCF PIE1,TXIE BANKSEL PORTA BCF PIR1,TXIF
Escribirias eso y luego cada banksel se reemplaza por intrucciones que cambian el valor de los bits RPx
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
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 datosCódigo: ASM
BANKSEL PIE1 BCF PIE1,TXIE BANKSEL PORTA BCF PIR1,TXIF
Escribirias eso y luego cada banksel se reemplaza por intrucciones que cambian el valor de los bits RPx
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 RETORNAEntonces 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