;************************************************************************* ; ; CONTROL_TESTER_PIC_4.ASM ; ; LEITOR DE CODIGO TRANSMITIDO PARA HT6P20B E TAMBÉM PARA HCS 200 A 301 ; MICROCONTROLADOR : PIC16F628A ; ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 06/12/12 ; ; USO: TESTE DE CONTROLES REMOTOS COM CHIP HT6P20B E HCS 200...301 ; USE CRISTAL DE : 4MHZ ; LIMITAÇÃO: RECEBE SINAL DE HCS PROGRAMADO COM BAUD RATE DE 400 MICROSEGUNDOS ; APENAS. NÃO FUNCIONA COM BIT BASE DE 200 MICROSEGUNDOS E 100 MICROSEGUNDOS. ; VEJA DATASHEET HCS200, PAGINA 7 DO MANUAL DS40138C, BAUD RATE. ;************************************************************************* LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF ;_INTRC_OSC_NOCLKOUT ;_XT_OSC ; USER DEFINED REGISTER ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS EQU 21H ; USER FLAG REGISTER TMP EQU 22H R0 EQU 23H CNT0 EQU 24H ; LOOP COUNTERS CNT1 EQU 5CH LC EQU 25H CNT2 EQU 5DH HC EQU 26H RES3 EQU 50H RES2 EQU 51H RES1 EQU 52H RES0 EQU 53H C2 EQU 54H C1 EQU 55H C0 EQU 56H QB EQU 57H CSR4A EQU 58H CSR5A EQU 59H CSR6A EQU 5AH CSR7A EQU 5BH AUX EQU 5EH TR EQU 5FH ; CIRCULAR BUFFER REGISTER 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 CSR0A EQU 31H ; 64 BIT RECEIVE SHIFT REGISTER CSR1A EQU 32H CSR2A EQU 33H CSR3A EQU 34H Z1 EQU 35H Z2 EQU 36H ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== #DEFINE RFIN 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 FLAGX FLAGS,6 ;RECEPÇÃO HT6P20B #DEFINE FLAGY FLAGS,5 ;RECEPÇÃO HCS200...301 #DEFINE FLAGH FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE FLAG_HCS FLAGS,2 ;FLAG DE PREAMBULO DE HCS #DEFINE FLAGH1 FLAGS,3 ;FLAG DE HCS ACERTO VAL EQU 4H ; PERIODO DO TE CAPTADO TMAX EQU 50D ;50 TEMPO MAXIMO DO SINAL LOW VLINHA1 EQU 80H VLINHA2 EQU 0C0H C_Z1 EQU 0XFF ;TEMPO DE VISUALIZAÇÃO DO VALOR (LSB) C_Z2 EQU 0XAA ;IDEM (MSB) ;------------------------------------------------------------------------------ LIMPA MACRO CALL LcdClear ENDM LINHA1 MACRO CALL LINE1 ENDM LINHA2 MACRO CALL LINE2 ENDM ;------------------------------------------------------------------------------ ORG 00H AQ GOTO RESETA 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 "TX?...",0 MSG4: DT "CIRC.INTEG. HCS:",0 MSG5: DT "CIRC.INTEG. HTP:",0 RESETA: MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES BANK1 MOVLW .0 MOVWF TRISB MOVLW B'11111111' MOVWF TRISA BANK0 CLRF PORTA ; RESET PORTA CLRF PORTB ; RESET PORTB CLRF FLAGS ; RESET FLAGS CALL LcdInit ;INICIALIZAÇÃO DO LCD MOVLW MSG1 CALL ENV_LCD CALL LINE2 MOVLW MSG2 CALL ENV_LCD MOVLW .5 CALL DELAYW LIMPA MOVLW MSG1 CALL ENV_LCD MOVLW 0XC5 CALL EC MOVLW MSG3 CALL ENV_LCD MAIN_C MOVLW C_Z1 MOVWF Z1 MOVLW C_Z2 MOVWF Z2 CLRF FLAGS ; RESET FLAGS CLRF CSR7 ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR6 CLRF CSR5 CLRF CSR4 CLRF CSR7A CLRF CSR6A CLRF CSR5A CLRF CSR4A CLRF HC ;APAGA REGISTRADORES DE UNS E ZEROS CLRF LC MOVLW .28 MOVWF QB ;QUANTIDADE DE BITS A RECEBER MAIN: CALL RECEIVE ;ROTINA DE RECEPÇAO DE TRANSMISSÕES HT6P/HCS BTFSC FLAGX CALL ROT_HT6P ;ROTINA DE APRESENTAÇÃO HT6P BTFSC FLAGY CALL ROT_HCS ;ROTINA DE APRESENTAÇÃO HCS GOTO MAIN ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B/HCS200...301 ;========================================================== RECEIVE: SS5: DECFSZ Z1,F GOTO SPN DECFSZ Z2,F GOTO SPN LIMPA MOVLW MSG1 CALL ENV_LCD MOVLW 0XC5 CALL EC MOVLW MSG3 CALL ENV_LCD MOVLW C_Z1 MOVWF Z1 MOVLW C_Z2 MOVWF Z2 SPN BTFSS FLAGH ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 GOTO L2 BTFSC FLAG_HCS GOTO W47 BTFSS RFIN GOTO MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' GOTO L2 W47: BTFSC RFIN ;SE '1' VAI MO GOTO MO W48: L2: BTFSS RFIN ;SIN=0 VAI INCREMENTAR LC EM 'LA1' GOTO LA1 BTFSC FLAG_HCS ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG GOTO W45 BSF FLAGH ;SIN=1 W45: INCF HC,F MOVF HC,F ;TESTA BTFSS STATUS,Z GOTO LA2 ;SE DIFERENTE DE '0' VAI PARA LA2 DECF HC,F ;RETORNA VALOR DE 0XFF GOTO LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1: BTFSS FLAG_HCS ;SE '0' VAI PARA W46 GOTO W46 BSF FLAGH ;SIN=1 W46: INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOVF LC,F ;TESTA BTFSS STATUS,Z GOTO LA2 ;SE DIFERENTE DE '0' VAI PARA LA2 DECF LC,F ;RETORNA VALOR DE 0XFF LA2: MOVLW .12 ;24D = 50 MICROSEG DELAY (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) MOVWF R0 DECFSZ R0,F GOTO $-1 GOTO L1 MO: ;OK LC>TMAX C=0 (VAI PARA O INICIO) BCF STATUS,C ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF MOVLW #TMAX SUBWF LC,W BTFSS STATUS,C ;SE LCTMAX (REJEITAR DADO - SEM TRANSMISSÃO ) CLRF CSR7 CLRF CSR6 CLRF CSR5 CLRF CSR4 ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR3 CLRF CSR2 CLRF CSR1 CLRF CSR0 L0: BCF FLAGH CLRF HC ;APAGA REGISTRADORES DE UNS E ZEROS CLRF LC L1: RETURN ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G SEG58: MOVFW HC SUBWF LC,W ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) RRF CSR7,F RRF CSR6,F RRF CSR5,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR4,F BTFSS FLAG_HCS GOTO SEG44 RRF CSR3,F RRF CSR2,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR1,F RRF CSR0,F SEG44: DECFSZ QB,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 BTFSC FLAG_HCS ;SE '1' VAI SEG66 GOTO SEG66 MOVLW .4 ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 MOVWF QB ACERTA: BCF STATUS,C RRF CSR7,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF CSR6,F RRF CSR5,F ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 RRF CSR4,F DECFSZ QB,F GOTO ACERTA BTFSC FLAG1 ;SE '1' VAI PULA1 GOTO PULA1 MOVFW CSR6 MOVWF CSR6A ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOVFW CSR5 MOVWF CSR5A MOVFW CSR4 MOVWF CSR4A BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO MOVLW .28 MOVWF QB GOTO RET_ PULA1: BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOVFW CSR6 XORWF CSR6A,W BTFSS STATUS,Z GOTO ERROR_ ;ERRO DE RECEPÇAO MOVFW CSR5 XORWF CSR5A,W BTFSS STATUS,Z GOTO ERROR_ MOVFW CSR4 XORWF CSR4A,W BTFSS STATUS,Z GOTO ERROR_ BSF FLAGX ;OK - BOA RECEPÇÃO HT6P20B MOVLW .28 MOVWF QB GOTO RET_ SEG66: BSF FLAGY ;OK - BOAS RECEPÇÃO HCS BCF FLAG1 MOVLW .28 MOVWF QB BCF FLAG_HCS GOTO L0 ERROR_: CLRF CSR6A ; APAGA RESULTADOS DE COMPARAÇÃO CLRF CSR5A CLRF CSR4A SAI_ROT: BCF FLAGX BCF FLAGH MOVLW .28 MOVWF QB GOTO RET_ ROT_HT6P: MOVFW CSR6 XORLW .0 BTFSS STATUS,Z GOTO J1 MOVFW CSR5 XORLW .0 BTFSS STATUS,Z GOTO J1 MOVFW CSR4 XORLW .0 BTFSS STATUS,Z GOTO J1 GOTO MAIN ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTESTE ; LIMPA ; LINHA1 ; MOVLW MSG1 ; CALL ENV_LCD ; MOVLW 0XC5 ; CALL EC ; MOVLW .1 ;ESTAVA 20 ; CALL DELAYW ; GOTO MAIN J1: LIMPA LINHA1 MOVLW MSG5 CALL ENV_LCD MOVLW 0XC5 CALL EC SWAPF CSR6A,W CALL BIN_ASC_ED MOVFW CSR6A CALL BIN_ASC_ED SWAPF CSR5A,W CALL BIN_ASC_ED MOVFW CSR5A CALL BIN_ASC_ED SWAPF CSR4A,W CALL BIN_ASC_ED MOVFW CSR4A CALL BIN_ASC_ED MOVLW .5 ;ESTAVA 20 CALL DELAYW BCF FLAGX BCF FLAGY GOTO MAIN_C ROT_HCS: LIMPA LINHA1 MOVLW MSG4 CALL ENV_LCD LINHA2 SWAPF CSR7,W CALL BIN_ASC_ED MOVFW CSR7 CALL BIN_ASC_ED SWAPF CSR6,W CALL BIN_ASC_ED MOVFW CSR6 CALL BIN_ASC_ED SWAPF CSR5,W CALL BIN_ASC_ED MOVFW CSR5 CALL BIN_ASC_ED SWAPF CSR4,W CALL BIN_ASC_ED MOVFW CSR4 CALL BIN_ASC_ED SWAPF CSR3,W CALL BIN_ASC_ED MOVFW CSR3 CALL BIN_ASC_ED SWAPF CSR2,W CALL BIN_ASC_ED MOVFW CSR2 CALL BIN_ASC_ED SWAPF CSR1,W CALL BIN_ASC_ED MOVFW CSR1 CALL BIN_ASC_ED SWAPF CSR0,W CALL BIN_ASC_ED MOVFW CSR0 CALL BIN_ASC_ED MOVLW .5 ;ESTAVA 20 CALL DELAYW BCF FLAGX BCF FLAGY GOTO MAIN_C ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - 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