;************************************************************************* ; ; CONTROL_TESTER_HT6026.ASM ; ; LEITOR DE CODIGO TRANSMITIDO P/ CI 145026/HT6026 ; MICROCONTROLADOR : PIC16F628A ; ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 17/02/12 TEMINO:19/02/2013 ; ; USO: TESTE DE CONTROLES REMOTOS COM CHIP 145026/HT6026 ; OBJETIVO: VISUALIZAR OS 'CORTES DE ARAME' NOS PINOS DO CI TRANSMISSOR NO LCD . ; SENDO: ; '+' -> PINO LIGADO AO VCC ; '-' -> PINO LIGADO AO GND ; '0' -> PINO DESLIGADO ; OBS. A GRANDE MAIORIA DOS FABRICANTES DE CONTROLES NÃO USAM A LIGAÇÃO AO VCC, ; APENAS "ABERTO" (ARAME CORTADO) OU AO "GND"(ARAME SEM CORTE). ; OBS.NA PRIMEIRA LINHA DO LCD APARECERÁ OS PINOS E LOGO ABAIXO O ESTADO QUE SE ENCONTRAM. ; LIMITAÇÕES DO APARELHO: ; 1) OS TX PODEM TRABALHAR COM MUITAS FREQUÊNCIAS DIFERENTES DEPENDENDO DA REDE RC ; NO SEU OSCLIADOR NOS PINOS 11,12 E 13. ; ESTE APARELHO CONSEGUE APENAS VISUALIZAR CÓDIGOS CUJOS OSCILADORES DOS TX ESTEJAM ; ENTRE 800 HERTZ A +-4KHZ. ; FORMULA DO OSCILADOR: ; FOSC = 1 ; _________________________________________ ; 2,3 X REXT X ( CEXT + C(LAYOUT) + 12PF) ; SENDO: REXT>10K (LIGADO AO PINO 13) ; RS= 2 X REXT (LIGADO AO PINO 11) ; RS> 20K ; CEXT > 400 PF (LIGADO AO PINO 12) ; OBS. A MAIORIA DOS OSCILADORES TRABALHAM COM RESISTOR REXT DE 100K,RS DE 47K ; E CEXT = 4700 PF, DANDO UMA FREQUÊNCIA DE 1 KHZ. ; 2) OUTROS MODELOS DE TRANSMISSORES PODERÃO PRODUZIR FALSAS APRESENTAÇÕES (USE ; APENAS PARA CI HT6026 OU 145026). ; OBS. ESTA MONTAGEM É APENAS PARA FINS DIDÁTICOS, SUJEITA A BUG'S AINDA NÃO DETECTADOS ; SENDO FEITA A MONTAGEM APENAS EM PROTOBOARD. ;************************************************************************* LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF ;RAM CBLOCK 0X20 TEMP, FLAGS, TMP,R0,CNT0,LC,HC,CONT,CONT1,CONT2,CONT3,RES4,RES3,RES2,RES1,RES0 C2,C1,C0,QB,CNT1,CNT2,AUX,TR,RES4A,RES3A,RES2A,RES1A,RES0A,CNT ENDC ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== #DEFINE RFIN PORTA,0 ;PINO 17 IN RF #DEFINE SIN PORTA,0 ;PINO 17 IN RF #DEFINE LCD_DB7 PORTB,7 ;PINO 13 - DISPLAYS #DEFINE LCD_DB6 PORTB,6 ;PINO 12 - DISPLAY #DEFINE LCD_DB5 PORTB,5 ;PINO 11 - DISPLAYS #DEFINE LCD_DB4 PORTB,4 ;PINO 10 - DISPLAY #DEFINE LCD_RS PORTB,3 ;PINO 9 - DISPLAY #DEFINE LCD_E PORTB,2 ;PINO 8 - DISPLAY ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;****** FLAGS DEFINITIONS ************** #DEFINE FLAG FLAGS,7 ;FLAG #DEFINE FLAG_2L FLAGS,6 ;FLAG SEGUNDA LEITURA VLINHA1 EQU 80H VLINHA2 EQU 0C0H ;================================================================================== ;AJUSTE DA FREQUENCIA DE TRABALHO DO OSCILADOR DO TX TMAX EQU .40 ;PARA FAIXA DE FREQUÊNCIA DO OSCILADOR ENTRE 700 H A 4KHZ ;OBS. A MAIORIA DOS CONTROLES TEM RESISTOR DE 100K,47K E 4700 PF = 1KHZ DE FREQ. ;================================================================================= LIMPA MACRO CALL LcdClear ENDM LINHA1 MACRO CALL LINE1 ENDM LINHA2 MACRO CALL LINE2 ENDM ;===================================================================== ; RESET ;===================================================================== ORG 00H AQ GOTO RESETA ;ROTINA NA PAGINA ZERO PARA ENVIO DE FRASE AO LCD ENV_LCD MOVWF AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL ED INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL MSG1: DT "CONTROL_TESTER_4",0 MSG2: DT "LARIOS.TECNOL.WS",0 MSG3: DT "AGUARDANDO TX...",0 MSG4: DT "P/CIRC.INTEGRADO",0 MSG5: DT "PIN:1097654321",0 MSG6: DT " HT6026/145026 ",0 MSG7: DT " ",0 ;======================================================= ; INICIO DO PROGRAMA ;======================================================= RESETA: MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES BANK1 MOVLW .0 MOVWF TRISB MOVLW B'11111111' MOVWF TRISA BANK0 CLRF FLAGS CLRF PORTA ; RESET PORTA CLRF PORTB ; RESET PORTB CLRF FLAGS ; RESET FLAGS CALL LcdInit ;INICIALIZAÇÃO DO LCD MOVLW MSG1 ;ENVIA MENSAGEM COM NOME DO APARELHO CALL ENV_LCD CALL LINE2 MOVLW MSG2 CALL ENV_LCD MOVLW .5 ;DELAY DE APRESENTAÇÃO CALL DELAYW LIMPA LINHA1 MOVLW MSG4 ;ENVIA MENSAGEM COM MODELOS DOS CI'S CALL ENV_LCD LINHA2 MOVLW MSG6 CALL ENV_LCD MOVLW .5 CALL DELAYW ;TEMPO DE APRESENTAÇÃO LIMPA LINHA1 MOVLW MSG3 ;MENSAGEM:' AGUARDANDO TX...' CALL ENV_LCD INIT_1 LINHA2 ;========================================================= ; LOOP PRINCIPAL ;========================================================= INICIO: CLRF RES4 ;LIMPA REGISTRADORES CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW .17 ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF QB L0 BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC L1 ;===================ROTINA DE RECEPÇÃO========================== SS5: ;A BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO GOTO L2 ;FLAG=0 ;-------------------------------- ;B BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF GOTO M0 ; SIN=0 ;---------------------------------- L2 ;C BTFSS SIN ;SIN ? GOTO LA1 ;SIN=0 ;------------------------------------- ;E BSF FLAG ;SIN=1 INCF HC,F BTFSC STATUS,Z DECF HC,F GOTO LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS ;--------------------------------------------------------- LA1 ;D INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF BTFSS STATUS,Z GOTO LA2 DECF LC,F LA2 MOVLW TMAX ;(ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) MOVWF CONT DECFSZ CONT,F GOTO $-1 GOTO L1 M0 ;---------------------------------- ;F MOVFW LC ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUBLW TMAX BTFSS STATUS,C GOTO INICIO ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) ;F' ;----------------------------------- M01 ;G ;DUPLA COMPARAÇÃO MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) ADDLW .3 SUBWF LC,W RRF RES4,F RRF RES3,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES2,F RRF RES1,F RRF RES0,F MOVFW LC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) ADDLW .3 SUBWF HC,W RRF RES4,F RRF RES3,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES2,F RRF RES1,F RRF RES0,F ;------------------------------------- ;H DECFSZ QB,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT BTFSC FLAG_2L GOTO COMPARAR_RESULTADOS BSF FLAG_2L MOVFW RES4 ;SALVA PRIMEIRA RECEPÇÃO MOVWF RES4A MOVFW RES3 MOVWF RES3A MOVFW RES2 MOVWF RES2A MOVFW RES1 MOVWF RES1A MOVFW RES0 MOVWF RES0A GOTO INICIO ;COMPARA PRIMEIRA RECEPÇÃO COM A SEGUNDA RECEPÇÃO COMPARAR_RESULTADOS MOVFW RES4A XORWF RES4,W BTFSS STATUS,Z GOTO ERRO ;SAI PARA INICIO EM ERRO MOVFW RES3A XORWF RES3,W BTFSS STATUS,Z GOTO ERRO MOVFW RES2A XORWF RES2,W BTFSS STATUS,Z GOTO ERRO MOVFW RES1A XORWF RES1,W BTFSS STATUS,Z GOTO ERRO MOVFW RES0A XORWF RES0,W BTFSS STATUS,Z GOTO ERRO ;===================================================================== ;COMPARAÇÃO BEM SUCEDIDA, APRESENTA RESULTADOS NO LCD MOSTRAR_RESULTADO BCF FLAG_2L LIMPA LINHA1 MOVLW MSG5 ;MENSAGEM 'PIN:1097654321' CALL ENV_LCD MOVLW 0XC5 ;INICIO NA 2º LINHA CALL EC MOVLW .5 MOVWF CNT MOVLW RES4 ;APONTA PARA RES4 MOVWF FSR ;COMPARA COM VALORES PREVIAMENTE ESCOLHIDOS VOLTANDO SWAPF INDF,W ANDLW 0X0F XORLW .0 BTFSS STATUS,Z GOTO SEGH1 MOVLW 'O' CALL ED GOTO OUTRO_NIBLE SEGH1 SWAPF INDF,W ANDLW 0X0F XORLW .2 BTFSS STATUS,Z GOTO SEGH2 MOVLW 'O' CALL ED GOTO OUTRO_NIBLE SEGH2 SWAPF INDF,W ANDLW 0X0F XORLW .4 BTFSS STATUS,Z GOTO SEGH3 MOVLW '-' CALL ED GOTO OUTRO_NIBLE SEGH3 SWAPF INDF,W ANDLW 0X0F XORLW .5 BTFSS STATUS,Z GOTO SEGH4 MOVLW '-' CALL ED GOTO OUTRO_NIBLE SEGH4 SWAPF INDF,W ANDLW 0X0F XORLW .8 BTFSS STATUS,Z GOTO SEGH5 MOVLW '+' CALL ED GOTO OUTRO_NIBLE SEGH5 SWAPF INDF,W ANDLW 0X0F XORLW 0X0A BTFSS STATUS,Z GOTO ERR0_REC MOVLW '+' CALL ED GOTO OUTRO_NIBLE OUTRO_NIBLE MOVFW INDF ANDLW 0X0F XORLW .0 BTFSS STATUS,Z GOTO SEGH10 MOVLW 'O' CALL ED GOTO OUTRO_NIBLE1 SEGH10 MOVFW INDF ANDLW 0X0F XORLW .2 BTFSS STATUS,Z GOTO SEGH20 MOVLW 'O' CALL ED GOTO OUTRO_NIBLE1 SEGH20 MOVFW INDF ANDLW 0X0F XORLW .4 BTFSS STATUS,Z GOTO SEGH30 MOVLW '-' CALL ED GOTO OUTRO_NIBLE1 SEGH30 MOVFW INDF ANDLW 0X0F XORLW .5 BTFSS STATUS,Z GOTO SEGH40 MOVLW '-' CALL ED GOTO OUTRO_NIBLE1 SEGH40 MOVFW INDF ANDLW 0X0F XORLW .8 BTFSS STATUS,Z GOTO SEGH50 MOVLW '+' CALL ED GOTO OUTRO_NIBLE1 SEGH50 MOVFW INDF ANDLW 0X0F XORLW 0X0A BTFSS STATUS,Z GOTO ERR0_REC MOVLW '+' CALL ED GOTO OUTRO_NIBLE1 OUTRO_NIBLE1 INCF FSR,F DECFSZ CNT,F GOTO VOLTANDO MOVLW 0XCE CALL EC MOVLW ' ' CALL ED ;APAGA ULTIMO DIGITO (NÃO USADO) GOTO INIT_1 ;ERRO DE RECEPÇÃO, APAGA E VAI PARA O INICIO DO PROGRAMA ERR0_REC LINHA2 MOVLW MSG7 CALL ENV_LCD GOTO INIT_1 ;ERRO DE COMPARAÇÃO DE PRIMEIRA E SEGUNDA RECEPÇÃO ERRO CLRF RES4A CLRF RES3A CLRF RES2A CLRF RES1A CLRF RES0A BCF FLAG_2L GOTO INICIO ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;================================================================================= ;ROTINA DE DELAY (CLOCK=4MHZ) DELAY2 MOVLW .20 DELAYW MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================= ;Rotinas de controle do LCD ;================================================================================= LcdInit movlw .30 ;Wait 30 ms call LcdDelay bcf LCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E bcf LCD_DB4 bcf LCD_DB6 bcf LCD_DB7 bsf LCD_DB5 call LcdPulse_E movlw 28H ;Set 4 bit data bus length call EC movlw 06H ;Entry mode set, increment, no shift call EC ; movlw 0DH ;Display ON, Cursor ON, Blink ON ; movlw 0FH ;Display ON, Cursor ALTERADO ON, Blink ON ; movlw 0EH ;Display ON, Cursor ON, Blink OFF movlw 0CH ;Display ON, Cursor OFF, Blink OFF call EC LcdClear movlw 01H ;clear display call EC movlw .2 ;Wait 2 ms call LcdDelay return BIN_ASC_ED ;ROTINA DE BINARIO PARA HEX 0-F COM ENVIO PARA LCD ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 ;SOMA 0XF6 BTFSC STATUS,C ;TESTA CARRY ADDLW 0X07 ;C=1 ,ENTÃO SOMA + 7 ADDLW 0X3A ;SOMA 0X3A ;ENVIA PARA O LCD E RETORNA PARA O PONTO DE CHAMADA ED LcdSendData bsf LCD_RS GOTO XENV LINE1 MOVLW 0X80 GOTO EC LINE2 MOVLW 0XC0 EC LcdSendCommand bcf LCD_RS XENV LcdSendByte movwf TR ;Send a byte to LCD by 4 bit data bus bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,4 bsf LCD_DB4 btfsc TR,5 bsf LCD_DB5 btfsc TR,6 bsf LCD_DB6 btfsc TR,7 bsf LCD_DB7 call LcdPulse_E bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,0 bsf LCD_DB4 btfsc TR,1 bsf LCD_DB5 btfsc TR,2 bsf LCD_DB6 btfsc TR,3 bsf LCD_DB7 call LcdPulse_E return ;LcdPulse_E bsf LCD_E ;Enables LCD NOP NOP NOP NOP bcf LCD_E ;Disabled LCD return LcdPulse_E bsf LCD_E ;Enables LCD movlw 1 ;Wait 1ms call LcdDelay bcf LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call LcdDelay return end