Página 1 de 1

Por que a interrupção demora para ser atendida?

MensagemEnviado: 23 Abr 2011 00:25
por Kleber
Oi pessoal!

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

MensagemEnviado: 23 Abr 2011 10:44
por RobL
Em OPTION_REG esta setada para gerar int externa na borda de descida.
Se a descida da porta estiver lenta, pode estar aí o seu problema.
Veja se há algum capacitor ligado a esta porta.
Faça um teste setando na subida do pulso, mudando para 1L em OptionReg.

No serviço de int, limpe somente o flag. Não precisa setar a interrupção novamente.

Há um problema maior na sua rotina de int.Troque RETURN por RETFIE , pois se não, não tem mais interrupção. Mais provável estar aí seu erro.

Editando: Está certa tem seu RETFIE ao retornar da chamada. Então veja se seu pulso está descendo rápido, na porta

MensagemEnviado: 23 Abr 2011 13:29
por Kleber
RobL escreveu:Em OPTION_REG esta setada para gerar int externa na borda de descida.
Se a descida da porta estiver lenta, pode estar aí o seu problema.
Veja se há algum capacitor ligado a esta porta.
Faça um teste setando na subida do pulso, mudando para 1L em OptionReg.


Estou utilizando a Placa PIC Genios 18F da Microgenios.
A chave tactil do kit quando acionada envia nível lógico Zero, assim é mais interessante, pois quando pressiono a chave, ativa a interrupção. Irei mudar a borda de acionamento, mas teoricamente, não vejo muito sentido nisto se resolver o problema. O meu teste prático, é acionar o botão rapidamente diversas vezes e então o PORTD deveria ser complementado segundo a velocidade de acionamento do botão, mas é uma lerdeza danada! Imagine se isto fosse um sensor de um dispositivo de segurança, iria matar uma pessoa! Pode?

Vou verificar se existe alguma carga ligada ao pino RB0.

Se tiver mais alguma sugestão, manda aí. Por enquanto, vou ver o que posso fazer por aqui.rs

Valeu!

MensagemEnviado: 23 Abr 2011 14:44
por RobL
Se sua chave vai a zero, então a int ocorre.
Se as vezes reage conforme esperado e em outras tentativas não muda a porta, pode ser falta de debounce, ou seja, está mudando várias vezes, e ao verificar a porta está no mesmo estado anterior, mas já mudou diversas vezes, quando pressionado (virou um jogo de dados com apenas 2 números, zero e um).
Coloque um C de 100nF x 50V cerâmico, da porta para a referência, e veja se passa a funcionar, ou faça um debounce por software.

MensagemEnviado: 23 Abr 2011 16:45
por Djalma Toledo Rodrigues
Não basta RETFIE

tem antes restabelecer Flag de pedido interrupção

DJ

MensagemEnviado: 23 Abr 2011 20:33
por Kleber
Bom pessoal, tentei elaborar uma rotina para evitar o efeito Bounce, mas sinceramente, não adiantou muito.(rs) Não sei o motivo, acredito que o debounce deve estar errado ou no lugar incorreto. Alguma sugestão de correção?

RobL, coloquei o capacitor de 100nF que você citou, aí sim, melhorou bastante, entretanto, ainda não é o ideal.

Djalma Toledo Rodrigues, faltava zerar a Flag de Interrupção antes de REFTIE? Era isto? Vale lembrar que anteriormente, fiz isto dentro da rotina de tratamento da interrupção.


Segue o código modificado.
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               ;
      X1
      Y1
      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
      
      BCF INTCON,INTF         ;FLAG INTF = 0. AGUARDA NOVA INTERRUPÇÃO.
      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


DELAY_10MS:            ;ROTINA DE DELAY DE APROXIMADAMENTE 10ms
   
      MOVLW .26
      MOVWF Y1
VT1:   MOVLW .255
      MOVWF X1
VT:      DECFSZ X1
      GOTO VT
      DECFSZ Y1
      GOTO VT1
      RETURN

;-----------------------------INTERRUPÇÃO-------------------------------------

