;******************************************************************************************************** ; RX_GEN_HCS_2C_V2.ASM - RECEPTOR DE ENCODER GENERICO DE 2 CANAIS ; ;******************************************************************************************************** ; FUNÇÃO: RECEBER SINAIS DE CI HCS200/201/300/301 E DECODIFICAR ; ACIONANDO SAIDAS NO PIC (2 CANAIS). ; OBS. GRAVAR A MESMA CHAVE NO HCS E NO PIC PARA FUNCIONAR. ; GRAVADOR: USE HCS_PROG PO HCS_PROG_TINY PARA GRAVAR HCS200...301. ; CAPACIDADE PARA 16 CONTROLES REMOTOS (CHAVEIRINHOS), SENDO ESTE ; NÚMERO A SOMATÓRIA DOS CANAIS 'A' E 'B'. ; ;************************************************************************************************************ ; BASEADO EM NOTE APPLICATIONS MICROCHIP E ADAPTADO PARA FUNCIONAR COM EEPROM INTERNA DO ; PIC 12F629. USE OSCILADOR INTERNO DE 4 MHZ. RESET INTERNO (PINO COMO ENTRADA) ; PINAGEM DO PIC 12F629: ; PINO 1- GND ; PINO 2- LED0 A MASSA VIA RESISTOR DE 1K (SAIDA S0) CANAL 'A' ; PINO 3- LED0 A MASSA VIA RESISTOR DE 1K (SAIDA S3) CANAL 'B' ; PINO 4- IN RF (SINAL DO RX) ; PINO 5- LED2 A MASSA VIA RESISTOR DE 1K (SAIDA S2) CANAL 'B' ; PINO 6- LED1 A MASSA VIA RESISTOR DE 1K (SAIDA S1)C ANAL 'A' ; PINO 7- LED LEARN + 2K2 AO VCC E CHAVE 'LEARN' A MASSA VIA RESISTOR 220 OHMS ; (APERTE PARA APRENDER TRANSMISSOR NOVO) ; PINO 8-5V (+VCC) ; JUMPER NO PINO 3 QUE LIGA RESISTOR DE 1K AO VCC, JÁ TENDO UM PULLDOWM TAMBÉM DE 1K. ; OBS. AO RETIRAR O JUMPER, O PUL DOWN POLARIZADA PARA NIVEL '0'.COM JUMPER COLOCADO, ; TEMOS 2,5 VOLTS, OU SEJA , NIVEL '1'. ; AO GRAVAR OS CONTROLES, PARA CANAL 'A', COLOQUE O JUMPER E RETIRE PARA O 'B'. ; OBS. JUMPER TEM FUNÇÃO APENAS POR OCASIÃO DA GRAVAÇÃO/APAGAMENTO DOS CONTROLES (APRENDIZADO) ; 06/04/2013 ADAPTAÇÃO PARA 2 CANAIS ; ADAPTADO DE NOTE APPLICATIONS MICROCHIP POR: CLÁUDIO LÁRIOS ; REVISADO EM 11/08/13 - DESLIGADO PULL UPS - EM ALGUNS CHIPS, ATRAPALHAVA A OBTENÇÃO DO NIVEL ; '0', SEM O JUMPER COLOCADO. ;************************************************************************************************************ ; DEFINIÇÕES DO USUÁRIO ;************************************************************************************************************ ;ESCOLHA AQUI O SEU MODELO DE MICROCONTROLADOR ;(ESCOLHA UM MODELO POR DESCOMENTAR E COMENTE O OUTRO) #DEFINE F675 ;PARA 12F675 ;#DEFINE F629 ;PARA 12F629 ;OBS. O HEX PARA 12F675 PODE SER USADO DIRETO NO 12F629, MAS O OPOSTO NÃO É POSSIVEL. ;************************************************************************************************************ ;ESCOLHA AQUI O TIPO DE APAGAMENTO DA EEPROM : ;(ESCOLHA UM MODELO POR DESCOMENTAR E COMENTE O OUTRO) ;#DEFINE ALL_ERASE ;AO APERTAR BOTÃO 'LEARN' POR MAIS DE 10 SEGUNDOS APAGA TODA A EEPROM #DEFINE JUMPER_ERASE ;AO APERTAR BOTÃO 'LEARN' POR MAIS DE 10 SEGUNDOS APAGA CONFORME: ;JUMP COLOCADO: TODOS OS CONTROLES GRAVADOS COM JUPER COLOCADO CANAL 'A' ;JUMP RETIRADO: TODOS OS CONTROLES GRAVADOS COM JUPER RETIRADO CANAL 'B' ;*********************************************************************************************************** ;ESCOLHA AQUI A QUANTIDADE TOTAL DE CONTROLES REMOTOS A SER USADO('A' + 'B') MAXIMO= .16 MAX_USERS EQU .16 ;*********************************************************************************************************** ; NOTA IMPORTANTE: DEVERÁ SER ESCOLHIDA A 'KEY' NA ROTINA 'DECRYPT' QUE SEJA IGUAL AO GRAVADO NO CI ; HCS200...301. ; PARA GRAVAR HCS COM ESTA 'KEY', VEJA NOTE APPLICATIONS KEELOG. PROCURE NO BLOG 'LARIOS.TECNOLOGIA.WS' ; POR GRAVADOR CASEIRO PARA ESTE CI. SE AS 'KEYS' FOREM DIFERENTES, NÃO FUNCIONARÁ O SISTEMA. ;*********************************************************************************************************** ; ARQUIVOS PARA COMPLIAÇÃO IFDEF F629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF IFDEF F675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF ;ELIMINA MENSAGEM DE ERRO DO COMPILADOR ERRORLEVEL -302 ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _MCLRE_OFF ;FACILITADORES PARA TROCA DE BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;DEFINIÇÕES DE RAM RTCC EQU 01H ; REAL TIME COUNTER CLOCK FLAGS EQU 20H ; USER FLAG REGISTER ADDRESS EQU 21H ; ADDRESS REGISTER TXNUM EQU 22H ; CURRENT TX OUTBYT EQU 23H ; GENERAL DATA REGISTER MASK EQU OUTBYT ; MASK REGISTER USED IN DECRYPTION TMP_CNT EQU OUTBYT ; TEMPORARY COUNTER CNT0 EQU 24H ; LOOP COUNTERS CNT1 EQU 25H CNT2 EQU 26H CNT_HI EQU 27H ; 16 BIT CLOCK COUNTER CNT_LW EQU 28H CSR0 EQU 29H ; 64 BIT RECEIVE SHIFT REGISTER CSR1 EQU 2AH CSR2 EQU 2BH CSR3 EQU 2CH CSR4 EQU 2DH CSR5 EQU 2EH CSR6 EQU 2FH CSR7 EQU 30H TMP1 EQU 31H ; TEMP REGISTER FOR READ AND WRITE TMP2 EQU 32H ; TEMP REGISTER FOR READ AND WRITE REG EQU 33H ; NOT USED REG1 EQU 34H ; NOT USED KEY0 EQU 35H ; 64 BIT KEY SHIFT REGISTER KEY1 EQU 36H KEY2 EQU 37H KEY3 EQU 38H KEY4 EQU CNT2 KEY5 EQU CSR5 KEY6 EQU CSR6 KEY7 EQU CSR7 AUX EQU 39H R1 EQU 3AH R2 EQU 3BH STMP1 EQU 3CH STMP2 EQU 3DH SADDRESS EQU 3EH SW EQU 3FH CNT EQU 40H HOP1 EQU CSR0 ; 32 BIT HOPCODE REGISTER HOP2 EQU CSR1 HOP3 EQU CSR2 HOP4 EQU CSR3 SER_0 EQU CSR7 ; 28 BIT SERIAL NUMBER SER_1 EQU CSR6 SER_2 EQU CSR5 SER_3 EQU CSR4 FUNC EQU CSR3 ; BUTTON CODE & USER BIT FUNCTION BYTE DISC EQU CSR2 ; DISCRIMINATION VALUE CNTR_HI EQU CSR1 ; 16 BIT RX COUNTER HIGH BYTE CNTR_LW EQU CSR0 ; 16 BIT RX COUNTER LOW BYTE ;VARIAVÉIS NBITS EQU .64 ; MAXIMUM TRANSMISSION BIT LENGTH MIN EQU .560 ; TRANSMISSION HEADER MINIMUM LENGTH [ S] YTRISA EQU B'001001' ; PORTA: TRI-STATE VALUE ;FLAGS BITIN EQU 0H ; RF BIT VALUE LRNF EQU 1H ; LEARN FLAG SEC_CNT EQU 2H ; SECOND COUNTER IS BEING CHECKED RELEARN EQU 3H ; RELEARNING A TRANSMITTER FLAG_JUMPER EQU 04H ; FLAG_JUMPER ; GPIO PORTAS #DEFINE RFIN GPIO,3 ;PINO 4 GP3 #DEFINE LRN GPIO,0 ;PINO 7 GP0 #DEFINE LED GPIO,0 ;PINO 7 GP0 #DEFINE S3 GPIO,4 ;PINO 3 GP4 #DEFINE JUMPER GPIO,4 ;PINO 3 GP4 #DEFINE S2 GPIO,2 ;PINO 5 GP2 #DEFINE S1 GPIO,1 ;PINO 6 GP1 #DEFINE S0 GPIO,5 ;PINO 2 GP5 ;EQUATES PARA MUDANÇA DE SENTIDO #DEFINE TLED TRISIO,0 ;PINO 7 GP0 #DEFINE TJUMPER TRISIO,4 ;PINO 3 GP4 ;****************************************************************************** ; RESET ;****************************************************************************** ORG 00H goto RESET ORG 04H RETFIE RESET MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORTA BANK1 MOVLW YTRISA ; SETUP PORTA MOVWF TRISIO MOVLW B'10000111' ;(ALTERAÇÃO 11-08-13 DESLIGA PULL UPS) -SETUP RTCC PRESCALER MOVWF OPTION_REG CLRF WPU ;(ALTERAÇÃO 11-08-13 -DESLIGA PULLUPS) IFDEF F675 CLRF ANSEL ENDIF BANK0 CLRF FLAGS ; RESET FLAGS ;******************************************************************************* ;PROGRAMA PRINCIPAL ;******************************************************************************* MAIN_LOOP BCF LED ;APAGA LED 'LEARN' BTFSS LRN ;TESTA BOTÃO 'LEARN' GOTO LEARN ; TEST & HANDLE LEARN BUTTON APERTADO CALL UP_RTCC ; UPDATE TIMER CALL TESTA_TIMER ; HANDLE TIMER - UPDATE OUTPUTS CALL RECEIVE ; RECEIVE TRANSMISSION BC MAIN_LOOP ; CHECK IF TRANSMISSION VALID M_SEARCH CLRF TXNUM ; TEST FIRST POSITION ; COMPARA A PARTE BAIXA DO SERIAL NUMBER M_SERIAL CALL TX_LOOKUP ; GET TX BASE ADDRESS INCF ADDRESS,F ; SOMA 2 INCF ADDRESS,F CALL EEREAD ; READ LOWER 16-BITS OF SER# FROM EEPROM MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES XORWF SER_2,W BNZ PROX_END ; IF NOT EQUAL CHECK NEXT MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES XORWF SER_3,W BNZ PROX_END ; IF NOT EQUAL CHECK NEXT ; COMPARA A PARTE ALTA DO SERIAL NUMBER M_SERIAL2 INCF ADDRESS,F ; POINT TO NEXT ENTRY CALL EEREAD ; READ UPPER 16-BITS OF SER# FROM EEPROM ;IDENTIFICA SE SERÁ CANAL 'A' OU 'B' A SER ACIONADO PELO BIT 7 BCF FLAGS,FLAG_JUMPER BTFSS TMP1,7 GOTO N1 BCF TMP1,7 BSF FLAGS,FLAG_JUMPER N1 ;=========================================================== MOVFW TMP1 ; COMPARA VALOR RECEBIDO COM A EEPROM XORWF SER_0,W BNZ PROX_END ; SE NÃO FOR IGUAL, PROCURA O PRÓXIMO ENDEREÇO MOVFW TMP2 ; COMPARA O OUTRO BYTE XORWF SER_1,W BNZ PROX_END ; SE NÃO FOR IGUAL, PROCURA O PRÓXIMO ENDEREÇO BTFSS FLAGS,LRNF ; MODO DE APRENDIZADO ? GOTO DECRIPTAR ; SIM, DECRIPTA O TRANSMISSOR ACHADO BSF FLAGS,RELEARN ; SET RELEARN FLAG GOTO ENCONTRADO ; FOUND TRANSMITTER - LEARN ; PROCURA NA EEPROM PELO SERIAL NUMBER RECEBIDO PROX_END INCF TXNUM,F ; POINT TO NEXT TRANSMITTER POSITION MOVLW MAX_USERS ; TEST FOR LAST POSITION SUBWF TXNUM,W BTFSS STATUS,C ; NOT FOUND IN MAP GOTO M_SERIAL ; TRY NEXT POSITION M_NF BTFSS FLAGS,LRNF ; LEARN MODE GOTO MAIN_LOOP ; NO... INVALID SERIAL NUMBER GOTO NOVO_TRASMISSOR ; NEW TRANSMITTER - USE POINTER FOR LEARN ; DECRIPTA HOPCODE DECRIPTAR CALL DECRYPT ; DECRYPT HOPCODE ; TESTA VALOR DO DISCRIMINADOR MOVFW SER_3 ; SERIAL NUBER LSB MUST BE EQUAL XORWF DISC,W ; TO DISCRIMINATION VALUE BNZ MAIN_LOOP ; VERIFICA SE VALOR DO CONTADOR É VALIDA (DENTRO DA JANELA ESPERADA) BCF FLAGS,SEC_CNT ; CHECK FIRST COUNTER M_CNT CALL TX_LOOKUP ; POINT LOWER 16 BIT COUNTER BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER IS USED INCF ADDRESS,F ; INCREMENT ADDRESS CALL EEREAD ; READ LOWER 16 BIT COUNTER FROM EEPROM MOVFW TMP2 ; 16 BIT COUNTER SUBSTRACTION SUBWF CNTR_LW,W MOVWF TMP2 SKPC ; SKIP IF NO BORROW INCF TMP1,F ; ... ELSE INCR HI BYTE MOVFW TMP1 SUBWF CNTR_HI,W MOVWF TMP1 BCF TMP1,0 ; MAKE ACCEPTED WINDOW 512 MOVFW TMP1 ; TEST IF IN WINDOW ( UPPER BYTE ) BTFSC STATUS,Z GOTO CHECK2 ; CHECK LOWER BYTE BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER GOTO MAIN_LOOP ; ERROR - GOTO MAIN LOOP BSF FLAGS,SEC_CNT ; SET FLAG FOR SECOND COUNTER CHECK GOTO M_CNT ; AND CHECK IT CHECK2 MOVFW TMP2 ; CHECK LOWER BYTE BZ T_ZERO ; IF REPEAT - RESET TIMEOUT COUNTER ;*************************************************************** ; ESCRITA NA EEPROM DOS CONTADORES CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES CALL EEWRITE ; UPDATE FIRST COUNTER INCF ADDRESS,F CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES CALL EEWRITE ; UPDATE SECOND COUNTER ;***************************************************************************** ;RECEPÇÃO OK - APRESENTAÇÃO DOS BOTÕES APERTADOS CONFORME CANAL QUE ; FOI GRAVADO O CONTROLE REMOTO. BTFSS FLAGS,FLAG_JUMPER GOTO JUT1 ;GRAVADO SEM JUMPER BCF S2 ;GRAVADO COM JUMPER BCF S3 BCF S0 BTFSC FUNC,6 BSF S0 BCF S1 BTFSC FUNC,5 BSF S1 GOTO T_ZERO JUT1 BCF S0 ;LIGA SAIDAS CONFORME BOTÃO DO TX BCF S1 BCF S2 BTFSC FUNC,6 BSF S2 BCF S3 BTFSC FUNC,5 BSF S3 ;**************************************************************************** T_ZERO CLRF CNT_HI ; RESET RTCC CLOCK CLRF CNT_LW GOTO MAIN_LOOP ; WAIT FOR NEXT TRANMISSION LEARN CLRF CNT_LW ; RESET TIMER CLRF CNT_HI LEARN1 CALL UP_RTCC ; UPDATE TIMER BTFSC LRN ; TEST FOR BUTTON RELEASE GOTO LEARN2 ; ENTER LEARN MODE BTFSS CNT_HI,0 ; TEST FOR ERASE ALL GOTO LEARN1 ; LOOP BACK ; APAGA EEPROM ; DEFINA NO CABEÇALHO SE SERÁ COMPLETA OU POR CANAL (VIA JUMPER) CLRWDT ; CLEAR WATCHDOG TIMER CALL APAGAEEPROM MOVLW .3 MOVWF AUX ;ROTINA PARA PISCAR LED 'LEARN', CONFORME CARGA NO REGISTRADOR 'AUX' PISCA1 BANK1 BCF TLED ;VIRA SAIDA BANK0 BSF LED CALL DELAY500MS BCF LED CALL DELAY500MS DECFSZ AUX,F GOTO PISCA1 BANK1 BSF TLED ;VOLTA A SER ENTRADA BANK0 BTFSS LRN ; WAIT FOR BUTTON RELEASE GOTO $-1 ; LOOP BACK GOTO RESET ; START OVER LEARN2 BSF FLAGS,LRNF ; SET LEARN FLAG LEARN3 CALL UP_RTCC ; UPDATE TIMER CALL TESTA_TIMER ; CHECK FOR LEARN TIMEOUT CALL RECEIVE ; RECEIVE TRANSMISSION BC LEARN3 ; CHECK IF TRANSMISSION VALID GOTO M_SEARCH ; CHECK IF SERIAL NUMBER IS IN MAP ;ACHADO NOVO TRANSMISSOR, ACHAR LOCAL NA EEPROM PARA GRAVA-LO NOVO_TRASMISSOR ;=======================================================================XYZ ; PROCURA EM TODA MEMÓRIA POR 8 ESPAÇOS SEQUENCIAIS 'FF'(VAZIOS) CLRF CNT CLRF TXNUM LOOP4B MOVLW .4 MOVWF CNT1 MOVFW CNT MOVWF ADDRESS MOVWF AUX LOOP3A CALL EEREAD_1 MOVFW TMP1 XORLW 0XFF BTFSS STATUS,Z GOTO PRX_END8 MOVFW TMP2 XORLW 0XFF BTFSS STATUS,Z GOTO PRX_END8 DECFSZ CNT1,F GOTO ACER_1 GOTO ENCONTRADO ACER_1 INCF ADDRESS,F INCF ADDRESS,F MOVFW ADDRESS MOVWF AUX GOTO LOOP3A PRX_END8 INCF TXNUM,F MOVFW TXNUM XORLW MAX_USERS BTFSC STATUS,Z GOTO MEM_CHEIA MOVLW .8 ADDWF CNT,F XORLW 0X7F BTFSC STATUS,Z GOTO MEM_CHEIA GOTO LOOP4B MEM_CHEIA BCF FLAGS,LRNF ; CLEAR LEARN FLAG BCF FLAGS,RELEARN ; CLEAR RELEARN FLAG MOVLW .10 ;NÚMERO DE PISCADAS PARA INDICAR 'MEMÓRIA CHEIA'(FULL MEMORY) MOVWF AUX GOTO PISCA1 ;VAI PISCAR E SAI PARA ROTINA PRINCIPAL ENCONTRADO CALL TX_LOOKUP INCF ADDRESS,F ;SOMA 2 INCF ADDRESS,F ;======================================================================================== ;AQUI TESTAMOS SE O JUMPER ESTÁ COLOCADO E SE ESTIVER,IRÁ SETA O SER0,7 PARA MARCA-LO COMO ; SENDO DO CANAL 'A', GRAVANDO NA EEPROM. BANK1 BSF TJUMPER ;ENTRADA PARA TESTE DE 'JUMPER' BANK0 BCF SER_0,7 ;RESETA BIT MAIS SIGNIFICATIVO DA SERIAL PARA MARCAR COMO CANAL 'B' BTFSC JUMPER BSF SER_0,7 ;SETA BIT MAIS SIGNIFICATIVO DA SERIAL PARA MARCAR COMO CANAL 'A' BANK1 BCF TJUMPER ;VIRA SAIDA BANK0 ;========================================================================================== MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NUMBER MOVWF TMP1 MOVFW SER_3 MOVWF TMP2 CALL EEWRITE ; ... AND WRITE TO EEPROM INCF ADDRESS,F ;TESTE SOMA 2 MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NUMBER MOVWF TMP1 MOVFW SER_1 MOVWF TMP2 CALL EEWRITE ; ... AND WRITE TO EEPROM BCF SER_0,7 ; ROTINA DE DECRIPTAÇÃO LEARN_DEC CALL DECRYPT ; DECRYPTION ROUTINE ;VERIFICA VALOR DO DISCRIMINADOR MOVFW SER_3 ; COMPARA VALOR DO SERIAL NUMBER XORWF DISC,W ; COM O VALOR DO DISCRIMINADOR BZ LEARN_UP ; UPDATE CONTADORES NA EEPROM GOTO CANCELA ; ERRO, CANCELA MODO DE APRENDIZADO ; UPDATE CONTADORES NA EEPROM LEARN_UP CALL TX_LOOKUP ; OBTÉM ENDEREÇO ATUAL CALL LOAD_CNT_VALS CALL EEWRITE ; WRITE LSB WORD OF COUNTER TO EEPROM BANK1 BCF TLED ;VIRA SAIDA BANK0 BCF LED ; LED ON TO INDICATE VALID LEARN CLRF CNT_LW ; CLEAR COUNTER LOW BYTE CALL UP_RTCC ; INDICATE SUCCESSFUL LEARN BTFSS CNT_LW,4 ; LED ON FOR 0.5 SEC GOTO $-2 ; LOOP BACK BANK1 BSF TLED ;VIRA SAIDA BANK0 CANCELA BCF FLAGS,LRNF ; CLEAR LEARN FLAG BCF FLAGS,RELEARN ; CLEAR RELEARN FLAG GOTO MAIN_LOOP ; RETURN TO MAIN LOOP - LED OFF ;*************************************************************************** ; SUBROTINAS GERAIS ;*************************************************************************** ;ROTINA DE DESLOCAMENTO DE REGISTRADORES ROT_SHIFT RRF CSR7,F RRF CSR6,F RRF CSR5,F RRF CSR4,F RRF CSR3,F RRF CSR2,F RRF CSR1,F RRF CSR0,F RETURN ;============================================================================= ;ROTINA PARA CALCULAR ENDEREÇO PARA ACESSO A EEPROM TX_LOOKUP MOVF TXNUM,W ; USE TRANSMITTER NUMBER TO CALCULATE MOVWF ADDRESS ; ADDRESS OF TRANSMITER BLOCK CLRC ; MULTIPLY BY 4 RLF ADDRESS,F RLF ADDRESS,F RETURN ; RETURN ;============================================================================ ;ROTINA PARA UPDATAR CONTADORES DE TEMPO UP_RTCC CLRWDT ; RESET WATCHDOG TIMER BTFSS RTCC,7 ; TEST FOR 32MS TIMEOUT ON RTCC MSB RETLW .0 ; ... DO QUICK RETURN TO RECEIVE ROUTINE BCF RTCC,7 ; CLEAR MSB OF RTCC INCF CNT_LW,F ; INCREASE 16 COUNTER SKPNZ ; INCREASE UPPER BYTE IF ZERO ( OVERFLOW ) INCF CNT_HI,F RETURN ;=========================================================================== ;TESTA TIMER E UPDATA TESTA_TIMER ; TESTA POR 0,5 SEGUNDOS BTFSS CNT_LW,4 ; TEST FOR 500 MS TIMEOUT GOTO TST_30 ; ... IF NOT TEST 30S TIMEOUT CLRF GPIO ;DESLIGA SAIDAS ;TESTA POR 30 SEGUNDOS TST_30 BTFSS FLAGS,LRNF RETURN BTFSC CNT_HI,2 ; TEST FOR LEARN TIMEOUT GOTO RESET ; ... IF LEARN TIMEMOUT FORCE SOFT RESET RETURN ; DELAY AUXILIAR DE 500MS DELAY500MS CLRF CNT_LW CALL UP_RTCC ;UP DATE BTFSS CNT_LW,4 ; TEST FOR 500 MS TIMEOUT GOTO $-2 RETURN ;DELAY ENTRE GRAVAÇÕES DE EEPROM AGUARDE CLRF CNT_LW CALL UP_RTCC BTFSS CNT_LW,0 GOTO $-2 RETURN ;====================================================================== ;ESCREVE NA EEPROM ;COLOQUE ENDEREÇO EM 'ADDRESS' ;DADOS A ESCREVER ESTA EM TMP1(MSB) E TMP2 (LSB) EEWRITE CALL AGUARDE clrwdt movfw ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F ;AUXILIAR X 2 MOVFW AUX EEWRITE_1 BANK1 movwf EEADR BANK0 MOVFW TMP1 ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_A bcf EECON1, WREN ; disable Write\par BANK0 clrwdt ESPERA1 ;DELAY ENTRE APAGAMENTOS CALL AGUARDE INCF AUX,F MOVFW AUX BANK1 movwf EEADR BANK0 MOVFW TMP2 ;PEGA SEGUNDO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_B clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_B bcf EECON1, WREN ; disable Write\par BANK0 CALL AGUARDE RETURN ;====================================================================== ;LE EEPROM ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP1(MSB) E TMP2 (LSB) EEREAD clrwdt MOVFW ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F MOVFW AUX EEREAD_1 BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP1 ;RECUPERA PRIMEIRO NUMERO DA EEPROM clrwdt INCF AUX,F MOVFW AUX BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP2 ;RECUPERA SEGUNDO NUMERO DA EEPROM clrwdt RETLW 0H ;========================================================================== IFDEF JUMPER_ERASE APAGAEEPROM CLRF CNT LOOOPM1 BANK1 BSF TJUMPER ;VIRA ENTRADA BANK0 BCF FLAGS,FLAG_JUMPER BTFSC JUMPER ;TESTA SE 'JUMPER' ESTÁ COLOCADO BSF FLAGS,FLAG_JUMPER BANK1 BCF TJUMPER ;VIRA SAÍDA BANK0 DN23 MOVFW CNT ADDLW .6 MOVWF ADDRESS CALL EEREAD_1 ;LE PARA SABER BIT 7 = '1' MOVFW TMP1 ;PEGA VALOR DO SER3 GRAVADO ANDLW B'10000000' ;LIMITA AO BIT 7 BTFSC STATUS,Z GOTO BIT_E0 ;BIT7='0' BTFSS FLAGS,FLAG_JUMPER ;BIT7='1' ,TESTA O FLAG'JUMPER' NO PINO 3 GOTO NÃO_APAGA APAG_1 CALL APAGA_8BYTES ;APAGA 8 BYTES NÃO_APAGA MOVFW CNT ADDLW .8 MOVWF CNT XORLW 0X80 BTFSS STATUS,Z GOTO DN23 BCF FLAGS,FLAG_JUMPER RETURN BIT_E0 BTFSC FLAGS,FLAG_JUMPER ;BIT7='0' ,TESTA O FLAG'JUMPER' NO PINO 3 GOTO NÃO_APAGA GOTO APAG_1 APAGA_8BYTES MOVLW .4 MOVWF CNT1 V9 MOVLW 0XFF MOVWF TMP1 MOVWF TMP2 MOVFW ADDRESS MOVWF AUX CALL EEWRITE_1 ;APAGA 2 BYTES MOVLW .2 SUBWF ADDRESS,F DECFSZ CNT1,F GOTO V9 RETURN ENDIF ;------------------------------------------------------------------------------ IFDEF ALL_ERASE APAGAEEPROM ; ; ROTINA PARA APAGAR TODAS AS POSIÇOES DA EEPROM MOVLW 0X80 ;TOTAL DE 128 + 1 BYTES DE EEPROM MOVWF AUX RET6 CLRWDT MOVFW AUX MOVLW .1 ;ACERTA ENDEREÇO TIRANDO 1 SUBWF AUX,W BANK1 movwf EEADR MOVLW 0XFF movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_C clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_C bcf EECON1, WREN ; disable Write\par BANK0 DECFSZ AUX,F GOTO ESPERA clrwdt RETLW 0H ESPERA ;DELAY ENTRE APAGAMENTOS MOVLW .8 MOVWF R1 CG1 MOVLW .255 MOVWF R2 DECFSZ R2,F GOTO $-1 DECFSZ R1,F GOTO CG1 GOTO RET6 ENDIF ;==================================================================== ; ROTINA DE DECRIPTAÇÃO ; MUDE AQUI A SUA KEY SE DESEJAR E USE A MESMA NO TRANSMISSOR. ; THE KEY USED IS A FIXED KEY WHICH IS NOT SERIAL NUMBER DEPENDANT ; THE USER MUST CHOOSE A KEY AND CHANGE THE CODE HERE TO REFLECT THAT KEY DECRYPT MOVLW 01H ; LOAD FIXED 64 BIT KEY LSB MOVWF KEY0 MOVLW 23H MOVWF KEY1 MOVLW 45H MOVWF KEY2 MOVLW 67H MOVWF KEY3 MOVLW 89H MOVWF KEY4 MOVLW 0ABH MOVWF KEY5 MOVLW 0CDH MOVWF KEY6 MOVLW 0EFH ; LOAD FIXED 64 BIT KEY MSB MOVWF KEY7 MOVLW .12 ; OUTER LOOP 11+1 TIMES MOVWF CNT1 ; OUTER LOOP 11+1 TIMES DECRYPT_OUTER MOVLW .48 ; INNER LOOP 48 TIMES MOVWF CNT0 ; INNER LOOP 48 TIMES DECRYPT_INNER CLRWDT ; RESET WATCHDOG TIMER MOVFW CNT1 ; LAST 48 LOOPS RESTORE THE KEY XORLW .1 ; LAST 48 LOOPS RESTORE THE KEY SKPNZ ; LAST 48 LOOPS RESTORE THE KEY GOTO ROTATE_KEY ; LAST 48 LOOPS RESTORE THE KEY ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE ; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK ; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE ; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE ; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE LOOKUP ; REQUIRES AN ADDITIONAL STACK LEVEL CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT) MOVLW .1 ; INITIALISE MASK = 1 BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET MOVLW B'10000' ; SHIFT MASK 4X IF BIT 2 SET MOVWF MASK ; INITIALISE MASK = 1 BTFSS HOP2,0 ; SHIFT MASK ANOTHER 2X IF BIT 1 SET GOTO $+3 RLF MASK,F RLF MASK,F BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET RLF MASK,F ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0 MOVLW .0 ; TABLE INDEX = 0 BTFSC HOP4,1 IORLW .2 ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX BTFSC HOP4,6 IORLW .4 ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX movwf AUX MOVLW .6 SUBWF AUX,W BTFSC STATUS,Z GOTO SEIS MOVLW .4 SUBWF AUX,W BTFSC STATUS,Z GOTO QUATRO MOVLW .2 SUBWF AUX,W BTFSC STATUS,Z GOTO DOIS MOVLW 02EH GOTO TABLE_END DOIS MOVLW 074H GOTO TABLE_END QUATRO MOVLW 05CH GOTO TABLE_END SEIS MOVLW 03AH GOTO TABLE_END TABLE_END ANDWF MASK,F ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK MOVLW .0 ; COPY THE BIT TO BIT 7 SKPZ ; COPY THE BIT TO BIT 7 MOVLW B'10000000' ; COPY THE BIT TO BIT 7 XORWF HOP2,W ; ONLY INTERESTED IN BIT HOP2,7 XORWF HOP4,W ; ONLY INTERESTED IN BIT HOP4,7 XORWF KEY1,W ; ONLY INTERESTED IN BIT KEYREG1,7 MOVWF MASK ; STORE W TEMPORARILY (WE NEED BIT 7) RLF MASK,F ; LEFT ROTATE MASK TO GET BIT 7 INTO THE CARRY RLF HOP1,F ; SHIFT IN THE NEW BIT RLF HOP2,F RLF HOP3,F RLF HOP4,F ROTATE_KEY CLRC ; CLEAR CARRY BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET SETC ; SET CARRY IF LEFTMOST BIT SET RLF KEY0,F ; LEFT-ROTATE THE 64-BIT KEY RLF KEY1,F RLF KEY2,F RLF KEY3,F RLF KEY4,F RLF KEY5,F RLF KEY6,F RLF KEY7,F DECFSZ CNT0,F ; INNER LOOP 48 TIMES GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES DECFSZ CNT1,F ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY) GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY) RETLW 0 ; RETURN ;=============================================================================== ;CARREGA CONTADORES NOS BUFFERS DE ESCRITA LOAD_CNT_VALS MOVFW CNTR_HI ; LOAD MSB OF COUNTER MOVWF TMP1 MOVFW CNTR_LW ; LOAD LSB OF COUNTER MOVWF TMP2 RETURN ;================================================================================ ;ROTINA DE RECEPÇÃO PARA PROTOCOLO HCS200 RECEIVE ;ESPERA PELO CABEÇALHO E AGUARDA BTFSS RFIN ; INPUT LOW? GOTO RMT_0 ; YES; RECEIVE ERROR MOVLW .10 ; 10 ms TIMER MOVWF CNT1 RCV0 MOVLW .200 MOVWF CNT0 RCV1 BTFSS RFIN ; [2] INPUT HIGH? GOTO RCV2 ; [0] NO, JUMP OUT OF LOOP DECFSZ CNT0,1 ; [1] YES, CONTINUE WITH TIMING LOOP GOTO RCV1 ; [2] 5 us X CNT0 DECFSZ CNT1,1 ; [0] DO 1 ms LOOP CNT1 TIMES GOTO RCV0 ; [0] RCV2 CLRF CNT0 ; [1] CLEAR CALIB COUNTER LOW BYTE CLRF CNT1 ; [1] CLEAR CALIB COUNTER HIGH BYTE ;************************************************************************* ; 2.5 IS AVERAGE FOR DETECTING FALLING EDGE IN RCV1 ; 2 INSTRUCTIONS FOR JUMP OUT RCV1 TO RCV2 ; 2 INSTRUCTIONS FOR RCV2 - CLEAR CALIBRATION COUNTER ; TOTAL 6.5 INSTRUCTIONS < 1 CALIBRATION LOOP SO DISCARD ;************************************************************************* RCV3 BTFSC RFIN ; [2][2] INPUT HIGH? GOTO RCV6 ; [0][0] YES--END CALIBRATION INCF CNT0,1 ; [1] INCREMENT 16BIT COUNTER SKPNZ ; [2] INCF CNT1,1 ; [0] CLRWDT ; [1] RESET WATCH DOG TIMER NOP ; [1] BTFSS CNT1,3 ; [1] GOTO RCV3 ; [2] GOTO RMT_0 ; [0] ; TOTAL = 10 RCV6 CLRC ; [1] DIVIDE CNT1:CNT0 BY 8 (600/8=75) RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] MOVLW MIN/80 ; [1] SUBWF CNT0,W ; [1] BTFSS STATUS,C ; [2] NEGATIVE? GOTO RMT_0 ; [0] YES--HEADER SHORTER THAN MIN. ; TOTAL = 11 ; ************* VALID HEADER RECEIVED ********************* RCV7 MOVLW NBITS ; [1] VALID START MARKER WAS RECEIVED MOVWF CNT1 ; [1] MOVF CNT0,W ; [1] MOVWF CNT2 ; [1] CNT2 = CNT0 MOVLW 6H ; [1] SEE NOTE BELOW SUBWF CNT2,1 ; [1] GOTO DL1 ; [2] COMPENSATE FOR FIRST BIT ; TOTAL = 8 ;********************************************************************************** ; 2.5 IS AVERAGE PLAY BETWEEN RISING EDGE AND JUMP OUT OF CALIBRATION LOOP. ; 2 FOR JUMP OUT OF RCV3 TO RCV6 ; 11 INSTRUCTIONS FOR RVC6 - CAIBRATION COUNTER DIVIDE ; 8 INSTRUCTIONS FOR RCV7 - COMPENSATE FOR POST CALIBRATION CALCUATIONS ; TOTAL 22.5 INSTRUCTIONS BETWEEN RISING EDGE AND ENTERING DL1 ; THEREFORE SUBTRACT 22.5/4 = 5.625 TO COMPENSATE FOR POST CALCULATION ON 1ST BIT ;********************************************************************************** RCV8 MOVLW 4H ; [1] WAIT A MAXIMUM OF 4 Te MOVWF TMP_CNT ; [1] SET TEMP LOOP COUNTER RCV10A MOVFW CNT0 ; [1] and CSR processing MOVWF CNT2 ; [1] Refer to explanation above RCV10B BTFSC RFIN ; [2] Wait for rising edge GOTO RCV11 ; [0] Edge found--Process CLRWDT ; [1] Clear watchdog Timer BTFSC RFIN ; [2] Wait for Next rising edge GOTO RCV11 ; [0] Edge found--Process DECFSZ CNT2,1 ; [1] Decrement Timeout counter GOTO RCV10B ; [2] Loop Back ; TOTAL = 8, RFIN CHECKED EVERY 4uS ON AVERAGE DECFSZ TMP_CNT,1 ; [1] ALL Te PERIODS GOTO RCV10A ; [2] ... NO, THEN WAIT FOR NEXT ONE GOTO RMT01 ; [0] ... YES, [0] TIMEOUT--no edge found RCV11 MOVLW 3H ; [1] SEE NOTE BELOW SUBWF CNT0,W ; [1] MOVWF CNT2 ; [1] ;************************************************************************* ; 2 SETUP OF TEMP LOOP COUNTER ( ONLY ONCE ) ; 2 SETUP TE LOOP COUNTER ( MAX 4 ) ; 3 DECREMENT TEMP LOOP COUNTER ( MAX 4 ) ; 4 IS THE AVERAGE PLAY BETWEEN EDGE AND EDJE BEING DETECTED IN RCV9 ; 2 JUMP OUT OF RCV10B TO RCV11 ; 3 FOR RCV11 ; TOTAL 10 INSTRUCTIONS BETWEEN EDGE AND ENTERING DL1 ; THEREFORE SUBTRACT 10/4 = 2.5 => 3 DL1 LOOPS TO COMPENSATE FOR ;************************************************************************* DL1 CLRWDT ; [1] RESET WATCHDOG TIMER DECFSZ CNT2,1 ; [1] [2, IF SKIP] GOTO DL1 ; [2] CNT0 X 4 us SAMPLE1 BTFSS RFIN ; [2] INPUT HIGH? FIRST SAMPLE GOTO RMT01 ; [0] NO--ERROR MOVF CNT0,W ; [1] CALIBRATION COUNTER MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE) DECF CNT2,1 ; [1] SUBTRACT 2 FROM FINAL CALIB COUNTER TO COMPENATE FOR THIS GOTO $+1 ; [2] NOP ; [1] ; TOTAL = 8 => 1 LOOP COUNTER DL2 CLRWDT ; [1] RESET WATCHDOG TIMER GOTO $+1 ; [2] WASTE TIME GOTO $+1 ; [2] WASTE TIME DECFSZ CNT2,1 ; [1] GOTO DL2 ; [2] CNT0 X 8 us [ CNT0 x Te ] SAMPLE2 BCF FLAGS,BITIN ; [1] CLEAR BIT POSITION BTFSS RFIN ; [1.5] LEAVE 0 IF LINE HIGH BSF FLAGS,BITIN ; [0.5] MAKE 1 IF LINE LOW ; SUB TOTAL = 3 CYCLES CALL ROT_SHIFT ; [11]+[2] CSR SHIFT + CALL BCF CSR7,7 ; [1] BTFSC FLAGS,BITIN ; [1.5] BSF CSR7,7 ; [0.5] ; SUB TOTAL = 16 CYCLES MOVF CNT0,W ; [1] CALIBRATION COUNTER MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE) MOVLW 3 ; [1] SEE CALCULATION BELOW SUBWF CNT2,1 ; [1] NOP ; [1] ; SUB TOTAL = 5 CYCLE ; TOTAL = 24 => 24/8 = 3 LOOP COUNTERS ;************************************************************************* ; TOTAL = 24 INSTRUCTIONS ; SUBTRACT 24/8 = 3 TO COMPESATE FOR UPDATEING CSR AND OTHER PROCESSING ; AFTER DATA SAMPLE IS TAKEN. ;************************************************************************* DL3 GOTO $+1 ; [2] WASTE TIME GOTO $+1 ; [2] WASTE TIME CLRWDT ; [1] RESET WATCHDOG TIMER DECFSZ CNT2,1 ; [1] GOTO DL3 ; [2] CNT0 X 8 us [ CNT0 X Te ] SAMPLE3 BTFSC RFIN ; [2] INPUT LOW? THIRD SAMPLE GOTO RMT0 ; [0] NO--RECEIVE ERROR CALL UP_RTCC ; [11] CHECK RTCC DECFSZ CNT1,1 ; [1] LAST BIT? GOTO RCV8 ; [2] ... NO, GET NEXT BIT GOTO RMT1 ; TOTAL = 14 CYCLES RMT_0 RMT0 RMT01 BSF STATUS,C ; INVALID TRANSMISSION RETLW 1 ; RETURN RMT1 MOVLW 0FH ; FORCE OPEN BUTTON CODES TO ZERO ANDWF SER_0,1 CLRC ; VALID SERIAL NUMBER => VALID TX RETLW .0 ; RETURN END