Moderadores: 51, Renie, gpenga
;ROTINA DE DELAY DE 500 MS
PDELAY
PLOOP1 MOVLW .232
MOVWF PDELL1
PLOOP2 NOP
PDELL1 GOTO PDELL2
PDELL2 GOTO PDELL3
PDELL3 NOP
DECFSZ PDELL1
GOTO PLOOP2
DECFSZ PDELL1
GOTO PDELL4
PDELL4 GOTO PDELL5
PDELL5 GOTO PDELL6
PDELL6 GOTO PDELL7
PDELL7 NOP
RETURN
MPLINK 4.31, Linker
Copyright (c) 2009 Microchip Technology Inc.
Errors : 0
Loaded C:\Documents and Settings\rodrigo\Desktop\teste\1.cof.
----------------------------------------------------------------------
Debug build of project `C:\Documents and Settings\rodrigo\Desktop\teste\1.mcp' succeeded.
Language tool versions: MPASMWIN.exe v5.31, mplink.exe v4.31
Preprocessor symbol `__DEBUG' is defined.
Sat Feb 06 11:51:54 2010
----------------------------------------------------------------------
BUILD SUCCEEDED
RECEBEU_OK:
BTFSS APRENDER ; É PARA APRENDER ?
GOTO COMPARA ; N- COMPARA APENAS E TOMA A DECISÃO
GOTO APRENDE ; S- GRAVA NA EEPROM
FIM_RC:
BTFSS APRENDER
GOTO $+2
GOTO ESPERANDO
BSF CHAVE
GOTO PP
LIST P=12F629, R=HEX
#INCLUDE <P12F629.INC>
ERRORLEVEL -302
__CONFIG _CP_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT
; criado POR FABIO RICARDO DA SILVA
; PRO ENERGY SISTEMAS LTDA
; 06/06/2003 - 14:58 HRS
; LEITURA DE CÓDIGO/ APRENDISAGEM (GRAVAÇÃO E2PROM )
; ENCODER HT6P20B COM R/OSC DE 1,4 A 2,2 M-OHMS
; bt learn com pull up de 10K
;
;I/O defininições para PIC12F629
; +--------------------------------------------+
;VDD -(01)-|VDD VSS-|-(08)- GND
;N/U -(02)-|GP5/T1CKI/OSC1/CLKIN GP0/CIN+/ICSPDAT|-(07)- LED-LEARN
;OUT1 -(03)-|GP4/T1G-/OSC2/CLKOUT GP1/CIN-/ICSPCLK|-(06)- LEARN
;Reset -(04)-|GP3/MCLR-/VPP GP2/TOCKI/INT/COUT|-(05)- RFin
; +--------------------------------------------+
;%%%%%%%%%%%%%%%%%%%% PAGINAÇÃO DE BANCOS DE MEMÓRIA %%%%%%%%%%%%%%%%%%%%%%%%%%%%
#DEFINE BANK0 BCF STATUS, RP0
#DEFINE BANK1 BSF STATUS, RP0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;***********************************************
;************ PROGRAMA INICIAL ***************
;***********************************************
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PAGINAÇÃO DE VARIAVEIS %%%%%%%%%%%%%%%%%%%%%%%%%%
CBLOCK 0X20
CNTL ;SINC DECODER LOW
CNTH ;SINC DECODER HIG
BTEMPO ;CONTADOR DE TEMPO
AUX2 ;CONTADOR TEMPO
AUX ;CONTADOR TEMPO
BYTE1 ;LSB DADOS
BYTE2
BYTE3 ;MSB DADOS
TEMP ; VARIAVEL DO TEMPO DE ESPERA PARA APRENDIZAGEM
DADO ; PARA LEITURA E GRAVAÇÃO DA EEPROM
AUXILIAR ; ENDEREÇO PARA LEITURA E GRAVAÇÃO
NBITS ;VARIAVEL DO N° DE BITS A SEREM LIDOS
MAX ;VARIAVEL DO N° MÁXIMO DE CONTROLES A GRAVAR NA MEMORIA
FLAGS ;SINALIZAÇÕES DE LÓGICA DO SISTEMA
PDel0 ; VÁRIAVEL DELAY
PDel1 ;VARIAVEL DELAY
VAR ;VARIAVEL DE TEMPORISAÇÃO DE GRAVAÇÃO OU APAGAR
W_TEMP ; WORKS TEMPORÁRIO PARA INTERRUPÇÃO
STATUS_TEMP ; STATUS TEMPORÁRIO PARA INTERRUPÇÃO
ENDC
;%%%%%%%%%%%%%%%%%%%%%%% CONSTANTES DO SISTEMA ENTRADAS E SAIDAS %%%%%%%%%%%%%%%
#DEFINE LED GPIO,0 ; LED INDICATIVO DE ROTINA DE GRAVAÇÃO
#DEFINE LEARN GPIO,1 ; BOTÃO PARA APRENDISADO OU APAGAR MEMORIA
; R DE 10K PULL-UP E CHAVE PULL-DOWN
#DEFINE RFin GPIO,2 ; ENTRADA DO SINAL DIGITAL ( PINO 7 RECEPTOR )
#DEFINE OUT1 GPIO,4 ; SAÍDA DO RELÊ
;###############################################################################
#DEFINE CHAVE INTCON, GIE ; CHAVE GERAL DE INTERRUPÇÃO
#DEFINE APRENDER FLAGS, 1 ;FLAG PARA INFORMAR SE É PARA APRENDER
#DEFINE B0_FLAG FLAGS, 2 ;FLAG DE CONTROLE DA SAIDA DO RELÊ
#DEFINE TEMPO INTCON, T0IE ; flag para ligar a interrupção TMR0
#DEFINE FOI_TEMPO INTCON, T0IF ; FLAG DE ESTOURO POR TMR0
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIAL EQU 0X01 ; ENDEREÇO INICIAL DE LEITURA E COMPARAÇÃO DA EEPROM
POS_MEM EQU 0X00 ; ENDEREÇO QUE INDICA A ULTIMA CASA GRAVADA NA EEPROM
;&&&&&&&&&&&&&&&&&&INICIALIZAÇÃO DA EEPROM &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ORG H'2100'+POS_MEM
DE 0X00
;%%%%%%%%%%%%%%%%%%% INICIO DE MEMÓRIA DE PROGRAMA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 0X00
GOTO INICIO
;%%%%%%%%%%%%%%%%%%% VETOR DE INTERRUPÇÃO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 0X04
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ROTINA DE LEITURA DE CÓDIGO DO RECEPTOR DE RF. QUANDO CHAMADA, FAZ A LEITURA DO ENCODER
; E COMPARAÇÃO COM EEPROM, LIGANDO OU DESLIGANDO O RELÊ.E SE O FLAG APRENDER ESTIVER LIGADO
;ELE CAI NA ROTINA DE MEMORIZAÇÃO DO CÓDIGO.
;*********************************************
BANK0 ; HOUVE INTERRUPÇÃO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
BCF CHAVE ; DESLIGA chave global de interrupção
BTFSS FOI_TEMPO ; FOI ESTOURO DE TMR0 ?
GOTO RECEIVE ; NÃO ENTÃO É INT RB0
TIMER
BCF FOI_TEMPO ; SIM, !!! LIMPA FLAG TEMPO
CLRF TMR0 ; LIMPA VARIAVEL TMR0
BCF TEMPO ; DESLIGA CHAVE DE INTERRUPÇÃO TMR0
DECFSZ TEMP,F ; DECREMENTA VARIAVEL DE TEMPO = 6.535s
GOTO ESPERANDO ; VAI PARA ESPERAR NOVA INTERRUPÇÃO
GOTO SAI_LEARN ; VAI PARA SAIR DA APRENDISAGEM
ESPERANDO
;BCF FOI_TEMPO
BSF TEMPO ; LIGA CHAVE DE INTERRUPÇÃO DE TMR0
BSF CHAVE ; LIGA CHAVE GERAL DE INTERRUPÇÃO
NOP ; NÃO FAZ NADA
GOTO $-1 ; LOOPING ESPERANDO INT TMR0 OU RB0
SAI_LEARN
BTFSS LEARN ; O BOTÃO LEARN ESTA APERTADO
GOTO APAGA_TUDO ; sim APAGA TODA A MEMORIA
CLRF VAR ; não sai int
BCF LED ; APAGA LED DE SINALIZAÇÃO DE ESTADO DE PROGRAMAÇÃO
BCF APRENDER ; LIMPA FLAG QUE INFORMA QUE É PARA APRENDER
BCF TEMPO ; DESLIGA CHAVE DE TMR0
BCF FOI_TEMPO
BSF CHAVE ; LIGA CHAVE GERAL DE INTERRUPÇÃO
GOTO PP ; VAI PARA LOOPING PRINCIPAL
;*********************************************
RECEIVE: ;SINCRONISMO
MOVLW .8 ; 4 MHZ / .16 ;8 MHZ ;.4
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSS RFin ; <<XXXXXXX estava com logica invertida. aff
GOTO FIM_RC
DECFSZ CNTL,F
GOTO $-3
DECFSZ CNTH,F
GOTO $-7
SINCRONISMO_OK
MOVLW 018H ;(24D)
MOVWF NBITS
CLRF BYTE1
CLRF BYTE2
CLRF BYTE3
MOVLW .8 ; 4 MHZ / .16 ;8 MHZ ;.5
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSC RFin ;Espera entrada ficar 1
GOTO LERBITBASE ;
DECFSZ CNTL,F
GOTO $-3
DECFSZ CNTH,F
GOTO $-7
GOTO FIM_RC
LERBITBASE
MOVLW 0x7F ; 4 MHZ / 0X3D ;8 MHZ
MOVWF BTEMPO
BTFSS RFin ;[2]
GOTO CALC_TBASE ;[0]
INCFSZ BTEMPO,F ;[1]
GOTO $-3 ;[2]
GOTO FIM_RC
CALC_TBASE
MOVLW 0x7F ; 4 MHZ / 0X3D ;8 MHZ
SUBWF BTEMPO,F ;Recupera Base de Tempo Bit Inteiro
AGUARDAR_LW
CLRC
RRF BTEMPO,W ;
MOVWF CNTL ;
MOVF BTEMPO,W ;
MOVWF CNTH ;
RLF CNTH,W
MOVWF AUX2 ;AUX2=1/2 Te
BCF STATUS,C ;
RRF BYTE3,F ;
RRF BYTE2,F ;
RRF BYTE1,F ;
BTFSS RFin ; [2]
GOTO RECEBENDO_BITS ; [0]
DECFSZ AUX2,F ; [1]
GOTO $-3 ; [2]
GOTO FIM_RC
RECEBENDO_BITS
GOTO DL1
D_DL1
BTFSC RFin
GOTO FIM_RC
GOTO DL2
D_DL2
BCF BYTE3,7
BTFSS RFin
BSF BYTE3,7
GOTO DL3
D_DL3
BTFSS RFin
GOTO FIM_RC
DECFSZ NBITS,F
GOTO AGUARDAR_LW
GOTO RECEBEU_OK
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DL1:
DECFSZ CNTL,F ;[1]
GOTO $+2 ;[2]
GOTO $+2
GOTO $-3 ;[2]
CLRC
RRF CNTH,W ;
MOVWF CNTL ;Meio bit
GOTO D_DL1
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DL2
MOVFW CNTH
MOVWF AUX
DECFSZ AUX,F ;[1]
GOTO $+2 ;[2]
GOTO D_DL2
GOTO $-3 ;[2]
;***************************************************************
DL3
MOVFW CNTH
MOVWF AUX
DECFSZ AUX,F ;[1]
GOTO $+2 ;[2]
GOTO D_DL3
GOTO $-3 ;[2]
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ATÉ AQUI:
; Recebeu todos os 24 bits em Byte1,Byte2,Byte3
; Byte1=LSB
; Byte3=MSB
; Os botões do controle estarão nos bit's 6,7 do
; byte3
RECEBEU_OK:
BTFSS APRENDER ; É PARA APRENDER ?
GOTO COMPARA ; N- COMPARA APENAS E TOMA A DECISÃO
GOTO APRENDE ; S- GRAVA NA EEPROM
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;NÃO RECEBEU NADA
;FOI ERRO DE LEITURA
;APENAS UM RUIDO
;OU O CODIGO NÃO É DO HT6P20B
FIM_RC:
BTFSS APRENDER
GOTO $+2
GOTO ESPERANDO
BSF CHAVE
GOTO PP
;$$$$$$$$$$$$$$ configurações dos sfr's do sistema $$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIO
configuracoes:
BANK1 ; banco 1
MOVLW B'00001110' ;S = SAIDA / E= ENTRADA
MOVWF TRISIO ;GPIO/0-S/1-E/2-E/3-E/4-S/5-S
MOVLW B'11000111'
MOVWF OPTION_REG ; desliga pull ups, INTERRUPÇÃO RB0 SUBIDA , PRESCALER 1/256
MOVLW B'10000000'
MOVWF OSCCAL ;oscilador interno de 4 mhz -- ofset de 1/2 clock aprox 4mhz
BANK0 ; banco 0
MOVLW B'10010000'
MOVWF INTCON ; chave global de interrupção ligada
MOVLW B'00000111'
MOVWF CMCON ; desliga comparadores do porta
CLRF GPIO ; coloca GPIO toda a 0
CLRF BYTE1 ; limpeza de variáveis
CLRF BYTE2
CLRF BYTE3
CLRF VAR
CLRF FLAGS
;$$$$$$$$$$$$$$$$$$$$$$$ looping principal $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
PP:
BTFSS LEARN
GOTO PP1
GOTO $-2
PP1
BCF CHAVE
MOVLW .100
MOVWF TEMP
BSF APRENDER
BSF LED
BSF TEMPO
BSF CHAVE
NOP
GOTO $-1
APAGA_TUDO
BCF CHAVE
BCF APRENDER
BCF LED
CALL PDelay
BSF LED
CALL PDelay
BCF LED
CLRF VAR
MOVLW .90
MOVWF MAX
MOVLW 0X00
MOVWF AUXILIAR
MOVLW 0X00
MOVWF DADO
CALL GRAVA_E2PROM
APAGANDO
INCF AUXILIAR, F
MOVLW 0XFF
MOVWF DADO
CALL GRAVA_E2PROM
DECFSZ MAX, F
GOTO APAGANDO
BSF LED
CALL PDelay
BCF LED
CALL PDelay
BSF INTCON, GIE
GOTO PP
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE APRENDIZADO DO CÓDIGO DO CONTROLE GRAVAÇÃO NA EEPROM
APRENDE:
MOVLW 0X00
MOVWF AUXILIAR
CALL LE_E2PROM
MOVF DADO,W
MOVWF AUXILIAR
INCF AUXILIAR, F
MOVF BYTE1, W
MOVWF DADO
CALL GRAVA_E2PROM
INCF AUXILIAR, F
MOVF BYTE2, W
MOVWF DADO
CALL GRAVA_E2PROM
INCF AUXILIAR, F
MOVF BYTE3, W
MOVWF DADO
CALL GRAVA_E2PROM
MOVF AUXILIAR, W
MOVWF DADO
MOVLW 0X00
MOVWF AUXILIAR
CALL GRAVA_E2PROM
BCF APRENDER
BCF LED
CALL PDelay
BSF INTCON, GIE
GOTO PP
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ROTINA DE COMPARAÇÃO DO CÓDIGO RECEBIDO E COMPARAÇÃO COM A EEPROM
COMPARA:
CLRF AUXILIAR
CLRF MAX
MOVLW 0X01
MOVWF AUXILIAR
MOVLW .90
MOVWF MAX
LENDO_E2PROM
CALL LE_E2PROM
MOVF DADO, W
BCF STATUS, Z
XORWF BYTE1, W
BTFSS STATUS, Z
GOTO OUTRO
GOTO COMP
OUTRO
INCF AUXILIAR, F
DECFSZ MAX, F
GOTO LENDO_E2PROM
BSF INTCON, GIE
GOTO PP
COMP
INCF AUXILIAR, F
CALL LE_E2PROM
MOVF DADO, W
CLRZ
XORWF BYTE2, W
BTFSS STATUS, Z
GOTO OUTRO
INCF AUXILIAR, F
CALL LE_E2PROM
MOVF DADO, W
CLRZ
XORWF BYTE3, W
BTFSS STATUS, Z
GOTO OUTRO
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE EXECUÇÃO DOS BOTÕES CASO A COMPARAÇÃO COM EEPROM FOI OK
MAIN_LOOP
BSF OUT1
CALL PDelay
BCF OUT1
BSF CHAVE
GOTO PP
;B1_BT
; BTFSC B0_FLAG;
; GOTO BAIXO_1
; GOTO ALTO_1
;BAIXO_1;
; BCF B0_FLAG
; BSF OUT1
; GOTO FINAL
;ALTO_1
; BSF B0_FLAG
; BCF OUT1
; GOTO FINAL
;FINAL
; CALL PDelay
; BSF CHAVE
; GOTO PP
;#####################################################################
;#####################################################################
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE GRAVAÇÃO DA EEPROM - CHAMADA COM ENDEREÇO EM AUXILIAR E DADO EM DADO
GRAVA_E2PROM
MOVF AUXILIAR, W
BANK1
MOVWF EEADR
BANK0
MOVF DADO, W
BANK1
CLRF EEDATA
MOVWF EEDATA
BSF EECON1,WREN
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
BCF EECON1,WREN
BTFSC EECON1,WRERR
GOTO $-9 ; GRAVA_E2PROM+4
BTFSC EECON1,WR
GOTO $-3
BANK0
RETURN
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE LEITURA DA EEPROM - CHAMADA COM ENDEREÇO EM AUXILIAR E RETORNA COM DADO
;EN DADO
LE_E2PROM
CLRF DADO
MOVF AUXILIAR, W
BANK1
MOVWF EEADR
BSF EECON1, RD
NOP
NOP
MOVF EEDATA, W
BANK0
MOVWF DADO
RETURN
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;ROTINA DE DELAY DE 500 MS
PDelay movlw .239
movwf PDel0
PLoop1 movlw .232
movwf PDel1
PLoop2 NOP
PDelL1 goto PDelL2
PDelL2 goto PDelL3
PDelL3 NOP
decfsz PDel1, 1
goto PLoop2
decfsz PDel0, 1
goto PLoop1
PDelL4 goto PDelL5
PDelL5 goto PDelL6
PDelL6 goto PDelL7
PDelL7 NOP
return
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;Manual de Instruções;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Ao ser energizado um LED acende por alguns segundos sinalizando que o sistema está em funcionamento.
; Existe um botão localizado na placa que ao ser pressionado aguarda um sinal do
;controle remoto para realizar o aprendizado. Esse mesmo botão se pressionado e segurado
;realiza o apagamento da memória
versão / mantendo os leds acesos enquanto botão estiver pressionado sem pisca!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F84A, R=HEX
#INCLUDE <P16F84A.INC>
ERRORLEVEL -302
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;%%%%%%%%%%%%%%%%%%%% PAGINAÇÃO DE BANCOS DE MEMÓRIA %%%%%%%%%%%%%%%%%%%%%%%%%%%%
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;***********************************************
;************ PROGRAMA INICIAL ***************
;***********************************************
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PAGINAÇÃO DE VARIAVEIS %%%%%%%%%%%%%%%%%%%%%%%%%%
CBLOCK 0X0C
CNTL ;SINC DECODER LOW
CNTH ;SINC DECODER HIG
BTEMPO ;CONTADOR DE TEMPO
AUX2 ;CONTADOR TEMPO
AUX ;CONTADOR TEMPO
BYTE1 ;LSB DADOS
BYTE2
BYTE3 ;MSB DADOS
TEMP ; VARIAVEL DO TEMPO DE ESPERA PARA APRENDIZAGEM
DADO ; PARA LEITURA E GRAVAÇÃO DA EEPROM
AUXILIAR ; ENDEREÇO PARA LEITURA E GRAVAÇÃO
NBITS ;VARIAVEL DO N° DE BITS A SEREM LIDOS
MAX ;VARIAVEL DO N° MÁXIMO DE CONTROLES A GRAVAR NA MEMORIA
FLAGS ;SINALIZAÇÕES DE LÓGICA DO SISTEMA
PDel0 ; VÁRIAVEL DELAY
PDel1 ;VARIAVEL DELAY
VAR ;VARIAVEL DE TEMPORISAÇÃO DE GRAVAÇÃO OU APAGAR
W_TEMP ; WORKS TEMPORÁRIO PARA INTERRUPÇÃO
STATUS_TEMP ; STATUS TEMPORÁRIO PARA INTERRUPÇÃO
TEMP2 ;Variável temporária
cont1 ;Variável que controla se o botão está segurado
cont2 ;Variável que controla se o botão está segurado
ENDC
;%%%%%%%%%%%%%%%%%%%%%%% CONSTANTES DO SISTEMA ENTRADAS E SAIDAS %%%%%%%%%%%%%%%
#DEFINE LED PORTB,2 ; LED INDICATIVO DE ROTINA DE GRAVAÇÃO
#DEFINE BOTÃO PORTB,1 ; BOTÃO PARA APRENDIZADO OU APAGAR MEMORIA
; R DE 10K PULL-UP E CHAVE PULL-DOWN
#DEFINE RFin PORTB,0 ; ENTRADA DO SINAL DIGITAL ( PINO 7 RECEPTOR )
#DEFINE RELE1 PORTA,0 ; SAÍDA PARA o RELÉ1
#DEFINE RELE2 PORTA,1 ; SAÍDA PARA o RELÉ2
#DEFINE RELE3 PORTA,2 ; SAÍDA PARA o RELÉ3
;###############################################################################
#DEFINE CHAVE INTCON, GIE ; CHAVE GERAL DE INTERRUPÇÃO
#DEFINE APRENDER FLAGS, 1 ;FLAG PARA INFORMAR SE É PARA APRENDER
#DEFINE TEMPO INTCON, T0IE ; flag para ligar a interrupção TMR0
#DEFINE FOI_TEMPO INTCON, T0IF ; FLAG DE ESTOURO POR TMR0
#DEFINE SINAL INTCON, INTF ; FLAG DE ESTOURO POR TMR0
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIAL EQU 0X01 ; ENDEREÇO INICIAL DE LEITURA E COMPARAÇÃO DA EEPROM
POS_MEM EQU 0X00 ; ENDEREÇO QUE INDICA A ULTIMA CASA GRAVADA NA EEPROM
;&&&&&&&&&&&&&&&&&&INICIALIZAÇÃO DA EEPROM &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ORG H'2100'+POS_MEM
DE 0X00
;%%%%%%%%%%%%%%%%%%% INICIO DE MEMÓRIA DE PROGRAMA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 0X00
GOTO INICIO
;%%%%%%%%%%%%%%%%%%% VETOR DE INTERRUPÇÃO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 0X04
BANK0 ; HOUVE INTERRUPÇÃO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
BCF FOI_TEMPO ; SIM, !!! LIMPA FLAG TEMPO
CLRF TMR0 ; LIMPA VARIAVEL TMR0
DECFSZ TEMP,F ; DECREMENTA VARIAVEL DE TEMPO = 6.535s
retfie
BCF TEMPO
BTFSS BOTÃO ; O BOTÃO de aprendizado ainda permanece pressionado?
GOTO APAGA_TUDO ; sim APAGA TODA A MEMORIA
SAI_INT ; não sai interrupção
clrf VAR
bcf LED ; APAGA LED DE SINALIZAÇÃO DE ESTADO DE PROGRAMAÇÃO
bcf APRENDER ; LIMPA FLAG QUE INFORMA QUE É PARA APRENDER
bcf TEMPO ; DESLIGA CHAVE DE TMR0
bcf FOI_TEMPO
retfie
;*********************************************
;$$$$$$$$$$$$$$ configurações dos sfr's do sistema $$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIO
configuracoes:
CLRF PORTA
CLRF PORTB
BANK1
CLRF TRISA
MOVLW B'00000011'
MOVWF TRISB
MOVLW B'10000111'
MOVWF OPTION_REG ; desliga pull ups, INTERRUPÇÃO RB0 borda de descida , PRESCALER 1/256
BANK0
CLRF BYTE1 ; limpeza de variáveis
CLRF BYTE2
CLRF BYTE3
CLRF VAR
CLRF FLAGS
bsf LED ;Aguarda 3s com o LED aceso
movlw .6
movwf TEMP2
call PDelay
decfsz TEMP2
goto $-2
bcf LED
bsf CHAVE ;Habilitação geral das interrupções
;$$$$$$$$$$$$$$$$$$$$$$$ looping principal $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
PRINCIPAL
;Aguarda mudança borda de descida em RB0, o que indica presença de sinal
btfsc SINAL ;Sinal?
goto RECEIVE ;Sim
;Não
;Decrementa variáveis de controle dos relés
decfsz cont1
goto $+6
decfsz cont2
goto $+4
bcf RELE1
bcf RELE2
bcf RELE3
btfss BOTÃO ;Botão de aprendizagem foi pressionado?
GOTO APRENDIZAGEM ;sim
;não
goto PRINCIPAL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
APRENDIZAGEM
BTFSC APRENDER ;Entrou nessa subrotina anteriormente?
goto PRINCIPAL ;SIM
;NÃO
MOVLW .100
MOVWF TEMP
CLRF TMR0
BCF FOI_TEMPO
BSF APRENDER ;FLAG que informa que é para aprender
BSF LED
BSF TEMPO ;Habilita a interrupção do TIMER0
NOP
GOTO PRINCIPAL ;Irá aguardar a presença de sinal ou o estouro do TIMER0
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ROTINA DE LEITURA DE CÓDIGO DO RECEPTOR DE RF. QUANDO CHAMADA, FAZ A LEITURA DO ENCODER
; E COMPARAÇÃO COM EEPROM, LIGANDO OU DESLIGANDO O RELÉ.E SE O FLAG APRENDER ESTIVER LIGADO
; ELE CAI NA ROTINA DE MEMORIZAÇÃO DO CÓDIGO.
;*********************************************
RECEIVE: ;SINCRONISMO
bcf TEMPO ; DESLIGA CHAVE DE TMR0
bcf INTCON,INTF
MOVLW .8 ; 4 MHZ / .16 ;8 MHZ
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSc RFin
GOTO FIM_RC
DECFSZ CNTL,F
GOTO $-3
DECFSZ CNTH,F
GOTO $-7
SINCRONISMO_OK
MOVLW 018H ;(24D)
MOVWF NBITS
CLRF BYTE1
CLRF BYTE2
CLRF BYTE3
MOVLW .8 ; 4 MHZ / .16 ;8 MHZ
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSC RFin ;Espera entrada ficar 1
GOTO LERBITBASE
DECFSZ CNTL,F
GOTO $-3
DECFSZ CNTH,F
GOTO $-7
GOTO FIM_RC
LERBITBASE
MOVLW 0x7F ; 4 MHZ / 0X3D ;8 MHZ
MOVWF BTEMPO
BTFSS RFin ;[2]
GOTO CALC_TBASE ;[0]
INCFSZ BTEMPO,F ;[1]
GOTO $-3 ;[2]
GOTO FIM_RC
CALC_TBASE
MOVLW 0x7F ; 4 MHZ / 0X3D ;8 MHZ
SUBWF BTEMPO,F ;Recupera Base de Tempo Bit Inteiro
AGUARDAR_LW
CLRC
RRF BTEMPO,W ;
MOVWF CNTL ;
MOVF BTEMPO,W ;
MOVWF CNTH ;
RLF CNTH,W
MOVWF AUX2 ;AUX2=1/2 Te
BCF STATUS,C ;
RRF BYTE3,F ;
RRF BYTE2,F ;
RRF BYTE1,F ;
BTFSS RFin ; [2]
GOTO RECEBENDO_BITS ; [0]
DECFSZ AUX2,F ; [1]
GOTO $-3 ; [2]
GOTO FIM_RC
RECEBENDO_BITS
GOTO DL1
D_DL1
BTFSC RFin
GOTO FIM_RC
GOTO DL2
D_DL2
BCF BYTE3,7
BTFSS RFin
BSF BYTE3,7
GOTO DL3
D_DL3
BTFSS RFin
GOTO FIM_RC
DECFSZ NBITS,F
GOTO AGUARDAR_LW
GOTO RECEBEU_OK
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DL1:
DECFSZ CNTL,F ;[1]
GOTO $+2 ;[2]
GOTO $+2
GOTO $-3 ;[2]
CLRC
RRF CNTH,W ;
MOVWF CNTL ;Meio bit
GOTO D_DL1
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DL2
MOVFW CNTH
MOVWF AUX
DECFSZ AUX,F ;[1]
GOTO $+2 ;[2]
GOTO D_DL2
GOTO $-3 ;[2]
;***************************************************************
DL3
MOVFW CNTH
MOVWF AUX
DECFSZ AUX,F ;[1]
GOTO $+2 ;[2]
GOTO D_DL3
GOTO $-3 ;[2]
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ATÉ AQUI:
; Recebeu todos os 24 bits em Byte1,Byte2,Byte3
; Byte1=LSB
; Byte3=MSB
; Os botões do controle estarão nos bit's 6,7 do
; byte3
RECEBEU_OK:
BTFSS APRENDER ; É PARA APRENDER ?
GOTO COMPARA ; N- COMPARA APENAS E TOMA A DECISÃO
GOTO APRENDE ; S- GRAVA NA EEPROM
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;NÃO RECEBEU NADA
;FOI ERRO DE LEITURA
;APENAS UM RUIDO
;OU O CODIGO NÃO É DO HT6P20B
FIM_RC:
btfsc APRENDER
bsf TEMPO ; LIGA CHAVE DE INTERRUPÇÃO DE TMR0
goto PRINCIPAL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
APAGA_TUDO
BCF CHAVE
BCF APRENDER
BCF LED
CALL PDelay
BSF LED
CALL PDelay
BCF LED
CLRF VAR
MOVLW .90
MOVWF MAX
MOVLW 0X00
MOVWF AUXILIAR
MOVLW 0X00
MOVWF DADO
CALL GRAVA_E2PROM
APAGANDO
INCF AUXILIAR, F
MOVLW 0XFF
MOVWF DADO
CALL GRAVA_E2PROM
DECFSZ MAX, F
GOTO APAGANDO
BSF LED
CALL PDelay
BCF LED
CALL PDelay
GOTO SAI_INT
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE APRENDIZADO DO CÓDIGO DO CONTROLE GRAVAÇÃO NA EEPROM
APRENDE:
MOVLW 0X00
MOVWF AUXILIAR
CALL LE_E2PROM
MOVF DADO,W
MOVWF AUXILIAR
INCF AUXILIAR, F
MOVF BYTE1, W
MOVWF DADO
CALL GRAVA_E2PROM
INCF AUXILIAR, F
MOVF BYTE2, W
MOVWF DADO
CALL GRAVA_E2PROM
INCF AUXILIAR, F
MOVF BYTE3, W
MOVWF DADO
CALL GRAVA_E2PROM
MOVF AUXILIAR, W
MOVWF DADO
MOVLW 0X00
MOVWF AUXILIAR
CALL GRAVA_E2PROM
BCF APRENDER
BCF LED
CALL PDelay
GOTO PRINCIPAL
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ROTINA DE COMPARAÇÃO DO CÓDIGO RECEBIDO E COMPARAÇÃO COM A EEPROM
COMPARA:
CLRF AUXILIAR
CLRF MAX
MOVLW 0X01
MOVWF AUXILIAR
MOVLW .90
MOVWF MAX
LENDO_E2PROM
CALL LE_E2PROM
MOVF DADO, W
BCF STATUS, Z
XORWF BYTE1, W
BTFSS STATUS, Z
GOTO OUTRO
GOTO COMP
OUTRO
INCF AUXILIAR, F
DECFSZ MAX, F
GOTO LENDO_E2PROM
GOTO PRINCIPAL
COMP
INCF AUXILIAR, F
CALL LE_E2PROM
MOVF DADO, W
CLRZ
XORWF BYTE2, W
BTFSS STATUS, Z
GOTO OUTRO
INCF AUXILIAR, F
CALL LE_E2PROM
MOVF DADO, W
CLRZ
XORWF BYTE3, W
BTFSS STATUS, Z
GOTO OUTRO
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE EXECUÇÃO DOS BOTÕES CASO A COMPARAÇÃO COM EEPROM FOI OK
movlw b'11000000'
andwf BYTE3
movlw b'10000000'
xorwf BYTE3,w
btfsc STATUS,Z ;O Botão pressionado foi o 1? (10)
goto botao1 ;sim
;não
movlw b'01000000'
xorwf BYTE3,w
btfsc STATUS,Z ;00?
goto botao2 ;sim
;não
movlw b'11000000'
xorwf BYTE3,w
btfsc STATUS,Z ;00?
goto botao3 ;sim
;não
GOTO PRINCIPAL
botao1
clrf cont1
movlw .30
movwf cont2
BSF RELE1
goto PRINCIPAL
botao2
clrf cont1
movlw .30
movwf cont2
BSF RELE2
goto PRINCIPAL
botao3
clrf cont1
movlw .30
movwf cont2
BSF RELE3
goto PRINCIPAL
;##############################################################################
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE GRAVAÇÃO DA EEPROM - CHAMADA COM ENDEREÇO EM AUXILIAR E DADO EM DADO
GRAVA_E2PROM
MOVF AUXILIAR, W
MOVWF EEADR
MOVF DADO, W
CLRF EEDATA
MOVWF EEDATA
BANK1
BCF EECON1,WRERR
BSF EECON1,WREN
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
BCF EECON1,WREN
BTFSC EECON1,WRERR
GOTO $-9 ; GRAVA_E2PROM+4
BTFSC EECON1,WR
GOTO $-3
BANK0
RETURN
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;ROTINA DE LEITURA DA EEPROM - CHAMADA COM ENDEREÇO EM AUXILIAR E RETORNA COM DADO
;EM DADO
LE_E2PROM
CLRF DADO
MOVF AUXILIAR, W
MOVWF EEADR
BANK1
BSF EECON1, RD
NOP
NOP
BANK0
MOVF EEDATA, W
MOVWF DADO
RETURN
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;ROTINA DE DELAY DE 500 MS
PDelay movlw .239
movwf PDel0
PLoop1 movlw .232
movwf PDel1
PLoop2 NOP
PDelL1 goto PDelL2
PDelL2 goto PDelL3
PDelL3 NOP
decfsz PDel1, 1
goto PLoop2
decfsz PDel0, 1
goto PLoop1
PDelL4 goto PDelL5
PDelL5 goto PDelL6
PDelL6 goto PDelL7
PDelL7 NOP
return
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
END
Voltar para Circuitos Diversos
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante