;*************************************************************************************************** ; MULTI_CONTROLE_HCS_PIC.ASM ;*************************************************************************************************** ; ; OBJETIVO: SIMULAR A FUNÇÃO DE VARIOS HCS 200/201/300/301 EM UM PIC 16F628A ; ATRAVÉS DA SELEÇÃO DO ENDEREÇO POR CHAVES NA PORTA 'B'. ; OBS. GRAVAR A MESMA CHAVE NO PIC TRANSMISSOR (HCS) E NO PIC RECEPTOR PARA FUNCIONAR. ; BASEADO EM NOTE APLICATTION DA MICROCHIP. ; USO DIDÁTICO APENAS, VISANDO A COMPREENSÃO DO FUNCIONAMENTO DOS PROTOCOLOS E COMO FERRAMENTA ; PARA TESTES DE PROJETOS. ; OBS: CONSULTE FABRICANTE MICROCHIP ANTES DE USO COMERCIAL PARA OBTENÇÃO DE LICENÇAS ; PROJETO ORIGINAL MODIFICADO PARA FUNCIONAR COM EEPROM INTERNA DO ; PIC 16F6298A. USE OSCILADOR INTERNO DE 4 MHZ. ; BLOG ' LARIOS.TECNOLOGIA.WS ; 15/12/2012 BY CLÁUDIO LÁRIOS ;#DEFINE BOTAOPOS ;BOTÕES IRÃO ACIONAR COM LIGAÇÃO AO POSITIVO +VCC 5VOLTS ;(USE RESISTORES PULL-DOWN DE 2K2 NOS PINOS 2,3,4,5,7 - A MASSA). ;============================================================================== ; ATENÇÃO: ESCOLHA O NUMERO DO SERIAL NUMBER A SER TRANSMITIDO, AQUI: ;============================================================================= ;SERIAL_LW (PORTB) ;LSB ;ESCOLHA AQUI O SEU 'SERIAL NUMBER' SERIAL_HI EQU 0X33 SERIAL_UL EQU 0X44 SERIAL_UH EQU 0X55 ;MSB ;============================================================================= ; ATENÇÃO: ESCOLHA AQUI A CHAVE QUE SERÁ USADA PARA EMBARALHAR, AQUI: ; (OBS. USE A MESMA NO RECEPTOR, SENÃO NÃO FUNCIONA!!!) ; CHAVE ABAIXO = (MSB) 'EFCDAB8967452301' (LSB) K0 EQU 01H ;LSB K1 EQU 23H K2 EQU 45H K3 EQU 67H K4 EQU 89H K5 EQU 0ABH K6 EQU 0CDH K7 EQU 0EFH ;MSB ;=============================================================================== ; FIM DO SETUP PRÉ-COMPILAÇÃO ;=============================================================================== LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;=========================================================================================== ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _MCLRE_ON & _LVP_OFF ;------------------------------------------------------------------------------ #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 RAM; IND EQU 00H ; ACESSO INDIRETO A RAM RTCC EQU 01H ; TIMER 0 PC EQU 02H ; PROGRAM COUNTER STATUS EQU 03H ; REGISTRO DE STATUS FSR EQU 04H ; SELETOR DE ACESSO A RAM PORTA EQU 05H ; PORT A PORTB EQU 06H ; PORT B FLAGS EQU 20H ; USO COMO 'FLAG' ADDRESS EQU 21H ; ENDEREÇO TXNUM EQU 22H ; CURRENT TX OUTBYT EQU 23H ; USO GERAL MASK EQU OUTBYT ; MASCARA TMP_CNT EQU OUTBYT ; TEMPORARIO CNT0 EQU 24H ;CONTADORES CNT1 EQU 25H CNT2 EQU 26H CSR0 EQU 29H ;64 BIT REGISTRADORES DE RECEPÇÃO CSR1 EQU 2AH CSR2 EQU 2BH CSR3 EQU 2CH CSR4 EQU 2DH CSR5 EQU 2EH CSR6 EQU 2FH CSR7 EQU 30H TMP1 EQU 31H ; TEMPORARIO TMP2 EQU 32H ; TEMPORARIO KEY0 EQU 35H ; 64 BIT REGISTRO DE DESLOCAMENTO PARA A 'CHAVE' 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 W_SALVO EQU 40H REGA EQU 41H COPIAFLAGS EQU 42H REG2 EQU 43H TIME EQU 44H REG1 EQU 45H AUX3 EQU 47H HOP1 EQU CSR0 ; 32 BIT REGISTRADOR DE CÓDIGO ESPERADO HOP2 EQU CSR1 HOP3 EQU CSR2 HOP4 EQU CSR3 TEMP EQU 48H #DEFINE S4 PORTA,4 ; PINO 3- IN S4 - (NÃO GERA TRANSMISSÃO, MAS AGREGA BIT 1 A TRASMISSÃO (VLOW))PULL UP NECESSÁRIO #DEFINE S2 PORTA,2 ; PINO 1- IN S2 - BOTÃO #DEFINE S3 PORTA,3 ; PINO 2- IN S3 - BOTÃO #DEFINE S0 PORTA,0 ; PINO 17- IN S0 - BOTÃO #DEFINE S1 PORTA,1 ; PINO 18- IN S1 - BOTÃO #DEFINE OUT PORTA,7 ; PINO 16- SAIDA VIA RESISTOR DE 470 OHMS () ORG 00H goto RESET ORG 04H RETFIE RESET MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES IFDEF MODELO_675 BANK1 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD BANK0 ENDIF BANK1 MOVLW B'00000000' ;HABILITAR CHAVE GERAL DE PULL UP'S NAS ENTRADAS P/ CHAVE NEGATIVAS MOVWF OPTION_REG BANK0 CLRF PORTA ; RESET PORTA CLRF REGA BANK1 MOVLW B'11111111' ; GPIO: VALOR DE TRI-STATE MOVWF PORTB MOVLW B'01111111' ; GPIO: VALOR DE TRI-STATE MOVWF PORTA BANK0 CLRF FLAGS ; RESET FLAGS MAIN_LOOP CALL TESTACHAVESNEG ;VERSÃO NEGATIVA (ALTERA TAMBÉM OPTION_REG COM PULLUPS) MOVLW .0 ADDWF FLAGS,W BTFSC STATUS,Z GOTO MAIN_LOOP ;AGUARDA LIGAR ALGUMA CHAVE MOVFW FLAGS MOVWF COPIAFLAGS MOVFW PORTB ANDLW B'00111111' ;LIMITA A 64 MOVWF TEMP BCF STATUS,C RLF TEMP,F ;MULTIPLICA POR 2 MOVFW TEMP MOVWF ADDRESS CALL EEREAD MOVFW TMP1 MOVWF HOP1 ;PEGA DA EEPROM O VALOR DO CONTADOR H/L MOVFW TMP2 MOVWF HOP2 INCFSZ TMP1,F GOTO SEG1 INCF TMP2,F SEG1 CALL EEWRITE ;INCREMENTA CONTADOR E ESCREVE NA EEPROM MOVFW PORTB ANDLW B'00111111' ;LIMITA A 64 MOVWF HOP3 MOVLW SERIAL_HI ANDLW 0X0F ;APAGA NIBLE ALTO IORWF FLAGS,W MOVWF HOP4 CALL EMBARALHAR ;EMBARALHA PARTE ENCRIPTADA MOVFW PORTB ANDLW B'00111111' ;LIMITA A 64 MOVWF CSR4 MOVLW SERIAL_HI MOVWF CSR5 MOVLW SERIAL_UL MOVWF CSR6 MOVLW SERIAL_UH MOVWF CSR7 ;RECUPERA BOTÕES MOVFW CSR7 ANDLW 0X0F ;APAGA NIBLE ALTO IORWF FLAGS,W MOVWF CSR7 ENVIADNOVO ; ENVIA OS 66 BITS PARA A SAIDA CALL CABEÇALHO MOVLW .66 MOVWF AUX3 SY CALL RODA_REGISTRADORES ;PEGA EM CARRY O LSB BTFSS STATUS,C GOTO Z1 CALL HUM GOTO SH Z1 CALL ZERO SH DECFSZ AUX3,F GOTO SY CALL TG CALL TESTACHAVESNEG ;VERSÃO NEGATIVA MOVFW COPIAFLAGS XORWF FLAGS,W BTFSS STATUS,Z GOTO MAIN_LOOP GOTO ENVIADNOVO ; S U B - R O T I N A S RODA_REGISTRADORES BTFSS CSR0,0 ;DESLOCA PARA DIREITA OS REGISTRADORES BCF REGA,2 BTFSC CSR0,0 BSF REGA,2 RRF REGA,F RRF CSR7,F RRF CSR6,F RRF CSR5,F RRF CSR4,F RRF CSR3,F RRF CSR2,F RRF CSR1,F RRF CSR0,F RETLW .0 ;------------------------------------------------------------------------------ ; DURAÇÃO DE 1/3 TEMPO DE BIT TRANSMITIDO (1 BIT = 3 TE) TE MOVLW .160 ;.165 PARA 400 US E .82 PARA 200 US (MEDIÇÃO) MOVWF TIME DECFSZ TIME,F GOTO $-1 RETLW .0 ;------------------------------------------------------------------------------ ;ENVIA ZERO PARA SAIDA ZERO BSF OUT CALL TE CALL TE BCF OUT CALL TE RETURN ;------------------------------------------------------------------------------ ;ENVIA UM PARA SAIDA HUM BSF OUT CALL TE BCF OUT CALL TE CALL TE RETURN ;------------------------------------------------------------------------------ CABEÇALHO ; ENVIA 23 TE'S 50% DE CICLO MOVLW .11 MOVWF REG1 DJ BSF OUT CALL TE BCF OUT CALL TE DECFSZ REG1,F GOTO DJ BSF OUT CALL TE BCF OUT EXP ; ENVIIA 10 TE'S DE ESPAÇO MOVLW .10 MOVWF REG1 DJ1 BCF OUT CALL TE DECFSZ REG1,F GOTO DJ1 RETURN ;--------------------------------------------------- TG ;TEMPO DE GUARDA ENTRE TRANSMISSÕES MINIMO 39 A 40 TE'S ; CADA EXP = 10 TE'S MOVLW .4 ;4 MOVWF REG2 CALL EXP DECFSZ REG2,F GOTO $-2 RETURN ;------------------------------------------------------------ AGUARDE ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOVLW .64 MOVWF R1 CG2 CLRWDT MOVLW .255 MOVWF R2 DECFSZ R2,F GOTO $-1 DECFSZ R1,F GOTO CG2 RETURN EEWRITE ;ESCREVER NA EEPROM ;endereço esta em ADDRESS ;DADOS A ESCREVER ESTA EM TMP1(MSB) E TMP2 (LSB) CALL AGUARDE clrwdt movfw ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F ;AUXILIAR X 2 MOVFW AUX BANK1 movwf EEADR BANK0 MOVFW TMP1 ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; HABILITA ESCRITA movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; ESCRITA COMPLETA? goto WRITE_SN_A bcf EECON1, WREN ; DESABILITA ESCRITA 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 ; HABILITA ESCRITA movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_B clrwdt btfsc EECON1, WR ; ESCRITA COMPLETA? goto WRITE_SN_B bcf EECON1, WREN ; DESABILITA ESCRITA BANK0 CALL AGUARDE RETURN EEREAD ;LER A EEPROM ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP1(MSB) E TMP2 (LSB) clrwdt MOVFW ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F MOVFW AUX BANK1 movwf EEADR bsf EECON1, RD ; LER clrwdt btfsc EECON1, RD ; LEITURA FEITA? 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 ; LER clrwdt btfsc EECON1, RD ; LEITURA FEITA? goto $-2 movf EEDATA,W BANK0 MOVWF TMP2 ;RECUPERA SEGUNDO NUMERO DA EEPROM clrwdt RETLW 0H EMBARALHAR ;DEDUZIDO (APÓS MUITAS HORAS DE CANSEIRA) A PARTIR DA FUNÇÃO 'DECRYPT' MOVLW K6 ;LSB - CARGA DA 'CHAVE' MOVWF KEY0 MOVLW K7 MOVWF KEY1 MOVLW K0 MOVWF KEY2 MOVLW K1 MOVWF KEY3 MOVLW K2 MOVWF KEY4 MOVLW K3 MOVWF KEY5 MOVLW K4 MOVWF KEY6 MOVLW K5 ;MSB MOVWF KEY7 ;CARREGADO DE FORMA EQUIVALENTE A 48 ROTAÇÕES PRÉVIAS MOVLW .11 ; CARGA DO LOOP1 EXTERNO MOVWF CNT1 LOOP2 MOVLW .48 ; CARGA DO LOOP2 INTERNO 48 TIMES MOVWF CNT0 LOOP1 CLRWDT ; RODA A CHAVE CALL RODA_CHAVE ;RODA A CHAVE ; RODA HOPPING CLRC ;APAGA STATUS,C RRF HOP4,F ; DESLOCA CARRY A DIREITA NO REGISTRADOR RRF HOP3,F RRF HOP2,F RRF HOP1,F BTFSS STATUS,C MOVLW .0 BTFSC STATUS,C MOVLW B'10000000' MOVWF W_SALVO ;SALVA HOP1,0 EM W_SALVO ;RECUPERA HOP4,7 CLRC ; APAGA CARRY MOVLW .1 ; MASK = 1 BTFSC HOP3,3 ; DESLOCA MASK 4X SE BIT 2 FOR '1' MOVLW B'10000' MOVWF MASK BTFSS HOP2,0 ; DESLOCA MASK MAIS 2X SE BIT 1 FOR '1' GOTO $+3 RLF MASK,F RLF MASK,F BTFSC HOP1,0 ; DESLOCA MASK MAIS 1X SE BIT 0 FOR '1' RLF MASK,F ; MASK FOI DESLOCADO DE 0-7 VEZES , DE ACORDO COM OS BITS 2:1:0 MOVLW .0 ; INICIA COM '0' BTFSC HOP4,1 IORLW .2 ; SEF BIT 3 ='1' SOME 2 PARA O PONTEIRO DA TABELA BTFSC HOP4,6 IORLW .4 ; SE BIT 4 ='1' SOME 4 PARA O PONTEIRO DA TABELA movwf AUX MOVLW .6 SUBWF AUX,W BTFSC STATUS,Z GOTO SEISA MOVLW .4 SUBWF AUX,W BTFSC STATUS,Z GOTO QUATROA MOVLW .2 SUBWF AUX,W BTFSC STATUS,Z GOTO DOISA MOVLW 02EH GOTO ETABLE_END DOISA MOVLW 074H GOTO ETABLE_END QUATROA MOVLW 05CH GOTO ETABLE_END SEISA MOVLW 03AH GOTO ETABLE_END ETABLE_END ANDWF MASK,F ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK MOVLW .0 ; COPIA O BIT P/ BIT 7 SKPZ ; COPY THE BIT TO BIT 7 MOVLW B'10000000' ; COPY THE BIT TO BIT 7 XORWF KEY1,W ; ONLY INTERESTED IN BIT HOP2,7 XORWF W_SALVO,W ; ONLY INTERESTED IN BIT HOP4,7 XORWF HOP2,W ; ONLY INTERESTED IN BIT KEYREG1,7 MOVWF MASK ; STORE W TEMPORARILY (WE NEED BIT 7) BTFSS MASK,7 BCF HOP4,7 BTFSC MASK,7 BSF HOP4,7 ;RECUPERA HOP4,7 QUE ESTAVA PERDIDO ;RODA PARA DIREITA A PARTIR DO BIT 0 DECFSZ CNT0,F GOTO LOOP1 DECFSZ CNT1,F GOTO LOOP2 ; RETLW 0 ; RETURN RODA_CHAVE CLRC ; CARRY=0 BTFSC KEY0,0 ; COPIA KEY0,0 EM CARRY SETC RRF KEY7,F ; RODA A 'CHAVE' RRF KEY6,F RRF KEY5,F RRF KEY4,F RRF KEY3,F RRF KEY2,F RRF KEY1,F RRF KEY0,F RETURN ;------------------------------------------------ DEBOUNCE ;DEBUNCE DE TECLAS MOVLW .255 MOVWF AUX VX5 NOP NOP NOP NOP NOP DECFSZ AUX,F GOTO VX5 RETURN ;--------------------------------------------------------------------- ;---------------------------------------------------------- TESTACHAVESNEG ;TESTA CHAVES CLRF FLAGS BTFSC S0 GOTO SEG3A CALL DEBOUNCE BTFSC S0 GOTO SEG3A BCF FLAGS,5 BTFSC S0 GOTO SEG3A BSF FLAGS,5 SEG3A BTFSC S1 GOTO SEG4A CALL DEBOUNCE BTFSC S1 GOTO SEG4A BCF FLAGS,6 BTFSC S1 GOTO SEG4A BSF FLAGS,6 SEG4A BTFSC S2 GOTO SEG5A CALL DEBOUNCE BTFSC S2 GOTO SEG5A BCF FLAGS,7 BTFSC S2 GOTO SEG5A BSF FLAGS,7 SEG5A BTFSC S3 GOTO SEG6A CALL DEBOUNCE BTFSC S3 GOTO SEG6A BCF FLAGS,4 BTFSC S3 GOTO SEG6A BSF FLAGS,4 SEG6A BTFSC S4 GOTO SEG7A CALL DEBOUNCE BTFSC S4 GOTO SEG7A CLRF REGA BTFSC S4 GOTO SEG7A BSF REGA,1 SEG7A RETURN ;----------------------------------------------------- org h'2100' dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;POSIÇÃO INICIAL DOS CONTADORES DE 16 BITS dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END