Moderadores: 51, Renie, gpenga
RECEIVE: ;SINCRONISMO
MOVLW .8 ; 4 MHZ / .16 ;8 MHZ ;.4
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSS RFin
GOTO FIM_RC ; fim RC é pra sair da rotina pois não é 6P20
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
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
phophollety escreveu:Se estaba bom agora ficou melhor ainda!!!!
Vou tentar rodar o código no F84 =D (todo mundo olha torto quando eu digo que uso F84 eheeh)
LIST P=16F628A, R=HEX
INCLUDE <P16F628A.INC>
ERRORLEVEL -302
__CONFIG _CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_OFF & _XT_OSC
; CRIADO POR FABIO RICARDO DA SILVA
; PRO ENERGY SISTEMAS LTDA
; 25/05/2005 - HRS 10:50
; PARA ENCODER'S HCS UNIVERSAL
; HT6P20 QUALQUER RESISTOR AUTO SINC
; FREQUENCIA DE CLOCK 8 MHZ EXTERNO
;I/O definições para PIC16F628A
; +----------------------------------+
;Led learn -(01)-|RA2/AN2/VREF U AN1/RA1|-(18)- NC
;botãolearn -(02)-|RA3/AN3/CMP1 AN0/RA0|-(17)- NC
;NC -(03)-|RA4/TOCKI/CNP2 OSC1/CLHIN/RA7|-(16)- NC
;Reset -(04)-|RA5/MCLR/VPP OSC2/CLHOUT/RA6|-(15)- NC
;GND -(05)-|Vss Vdd|-(14)- +5V
;Entrada RF -(06)-|RB0/INT T1OSI/PGC/RB7|-(13)- DATA
;Rele 01 -(07)-|RB1/RX/DT T1OSO/T1CKI/PGC/RB6|-(12)- CLOCK
;Rele 02 -(08)-|RB2/TX/CK RB5|-(11)- NC
;Rele 03 -(09)-|RB3/CCP1 PGM/RB4|-(10)- Rele 04
; +----------------------------------+
;%%%%%%%%%%%%%%%%%%%% 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
;HT6P20
CNTL
CNTH
BYTE1
BYTE2
BYTE3
DADO
TEMP
AUXILIAR
BTEMPO
AUX2
NBITS
AUX
ENDERECO
MAX
FLAGS
PDel0
PDel1
VAR
;HCS
FLAGS_HCS
contador_p1_hc
contador_bits
contador_time_out
contador_calibracao_l
contador_calibracao_h
TMP
BTS
ENDC
;%%%%%%%%%%%%%%%%%%%%%%% CONSTANTES DO SISTEMA ENTRADAS E SAIDAS %%%%%%%%%%%%%%%
#define LED PORTA,2 ; // i learn Led OUT
#define LEARN PORTA,3 ; // o Learn button IN
#define RFin PORTB,0 ; RA1 // i radio signal input
#define OUT0 PORTB,1 ;
#define OUT1 PORTB,2 ;
#define OUT2 PORTB,3 ;
#define OUT3 PORTB,4 ;
;###############################################################################
#DEFINE RECEBIDO_OK FLAGS, 0
#DEFINE APRENDER FLAGS, 1
#DEFINE preambulo_ok FLAGS_HCS, 0
#DEFINE HCS_FUNCOES FLAGS_HCS, 1
#define S0 TEMP, 5
#define S1 TEMP, 6
#define S2 TEMP, 7
#define S3 TEMP, 4
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIAL EQU 0X01 ; ENDEREÇO INICIAL DE LEITURA E COMPARAÇÃO DA EEPROM
POS_MEM EQU 0X00
;&&&&&&&&&&&&&&&&&&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 ELE VOLTA
; CON CARRYER EM 1 SE CODIGO LIDO OK E CARRYER 0 SE CODIGO NÃO LIDO
BANK0
leitura_codigo_HCXXX:
BCF INTCON, INTF
BCF INTCON, GIE
CLRF BYTE1
CLRF BYTE2
CLRF BYTE3
GOTO detecta_preambulo
REDETECTA
BTFSS preambulo_ok
GOTO CODIGO_INCORRETO
;*********************************************************
MOVLW .64
MOVWF contador_bits
alc06:
CLRF contador_p1_hc
alc00:
NOP
NOP
NOP
NOP
NOP
BTFSS RFin
GOTO alc01
INCFSZ contador_p1_hc, F
GOTO alc00
GOTO CODIGO_INCORRETO
alc01:
MOVLW .208
SUBWF contador_p1_hc, W
BTFSC STATUS, C
GOTO CODIGO_INCORRETO
MOVLW .112
SUBWF contador_p1_hc, W
BTFSC STATUS, C
GOTO alc02
MOVLW .104
SUBWF contador_p1_hc, W
BTFSC STATUS, C
GOTO CODIGO_INCORRETO
MOVLW .56
SUBWF contador_p1_hc, W
BTFSS STATUS, C
BSF STATUS, C
GOTO alc03
alc02:
BCF STATUS, C
alc03:
RRF BYTE3, F ;L
RRF BYTE2, F ;L
RRF BYTE1, F ;L
DECFSZ contador_bits, F
GOTO alc04
BSF HCS_FUNCOES
BTFSS APRENDER
GOTO COMPARA
GOTO APRENDE
alc04:
CLRF contador_p1_hc
alc05:
NOP
NOP
NOP
NOP
NOP
NOP
BTFSC RFin
GOTO alc06
INCFSZ contador_p1_hc, F
GOTO alc05
GOTO CODIGO_INCORRETO
CODIGO_INCORRETO:
BCF INTCON, INTF
BSF INTCON, GIE
GOTO PP
; faz a detecção do preambulo e salta se tudo ok
detecta_preambulo:
BCF preambulo_ok
BTFSS RFin
GOTO header_invalido
CLRF contador_time_out
MOVLW .80
MOVWF contador_time_out
dp00:
BTFSS RFin
GOTO dp01
INCFSZ contador_time_out, F
GOTO dp00
GOTO HT6P20
dp01:
CLRF contador_calibracao_h
CLRF contador_calibracao_l
dp03:
BTFSC RFin
GOTO dp04
INCFSZ contador_calibracao_l, F
GOTO dp03
INCFSZ contador_calibracao_h, F
GOTO dp03
GOTO header_invalido
dp04:
MOVLW 0X07
CLRC
SUBWF contador_calibracao_h, W
BTFSC STATUS, C
GOTO header_invalido
MOVLW 0X05
CLRC
SUBWF contador_calibracao_h, W
BTFSS STATUS, C
GOTO header_invalido
BSF preambulo_ok
GOTO REDETECTA
header_invalido:
GOTO REDETECTA
;########################################################################
; SE PREAMBULO DO HCS NOK ENTÃO CAI AQUI NO 6P20
HT6P20
CLRF TMP
MOVLW .60
MOVWF TMP
HT6P20B_2
BTFSS RFin
GOTO RECEIVE
DECFSZ TMP, F
GOTO HT6P20B_2
GOTO CODIGO_INCORRETO
RECEIVE: ;SINCRONISMO
MOVLW .16
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
BCF LED
MOVLW .16
MOVWF CNTH
MOVLW .200
MOVWF CNTL
BTFSC RFin
GOTO LERBITBASE
DECFSZ CNTL,F
GOTO $-3
DECFSZ CNTH,F
GOTO $-7
GOTO FIM_RC
LERBITBASE
MOVLW 0X3D
MOVWF BTEMPO
BTFSS RFin ;[2]
GOTO CALC_TBASE ;[0]
INCFSZ BTEMPO,F ;[1]
GOTO $-3 ;[2]
GOTO FIM_RC
CALC_TBASE
MOVLW 0X3D
SUBWF BTEMPO, F
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
CALL DL1
BTFSC RFin
GOTO FIM_RC
CALL DL2
BCF BYTE3,7
BTFSS RFin
BSF BYTE3,7
CALL DL2
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
RETURN
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DL2
MOVFW CNTH
MOVWF AUX
DECFSZ AUX,F ;[1]
GOTO $+2 ;[2]
RETURN
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:
BCF INTCON, INTF ; limpa flag de interrupção do PORTB
BTFSS APRENDER ; É PARA APRENDER ?
GOTO COMPARA ; NÃO ENTÃO COMPARA
GOTO APRENDE ; SIM ENTÃO GRAVA NA MEMÓRIA
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;NÃO RECEBEU NADA
FIM_RC:
BCF INTCON, INTF
BSF INTCON, GIE
CALL PDelay
GOTO PP
;$$$$$$$$$$$$$$ configurações dos sfr's do sistema $$$$$$$$$$$$$$$$$$$$$$$$$$$
INICIO
configuracoes:
BANK1
MOVLW B'00000001' ; portb 0 como entrada
MOVWF TRISB
MOVLW B'00001000' ; porta 3 saida
MOVWF TRISA
MOVLW B'10010000' ; int con gie DESLIgado
MOVWF INTCON
MOVLW B'11000111' ; desliga pull ups / preescaler trm0 16 65,535 ms
MOVWF OPTION_REG
;BSF PCON, OSCF ; oscilador interno de 4mhz
BANK0
MOVLW B'00000111' ; desliga comparadores do porta
MOVWF CMCON
CLRF BYTE1 ; limpeza de variáveis
CLRF BYTE2
CLRF BYTE3
CLRF PORTA
CLRF PORTB
CLRF FLAGS_HCS
;$$$$$$$$$$$$$$$$$$$$$$$ looping principal $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
PP:
BTFSS LEARN
GOTO PP1
GOTO $-2
PP1
BSF APRENDER
BSF LED
MOVLW .10
MOVWF VAR
CALL PDelay
DECFSZ VAR, F
GOTO $-2
BTFSS LEARN
GOTO APAGA_TUDO
BCF APRENDER
BCF LED
CLRF VAR
GOTO PP
APAGA_TUDO
BCF INTCON, GIE
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:
BTFSS HCS_FUNCOES
GOTO $+5
MOVLW B'00001111'
ANDWF BYTE3,F
BCF HCS_FUNCOES
GOTO $+3
MOVLW B'00111111'
ANDWF BYTE3, F
NOP
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
;BANK1
BSF INTCON, GIE
;BANK0
GOTO PP
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ROTINA DE COMPARAÇÃO DO CÓDIGO RECEBIDO E COMPARAÇÃO COM A EEPROM
COMPARA:
BTFSS HCS_FUNCOES
GOTO $+5
MOVF BYTE3, W
MOVWF TEMP
MOVLW B'00001111'
GOTO $+4
MOVF BYTE3, W
MOVWF TEMP
MOVLW B'00111111'
ANDWF BYTE3, F
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
; BANK1
BSF INTCON, GIE
;BANK0
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
BTFSS HCS_FUNCOES
GOTO $+2
GOTO EXECUTA_BOTAO
NOP
MOVLW B'11000000'
ANDWF TEMP, F
MOVLW B'11000000'
XORWF TEMP, W
BTFSS STATUS, Z ; os dois botões apertados
GOTO $+5
BSF OUT2
CALL PDelay
BCF OUT2
GOTO FINAL
BTFSS TEMP, 7 ; botão 1 apertado
GOTO $+5
BSF OUT0
CALL PDelay
BCF OUT0
GOTO $+4
BSF OUT1 ; então botão 2 apertado
CALL PDelay
BCF OUT1
FINAL
CALL PDelay
; BANK1
BSF INTCON, GIE
; BANK0
GOTO PP
;###########################################################################
;ROTINA DE EXECUÇÃO DOS BOTÕES HCS
EXECUTA_BOTAO
BCF HCS_FUNCOES
BT2
BTFSS S2 ;STATUS, Z
GOTO BT1
BSF OUT2
CALL PDelay
BCF OUT2
GOTO CODIGO_INCORRETO
BT1
BTFSS S1 ;STATUS, Z
GOTO BT0
BSF OUT1
CALL PDelay
BCF OUT1
GOTO CODIGO_INCORRETO
BT0
BTFSS S0 ;STATUS, Z
GOTO BT3
BSF OUT0
CALL PDelay
BCF OUT0
GOTO CODIGO_INCORRETO
BT3
BTFSS S3
GOTO $+4
BSF OUT3
CALL PDelay
BCF OUT3
GOTO CODIGO_INCORRETO
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;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
NOP
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
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; FINITO, THE END, O FIN,FINZOVISZK ACABOU ESSA NARQUIA
END
Voltar para Circuitos Diversos
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante