Por que interrupção do código abaixo demora para ser atendida?
No programa principal fiz um pisca-pisca de 1s e na interrupção externa,toda vez que ativa, inverte o estado do PORTD.
Fiz um teste colocando logo no inicio do programa principal GOTO $, mas se pulsar rapidamente RB0(Int_ext), ainda assim demora para inverter o estado do PORTD.
Segue o Código:
- Código: Selecionar todos
#INCLUDE <P16F877A.INC>
__CONFIG _HS_OSC & _WDT_OFF & _LVP_OFF
#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0
#DEFINE LED PORTB,1
#DEFINE BT0 PORTB,0
CBLOCK 0X20
W_TEMP
STATUS_TEMP
X ; X,Y E K VARIÁVEIS DO DELAY POR SW.
Y ;
K ;
W2 ; VARIÁVEL PARA GUARDAR O VALOR DE WREG ANTES DE ENTRAR NA
; INTERRUPÇÃO
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
MOVWF W_TEMP ;SALVA CONTEXTO
SWAPF STATUS,W
MOVWF STATUS_TEMP
CALL TRATA_INT_EXT ;TRATA A INTERRUPÇÃO
SWAPF STATUS_TEMP,W ;RESTAURA CONTEXTO
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE ;RETORNA AO PROGRAMA PRINCIPAL
INICIO:
BANK1
MOVLW B'10010000' ; INTCON
MOVWF INTCON ; BIT 7 - GIE (GLOBAL INTERRUPT ENABLE - CHAVE GERAL DAS INTERRUPÇOES)
; 0 - DESABILITA INTERRUPÇÕES
; 1 - HABILITA INTERRUPÇOES
; BIT 6 - PEIE (PERIPHERICAL INTERRUPT ENABLE - HABILITAÇÃO DA INTERRUPÇOES PERIFÉRICAS)
; 0 - DESABILITADAS INTERRUPÇOES PERIFÉRICAS
; 1 - HABILITADAS INTERRUPÇOES PERIFÉRICAS
; BIT 5 - T0IE (TIMER 0 INTERRUPT ENABLE)
; 0 - DESLIGADA INTERRUPÇÃO DE TRANSBORDO
; 1 - LIGADA INTERRUPÇÃO DE TRANSBORDO
; BIT 4 - INTE (HABILITAÇÃO DE INTERRUPÇÃO EXTERNA)
; 0 - DESLIGADA INTERRUPÇÃO EXTERNA
; 1 - LIGADA INTERRUPÇÃO EXTERNA
; BIT 3 - RBIE (HABILITAÇÃO DE INTERRUPÇÃO POR MUDANÇA DE ESTADO NA PORTA B, RB4 A RB7)
; 0 - DESLIGADA
; 1 - LIGADA
; BIT 2 - T0IF (FLAG SINALIZADOR DE ESTOURO DO TIMER 0)
; 0 - NÃO HOUVE TRANSBORDO
; 1 - TRANSBORDO, PASSOU DE 255 NO REG. TMR0.
; BIT 1 - INTF (FLAG SINALIZADOR DE INTERRUPÇÃO EXTERNA, RBO/INT)
; 0 - NÃO HOUVE INTERRUPÇÃO POR RBO/INT
; 1 - INTERRUPÇÃO EXTERNA ACIONADA. A BORDA É SELECIONADA PELO REG. OPTION <INTDEG>.
; BIT 0 - RBIF (FLAG SINALIZADOR DE ALTERAÇÃO NOS PINOS RB4 A RB7)
; 0 - SEM ALTERAÇÃO NOS NÍVEIS LÓGICOS DOS PINOS RB4 A RB7.
; 1 - HOUVE ALTERAÇÃO NOS NÍVEIS LÓGICOS DOS PINOS RB4 A RB7.
MOVLW B'00000000' ; OPTION_REG
MOVWF OPTION_REG ; BIT 7 - PULL-UP
; 0 - ATIVADO
; 1 - DESATIVADO
; BIT 6 - INTEDG (SELEÇÃO DA BORDA DE ATIVAÇÃO DA INTERRUPÇÃO EXTERNA)
; 0 - BORDA DE DESCIDA
; 1 - BORDA DE SUBIDA
; BIT 5 - T0CS (TIMER 0 CLOCK SELECT)
; 0 - CLOCK DO CRISTAL (FCRISTAL/4)
; 1 - ATIVA MODO CONTADOR, SINAL DE ENTRADA PELO PINO RA4
; BIT 4 - T0SE (TIMER 0 SENSIBILITY EDGE)
; 0 - BORDA DE SUBIDA, SINAL EXTERNO APLICADO EM RA4
; 1 - BORDA DE DESCIDA, SINAL EXTERNO APLICADO EM RA4
; BIT 3 - PSA (SELECIONA SE O PRESCALER ESTA CONECTADO AO TIMER 0 OU WATCHDOG).
; 0 - LIGADO AO TIMER 0
; 1 - LIGADO AO WATCHDOG
; BITS 2,1,0 - PS0, PS1 E PS2 ( BITS DE CONFIGURAÇÃO DO PRESCALER - FATOR DO DIVISOR DE FREQUENCIA)
; VIDE TABELA NO DATASHEET
CLRF TRISD ; PORTD DEFINIDO COMO SAÍDA
MOVLW B'00000001'
MOVWF TRISB ; PORTB, SOMENTE RB0 ENTRADA.
BANK0
CLRF PORTD ;INICIALIZA O ESTADO DOS PORTS B E D.
CLRF PORTB
PRINCIPAL:
BSF LED
CALL DELAY
BCF LED
CALL DELAY
GOTO PRINCIPAL
;-------------------------------SUBROTINA-------------------------------------
DELAY: ;ROTINA DE DELAY DE APROXIMADAMENTE 1S
MOVLW .10
MOVWF K
VOLTA2: MOVLW .255
MOVWF Y
VOLTA1: MOVLW .255
MOVWF X
VOLTA: DECFSZ X
GOTO VOLTA
DECFSZ Y
GOTO VOLTA1
DECFSZ K
GOTO VOLTA2
RETURN
;-----------------------------INTERRUPÇÃO-------------------------------------
TRATA_INT_EXT:
MOVLW .255
XORWF PORTD
BCF INTCON,INTF
BSF INTCON,INTE
RETURN
;-------------------------------------------------------------
; FIM
;-------------------------------------------------------------
END