TRATA_INT_EXT:
      CALL DELAY_10MS      ;DELAY PARA EVITAR EFEITO BOUNCE
SOLTA:   BTFSS BT0         ;BTO SOLTO? SIM, SEGUE O PROGRAMA.
      GOTO SOLTA         ;SENÃO, AGUARDA SOLTAR.

      CALL DELAY_10MS      ;DELAY PARA EVITAR EFEITO BOUNCE
      MOVLW .255
      XORWF PORTD         ;INVERTE O ESTADO DO PORTD
      
      RETURN

;-------------------------------------------------------------
;                     FIM
;-------------------------------------------------------------      
      END


Obrigado a todos vocês que tem ajudado!

MensagemEnviado: 23 Abr 2011 22:27
por RobL
Parece estar com um problema de instabilidade por hardware.
Tem capacitor cerâmico de desacoplamento de 100nF entre Vdd e Vss do PIC ? Se não tiver coloque-o lá, bem em cima dos pinos Vdd e Vss.
Essa sua referência, da porta da int externa está muito afastada do pino de Vdd?
Sua fonte está estável, e com baixa ondulação? Tem um eletrolítico de pequeno valor próximo ao Vdd e Vss, além do cerâmico bem em cima dos pinos? Se não tiver coloque-o lá.
Os outro pinos que não estão sendo usados, estão como saída ? Se estiverem como entrada, todos tem que estar com baixa impedância para a referência zero. Para teste, use todos como saída.

Se estiver usando oscilador a cristal, passe o teste para oscilador interno. Se isso resolver, sua malha do oscilador está ruim.

Tem lâmpada fluorescente ligada, próximo ou em cima da placa, motor ou outra fonte de ruído ? Que tem ruído por aí, parece que tem.

MensagemEnviado: 24 Abr 2011 01:02
por Kleber
RobL, como eu havia dito anteriormente, estou utilizando a Placa de Desenvolvimento PICGenios 18F. Você havia orientado, para verificar se não havia nenhuma carga ligada ao PORTB, de fato existe! Leds. O PortB do kit tem compartilhado 8 leds e os botões de interrupções. Ou seja, no hardware do kit, ou você habilita os leds, ou as interrupções. Mudei o programa para o PORTD e tudo está funcionando corretamente. Neste caso não precisei do capacitor e da rotina de Debounce.
Bom, neste programa eu coloquei o pino RD0(LED) como pisca-pisca 1s e o pino RD1(LED1) o seu estado invertido a cada interrupção.


Muito obrigado a todos pelas orientações !!!

Segue o código modificado.

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 PORTD,0
#DEFINE LED1 PORTD,1
#DEFINE BT0 PORTB,0
#DEFINE FLAG_RD1 FLAG,0      
      
      CBLOCK 0X20
      W_TEMP
      STATUS_TEMP
      X               ; X,Y E K VARIÁVEIS DO DELAY POR SW.
      Y               ;
      K               ;
      X1
      Y1
      W2               ; VARIÁVEL PARA GUARDAR O VALOR DE WREG ANTES DE ENTRAR NA
                     ; INTERRUPÇÃO
      FLAG
      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
      
      BCF INTCON,INTF         ;FLAG INTF = 0. AGUARDA NOVA INTERRUPÇÃO.
      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 DO PORTD.
      
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


DELAY_10MS:            ;ROTINA DE DELAY DE APROXIMADAMENTE 10ms
   
      MOVLW .26
      MOVWF Y1
VT1:   MOVLW .255
      MOVWF X1
VT:      DECFSZ X1
      GOTO VT
      DECFSZ Y1
      GOTO VT1
      RETURN

;-----------------------------INTERRUPÇÃO-------------------------------------
TRATA_INT_EXT:
   
      BTFSC FLAG_RD1
      GOTO DESL_LED
      BSF LED1
      BSF FLAG_RD1
      RETURN

DESL_LED:   
      BCF LED1
      BCF FLAG_RD1
      RETURN

;-------------------------------------------------------------
;                     FIM
;-------------------------------------------------------------      
      END