Problema na hora de Gravar erro 0000h

Pessoal, to tentando compila esse exemplo do Livro Microcontroladores PIC uma abordagem pratica e objetiva PIC 16f628.
Segundo o exemplo proposto é para acender 4 leds conforme a frequencia do pino b3.
Mas ele da erro em 0000h.
Se eu tirar o CP_ON, compila e grava, mas o uC nao cumpre a funcao que foi programada.
alguma ideia?
;*********************************************************************************************
; PROGRAMA – DEFINE A FAIXA DE FREQUENCIA DO SINAL DE ENTRADA
; (0Hz A 35KHz)
; DESENVOLVIDO POR WAGNER DA SILVA ZANCO
; VERSAO 1.0
; 20/05/2004
;*********************************************************************************************
; ARQUIVOS DE DEFINICOES
;*********************************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA PIC16F628A
;*********************************************************************************************
; BITS DE CONFIGURACAO
;*********************************************************************************************
__CONFIG _BOREN_ON&_PWRTE_ON&_CP_ON&_WDT_ON&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;*********************************************************************************************
; PAGINACAO DA MEMORIA
;*********************************************************************************************
;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
BANK0 MACRO ;MACRO PARA SELECIONAR BANCO 0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM ;FIM DA MACRO BANK0
BANK1 MACRO ;MACRO PARA SELECIONAR BANCO 1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM ;FIM DA MACRO BANK1
;*********************************************************************************************
; VARIAVEIS
;*********************************************************************************************
;VARIAVEIS COM ESPELHO EM TODOS OS BANCOS DE MEMORIA.
;RECONHECIDAS EM QUALQUER BANCO.
FLAGS EQU 0x70 ;BITS DE SINALIZACAO
W_TEMP EQU 0x71 ;SALVA REG WORK
STATUS_TEMP EQU 0x72 ;SALVA REG STATUS
NUM_A1 EQU 0x73 ;PARTE ALTA DE A
NUM_A0 EQU 0x74 ;PARTE BAIXA DE A
NUM_B1 EQU 0x75 ;PARTE ALTA DE B
NUM_B0 EQU 0x76 ;PARTE BAIXA DE B
;*********************************************************************************************
; CONSTANTES
;*********************************************************************************************
;CONSTANTES UTILIZADAS PELO SISTEMA.
;BIT DO REGISTRADOR FLAGS
EVENTO_1 EQU .0
;*********************************************************************************************
; FLAGS
;*********************************************************************************************
;REGISTRADOR FLAGS
;
;BIT # |7|6| 5|4| 3|2| 1|0|
; |X|X|X|X|X|X|X|Y| EVENTO_1
; |X|X|X|X|X|X|Y|X| RESERVADO
; |X|X|X|X|X|Y|X|X| RESERVADO
; |X|X|X|X|Y|X|X|X| RESERVADO
; |X|X|X|Y|X|X|X|X| RESERVADO
; |X|X|Y|X|X|X|X|X| RESERVADO
; |X|Y|X|X|X|X|X|X| RESERVADO
; |Y|X|X|X|X|X|X|X| RESERVADO
;X = DEFINIDO EM OUTRO LUGAR DA TABELA
;Y = DEFINIDO COMO MOSTRADO (0/1)
;*********************************************************************************************
; ENTRADAS
;*********************************************************************************************
;PINOS QUE SERAO UTILIZADOS COMO ENTRADA
;PINO RB3/CCP1 - ENTRADA DO SINAL (0Hz ATE 35KHz)
;*********************************************************************************************
; SAIDAS
;*********************************************************************************************
;PINOS UTILIZADOS COMO SAIDA
#DEFINE LED1 PORTA,0 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED2 PORTA,1 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED3 PORTA,2 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED4 PORTA,3 ;0 --> APAGADO
;1 --> ACESO
;*********************************************************************************************
; VETOR DE RESET
;*********************************************************************************************
ORG 0x00 ;ENDEREO INICIAL DE PROCESSAMENTO
GOTO INICIO
;*********************************************************************************************
; INTERRUPCAO
;*********************************************************************************************
;A INTERRUPCAO DO MODULO CCP SERA TRATADA
ORG 0x04 ;ENDERECO INICAL DA INTERRUPCAO
BTFSS PIR1,CCP1IF ;INTERRUPCAO DO MODULO CCP ?
RETFIE ;NAO, RETORNA
;SIM, CONTINUA
BCF PIR1,CCP1IF ;DESATIVA FLAG DE INTERRUPCAO DO MODULO CCP
MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP
;*********************************************************************************************
; TRATAMENTO DA INTERRUPCAO DE ESTOURO DE TMR1
;*********************************************************************************************
BTFSS FLAGS,EVENTO_1 ;PRIMEIRA VEZ?
GOTO SALVA_TMR1 ;SIM, SALVA TIMER 1
;NAO, CONTINUA
MOVF CCPR1H,W
MOVWF NUM_A1 ;SALVA CONTEUDO, NUM_A1 RECEBE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_A0 ;SALVA CONTEUDO, NUM_A0 RECEBE CCPR1L
CALL SUB_16 ;CHAMA SUB-ROTINA
CALL ACIONA_LED ;CHAMA SUB-ROTINA
GOTO SAI_INT ;DESVIA
;*********************************************************************************************
;ESTA SUB-ROTINA SALVA O CONTEUDO DO CPR1H:CCPR1L QUANDO OCORRE A PRIMEIRA
;BORDA NO PINO RB3/CCP1.
SALVA_TMR1
BSF FLAGS,EVENTO_1 ;INDICA QUE OCORREU O PRIMEIRO EVENTO NO PINO RB3/CCP1
MOVF CCPR1H,W
MOVWF NUM_B1 ;NUM_B1 RECEBE CONTEUDO DE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_B0 ;NUM_B0 RECEBE CONTEUDO DE CCPR1H
GOTO SAI_INT ;DESVIA
;*********************************************************************************************
; SUB-ROTINA
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI DOIS NUMEROS DE 16 BITS, FORNECENDO, EM NUM_A1:NUM_A0,
;O MODULO DO RESULTADO SE ELE FOR POSITIVO E O COMPLEMENTO DE DOIS SE ELE FOR NEGATIVO.
SUB_16
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI A PARTE BAIXA DO TIMER 1
MOVF NUM_B0,W ;W RECEBE NUM_B0
SUBWF NUM_A0,F ;NUM_A0 = NUM_A0 - NUM_B0
BTFSS STATUS,C ;(NUM_A0 - W) E NEGATIVO?
GOTO RES_NEG_L ;SIM, DESVIA
GOTO RES_NAO_NEG_L ;NAO, DESVIA
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI MA PARTE ALTA DO TIMER 1 QUANDO O RESULTADO DA SUBTACAO DA
;PARTE BAIXA DER NEGATIVO.
RES_NEG_L
DECF NUM_A1,F ;DECREMENTA NUM_A1
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI MA PARTE ALTA DO VALOR CAPTURADO DO TMR1.
RES_NAO_NEG_L
MOVF NUM_B1,W ;W RECEBE NUM_B1
SUBWF NUM_A1,F ;NUM_A1 = NUM_A1 - NUM_B1
MOVF CCPR1H,W
MOVWF NUM_B1 ;SALVA CONTEUDO, NUM_B1 RECEBE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_B0 ;SALVA CONTEUDO, NUM_B0 RECEBE CCPR1L
RETURN
;*********************************************************************************************
;ESTA SUB-ROTINA ACIONA UM DOS LEDs, DE ACORDO COM A FREQUENCIA DO SINAL APLICADO
;NO PINO RB3/CCP1. A FAIXA DE FREQUENCIA E OBTIDA A PARTIR DA DIFERENCA
;CALCULADA ENTRE OS CONTEUDOS DO PAR DE REGs TMR1H:TMR1L, NAS DUAS ULTIMAS BORDAS ;CAPTURADAS.
;LED1 - FREQ MENOR OU IGUAL A 5KHz
;LED2 - FREQ MAIOR QUE 5KHz E MENOR OU IGUAL A 10KHz
;LED3 - FREQ MAIOR QUE 10KHz EMENOR OU IGUAL A 20KHz
;LED4 - FREQ MAIOR QUE 20KHz
;SE NUM_A1 FOR DIFERENTE DE 0 SIGNIFICA QUE O RESULTADO E MAIOR QUE 255,
;OU SEJA, A FREQUENCIA E MENOR QUE 5KHz
ACIONA_LED
MOVF NUM_A1,W ;W RECEBE NUM_A1
BTFSC STATUS,Z ;NUM_A1 E ZERO?
GOTO A1_ZERO ;SIM, DESVIA
;NAO, CONTINUA
;FREQ MENOR QUE 5KHz
A1_NAO_ZERO
CLRF PORTA ;LIMPA PORTA
BSF LED1 ;ACENDE LED1
RETURN ;RETORNA
;NUM_A1 = 0, VERIFICAR FAIXA DE FREQUENCIA
A1_ZERO
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .199 ;W=199-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_200 ;SIM, DESVIA
;NAO, CONTINUA
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .99 ;W=99-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_100 ;SIM, DESVIA
;NAO, CONTINUA
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .49 ;W=49-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_50 ;SIM, DESVIA
GOTO MENOR_50 ;NAO,DESVIA
;FREQ MENOR OU IGUAL A 5KHz
NAO_MENOR_200
CLRF PORTA ;LIMPA PORTA
BSF LED1 ;ACENDE LED1
RETURN ;RETORNA
;FREQ MAIOR QUE 5KHz E MENOR OU IGUAL A 10KHz
NAO_MENOR_100
CLRF PORTA ;LIMPA PORTA
BSF LED2 ;ACENDE LED2
RETURN ;RETORNA
;FREQ MAIOR QUE 10KHz EMENOR OU IGUAL A 20KHz
NAO_MENOR_50
CLRF PORTA ;LIMPA PORTA
BSF LED3 ;ACENDE LED3
RETURN ;RETORNA
;FREQ MAIOR QUE 20KHz
MENOR_50
CLRF PORTA ;LIMPA PORTA
BSF LED4 ;ACENDE LED4
RETURN ;RETORNA
;*********************************************************************************************
;ESTA SUB-ROTINA RESGATA OS CONTEUDOS DE W E STATUS E RETORNA AO PROGRAMA.
SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPCAO
;*********************************************************************************************
; INICIO
;*********************************************************************************************
INICIO
BANK1 ;ALTERA PARA BANCO1
MOVLW B'00000000'
MOVWF TRISA ;DEFINE PORTA COMO SAIDA
MOVLW B'00000000'
MOVWF TRISB ;DEFINE O PORTB COMO SAIDA
MOVLW B'10001110'
MOVWF OPTION_REG ;PULL_UPS DESABILIADOS <7>
;APLICA PRESCALER AO WDT <3>
;PRESCALER 1:64 NO WDT <2:0>
;DEMAIS BITS IRRELEVANTES
MOVLW B'00000000' ;CHAVE GERAL DE INTERRUPCAO DESLIGADA <7>
MOVWF INTCON ;INTERRUPCAO DE PERFERICOS DESATIVADAS <6>
;DEMAIS BITS IRRELEVANTES
BANK0 ;ALTERA PARA BANCO 0
MOVLW B'00000111' ;CONFIGURA RA3:RA0 COM I/O <2:0>
MOVWF CMCON
;*********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;*********************************************************************************************
CLRF PORTA ;LIMPA PORTA
CLRF FLAGS ;LIMPA FLAGS
CLRF TMR1H ;INICIALIZA TMR1H:TMR1L COM 0
CLRF TMR1L
;*********************************************************************************************
; AGUARDA WDT ESTOURAR
;*********************************************************************************************
WDT_MAIN
BTFSC STATUS,NOT_TO ;ESTOURO DO WDT?
GOTO $-1 ;NAO, AGUARDA WDT ESTOURAR
;SIM, CONTINUA
BANK1 ;ALTERA PARA BANCO 1
MOVLW B'10001000'
MOVWF OPTION_REG ;DESABILITA PULL-UPs<7>
;DIRECIONA PRESCALER PARA O WDT<3>
;PRESCALER 1:1 NO WDT <2:0>
;DEMAIS IRRELEVANTES
BANK0 ;ALTERA PARA BANCO 0
MOVLW B'00000110' ;CAPTURA BORDA DE SUBIDA, PRESCALER 1:4 <3:0>
MOVWF CCP1CON
MOVLW B'00100001' ;PRESCALER 1:4 <5:4>
MOVWF T1CON ;TMR1 INCREMENTADO PELO CICLO DE INSTRUCAO <1>
;HABILITA TMR1 <0>
;DEMAIS IRRELEVANTES
BANK1 ;ALTERA PARA BANCO 1
MOVLW B'11000000' ;CHAVE GERAL DE INTERRUPCAO LIGADA <7>
MOVWF INTCON ;INTERRUPCAO DE PERFERICOS ATIVADA <6>
MOVLW B'00000100' ;INTERRUPCAO DDO MODULO CCP SERA TRATADA <2>
MOVWF PIE1
BSF TRISB,3 ;CONFIGURA PINO RB3/CCP1 COMO ENTRADA <3>
BANK0 ;ALTERA PARA BANCO 0
;*********************************************************************************************
; ROTINA PRINCIPAL
;*********************************************************************************************
MAIN
CLRWDT ;APAGA WDT
GOTO $-1 ;VOLTA UMA LINHA
;*********************************************************************************************
END ;FIM DO PROGRAMA
;*********************************************************************************************
Segundo o exemplo proposto é para acender 4 leds conforme a frequencia do pino b3.
Mas ele da erro em 0000h.
Se eu tirar o CP_ON, compila e grava, mas o uC nao cumpre a funcao que foi programada.
alguma ideia?
;*********************************************************************************************
; PROGRAMA – DEFINE A FAIXA DE FREQUENCIA DO SINAL DE ENTRADA
; (0Hz A 35KHz)
; DESENVOLVIDO POR WAGNER DA SILVA ZANCO
; VERSAO 1.0
; 20/05/2004
;*********************************************************************************************
; ARQUIVOS DE DEFINICOES
;*********************************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA PIC16F628A
;*********************************************************************************************
; BITS DE CONFIGURACAO
;*********************************************************************************************
__CONFIG _BOREN_ON&_PWRTE_ON&_CP_ON&_WDT_ON&_LVP_OFF&_DATA_CP_OFF&_MCLRE_ON&_XT_OSC
;*********************************************************************************************
; PAGINACAO DA MEMORIA
;*********************************************************************************************
;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA
BANK0 MACRO ;MACRO PARA SELECIONAR BANCO 0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM ;FIM DA MACRO BANK0
BANK1 MACRO ;MACRO PARA SELECIONAR BANCO 1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM ;FIM DA MACRO BANK1
;*********************************************************************************************
; VARIAVEIS
;*********************************************************************************************
;VARIAVEIS COM ESPELHO EM TODOS OS BANCOS DE MEMORIA.
;RECONHECIDAS EM QUALQUER BANCO.
FLAGS EQU 0x70 ;BITS DE SINALIZACAO
W_TEMP EQU 0x71 ;SALVA REG WORK
STATUS_TEMP EQU 0x72 ;SALVA REG STATUS
NUM_A1 EQU 0x73 ;PARTE ALTA DE A
NUM_A0 EQU 0x74 ;PARTE BAIXA DE A
NUM_B1 EQU 0x75 ;PARTE ALTA DE B
NUM_B0 EQU 0x76 ;PARTE BAIXA DE B
;*********************************************************************************************
; CONSTANTES
;*********************************************************************************************
;CONSTANTES UTILIZADAS PELO SISTEMA.
;BIT DO REGISTRADOR FLAGS
EVENTO_1 EQU .0
;*********************************************************************************************
; FLAGS
;*********************************************************************************************
;REGISTRADOR FLAGS
;
;BIT # |7|6| 5|4| 3|2| 1|0|
; |X|X|X|X|X|X|X|Y| EVENTO_1
; |X|X|X|X|X|X|Y|X| RESERVADO
; |X|X|X|X|X|Y|X|X| RESERVADO
; |X|X|X|X|Y|X|X|X| RESERVADO
; |X|X|X|Y|X|X|X|X| RESERVADO
; |X|X|Y|X|X|X|X|X| RESERVADO
; |X|Y|X|X|X|X|X|X| RESERVADO
; |Y|X|X|X|X|X|X|X| RESERVADO
;X = DEFINIDO EM OUTRO LUGAR DA TABELA
;Y = DEFINIDO COMO MOSTRADO (0/1)
;*********************************************************************************************
; ENTRADAS
;*********************************************************************************************
;PINOS QUE SERAO UTILIZADOS COMO ENTRADA
;PINO RB3/CCP1 - ENTRADA DO SINAL (0Hz ATE 35KHz)
;*********************************************************************************************
; SAIDAS
;*********************************************************************************************
;PINOS UTILIZADOS COMO SAIDA
#DEFINE LED1 PORTA,0 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED2 PORTA,1 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED3 PORTA,2 ;0 --> APAGADO
;1 --> ACESO
#DEFINE LED4 PORTA,3 ;0 --> APAGADO
;1 --> ACESO
;*********************************************************************************************
; VETOR DE RESET
;*********************************************************************************************
ORG 0x00 ;ENDEREO INICIAL DE PROCESSAMENTO
GOTO INICIO
;*********************************************************************************************
; INTERRUPCAO
;*********************************************************************************************
;A INTERRUPCAO DO MODULO CCP SERA TRATADA
ORG 0x04 ;ENDERECO INICAL DA INTERRUPCAO
BTFSS PIR1,CCP1IF ;INTERRUPCAO DO MODULO CCP ?
RETFIE ;NAO, RETORNA
;SIM, CONTINUA
BCF PIR1,CCP1IF ;DESATIVA FLAG DE INTERRUPCAO DO MODULO CCP
MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP
;*********************************************************************************************
; TRATAMENTO DA INTERRUPCAO DE ESTOURO DE TMR1
;*********************************************************************************************
BTFSS FLAGS,EVENTO_1 ;PRIMEIRA VEZ?
GOTO SALVA_TMR1 ;SIM, SALVA TIMER 1
;NAO, CONTINUA
MOVF CCPR1H,W
MOVWF NUM_A1 ;SALVA CONTEUDO, NUM_A1 RECEBE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_A0 ;SALVA CONTEUDO, NUM_A0 RECEBE CCPR1L
CALL SUB_16 ;CHAMA SUB-ROTINA
CALL ACIONA_LED ;CHAMA SUB-ROTINA
GOTO SAI_INT ;DESVIA
;*********************************************************************************************
;ESTA SUB-ROTINA SALVA O CONTEUDO DO CPR1H:CCPR1L QUANDO OCORRE A PRIMEIRA
;BORDA NO PINO RB3/CCP1.
SALVA_TMR1
BSF FLAGS,EVENTO_1 ;INDICA QUE OCORREU O PRIMEIRO EVENTO NO PINO RB3/CCP1
MOVF CCPR1H,W
MOVWF NUM_B1 ;NUM_B1 RECEBE CONTEUDO DE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_B0 ;NUM_B0 RECEBE CONTEUDO DE CCPR1H
GOTO SAI_INT ;DESVIA
;*********************************************************************************************
; SUB-ROTINA
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI DOIS NUMEROS DE 16 BITS, FORNECENDO, EM NUM_A1:NUM_A0,
;O MODULO DO RESULTADO SE ELE FOR POSITIVO E O COMPLEMENTO DE DOIS SE ELE FOR NEGATIVO.
SUB_16
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI A PARTE BAIXA DO TIMER 1
MOVF NUM_B0,W ;W RECEBE NUM_B0
SUBWF NUM_A0,F ;NUM_A0 = NUM_A0 - NUM_B0
BTFSS STATUS,C ;(NUM_A0 - W) E NEGATIVO?
GOTO RES_NEG_L ;SIM, DESVIA
GOTO RES_NAO_NEG_L ;NAO, DESVIA
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI MA PARTE ALTA DO TIMER 1 QUANDO O RESULTADO DA SUBTACAO DA
;PARTE BAIXA DER NEGATIVO.
RES_NEG_L
DECF NUM_A1,F ;DECREMENTA NUM_A1
;*********************************************************************************************
;ESTA SUB-ROTINA SUBTRAI MA PARTE ALTA DO VALOR CAPTURADO DO TMR1.
RES_NAO_NEG_L
MOVF NUM_B1,W ;W RECEBE NUM_B1
SUBWF NUM_A1,F ;NUM_A1 = NUM_A1 - NUM_B1
MOVF CCPR1H,W
MOVWF NUM_B1 ;SALVA CONTEUDO, NUM_B1 RECEBE CCPR1H
MOVF CCPR1L,W
MOVWF NUM_B0 ;SALVA CONTEUDO, NUM_B0 RECEBE CCPR1L
RETURN
;*********************************************************************************************
;ESTA SUB-ROTINA ACIONA UM DOS LEDs, DE ACORDO COM A FREQUENCIA DO SINAL APLICADO
;NO PINO RB3/CCP1. A FAIXA DE FREQUENCIA E OBTIDA A PARTIR DA DIFERENCA
;CALCULADA ENTRE OS CONTEUDOS DO PAR DE REGs TMR1H:TMR1L, NAS DUAS ULTIMAS BORDAS ;CAPTURADAS.
;LED1 - FREQ MENOR OU IGUAL A 5KHz
;LED2 - FREQ MAIOR QUE 5KHz E MENOR OU IGUAL A 10KHz
;LED3 - FREQ MAIOR QUE 10KHz EMENOR OU IGUAL A 20KHz
;LED4 - FREQ MAIOR QUE 20KHz
;SE NUM_A1 FOR DIFERENTE DE 0 SIGNIFICA QUE O RESULTADO E MAIOR QUE 255,
;OU SEJA, A FREQUENCIA E MENOR QUE 5KHz
ACIONA_LED
MOVF NUM_A1,W ;W RECEBE NUM_A1
BTFSC STATUS,Z ;NUM_A1 E ZERO?
GOTO A1_ZERO ;SIM, DESVIA
;NAO, CONTINUA
;FREQ MENOR QUE 5KHz
A1_NAO_ZERO
CLRF PORTA ;LIMPA PORTA
BSF LED1 ;ACENDE LED1
RETURN ;RETORNA
;NUM_A1 = 0, VERIFICAR FAIXA DE FREQUENCIA
A1_ZERO
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .199 ;W=199-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_200 ;SIM, DESVIA
;NAO, CONTINUA
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .99 ;W=99-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_100 ;SIM, DESVIA
;NAO, CONTINUA
MOVF NUM_A0,W ;W RECEBE NUM_A0
SUBLW .49 ;W=49-W
BTFSS STATUS,C ;RESULTADO NEGATIVO?
GOTO NAO_MENOR_50 ;SIM, DESVIA
GOTO MENOR_50 ;NAO,DESVIA
;FREQ MENOR OU IGUAL A 5KHz
NAO_MENOR_200
CLRF PORTA ;LIMPA PORTA
BSF LED1 ;ACENDE LED1
RETURN ;RETORNA
;FREQ MAIOR QUE 5KHz E MENOR OU IGUAL A 10KHz
NAO_MENOR_100
CLRF PORTA ;LIMPA PORTA
BSF LED2 ;ACENDE LED2
RETURN ;RETORNA
;FREQ MAIOR QUE 10KHz EMENOR OU IGUAL A 20KHz
NAO_MENOR_50
CLRF PORTA ;LIMPA PORTA
BSF LED3 ;ACENDE LED3
RETURN ;RETORNA
;FREQ MAIOR QUE 20KHz
MENOR_50
CLRF PORTA ;LIMPA PORTA
BSF LED4 ;ACENDE LED4
RETURN ;RETORNA
;*********************************************************************************************
;ESTA SUB-ROTINA RESGATA OS CONTEUDOS DE W E STATUS E RETORNA AO PROGRAMA.
SAI_INT
SWAPF STATUS_TEMP,W
MOVWF STATUS ;RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ;RECUPERA W
RETFIE ;RETORNA DA INTERRUPCAO
;*********************************************************************************************
; INICIO
;*********************************************************************************************
INICIO
BANK1 ;ALTERA PARA BANCO1
MOVLW B'00000000'
MOVWF TRISA ;DEFINE PORTA COMO SAIDA
MOVLW B'00000000'
MOVWF TRISB ;DEFINE O PORTB COMO SAIDA
MOVLW B'10001110'
MOVWF OPTION_REG ;PULL_UPS DESABILIADOS <7>
;APLICA PRESCALER AO WDT <3>
;PRESCALER 1:64 NO WDT <2:0>
;DEMAIS BITS IRRELEVANTES
MOVLW B'00000000' ;CHAVE GERAL DE INTERRUPCAO DESLIGADA <7>
MOVWF INTCON ;INTERRUPCAO DE PERFERICOS DESATIVADAS <6>
;DEMAIS BITS IRRELEVANTES
BANK0 ;ALTERA PARA BANCO 0
MOVLW B'00000111' ;CONFIGURA RA3:RA0 COM I/O <2:0>
MOVWF CMCON
;*********************************************************************************************
; INICIALIZACAO DAS VARIAVEIS
;*********************************************************************************************
CLRF PORTA ;LIMPA PORTA
CLRF FLAGS ;LIMPA FLAGS
CLRF TMR1H ;INICIALIZA TMR1H:TMR1L COM 0
CLRF TMR1L
;*********************************************************************************************
; AGUARDA WDT ESTOURAR
;*********************************************************************************************
WDT_MAIN
BTFSC STATUS,NOT_TO ;ESTOURO DO WDT?
GOTO $-1 ;NAO, AGUARDA WDT ESTOURAR
;SIM, CONTINUA
BANK1 ;ALTERA PARA BANCO 1
MOVLW B'10001000'
MOVWF OPTION_REG ;DESABILITA PULL-UPs<7>
;DIRECIONA PRESCALER PARA O WDT<3>
;PRESCALER 1:1 NO WDT <2:0>
;DEMAIS IRRELEVANTES
BANK0 ;ALTERA PARA BANCO 0
MOVLW B'00000110' ;CAPTURA BORDA DE SUBIDA, PRESCALER 1:4 <3:0>
MOVWF CCP1CON
MOVLW B'00100001' ;PRESCALER 1:4 <5:4>
MOVWF T1CON ;TMR1 INCREMENTADO PELO CICLO DE INSTRUCAO <1>
;HABILITA TMR1 <0>
;DEMAIS IRRELEVANTES
BANK1 ;ALTERA PARA BANCO 1
MOVLW B'11000000' ;CHAVE GERAL DE INTERRUPCAO LIGADA <7>
MOVWF INTCON ;INTERRUPCAO DE PERFERICOS ATIVADA <6>
MOVLW B'00000100' ;INTERRUPCAO DDO MODULO CCP SERA TRATADA <2>
MOVWF PIE1
BSF TRISB,3 ;CONFIGURA PINO RB3/CCP1 COMO ENTRADA <3>
BANK0 ;ALTERA PARA BANCO 0
;*********************************************************************************************
; ROTINA PRINCIPAL
;*********************************************************************************************
MAIN
CLRWDT ;APAGA WDT
GOTO $-1 ;VOLTA UMA LINHA
;*********************************************************************************************
END ;FIM DO PROGRAMA
;*********************************************************************************************