;************************************************************************* ; ; CONTROL_TESTER2.asm ; ; LEITOR DE CODIGO TRANSMITIDO PARA HT6P20B E TAMBÉM PARA HCS 200 A 301 ; MICROCONTROLADOR : AT89C2051 ; ; AUTOR: CLÁUDIO LÁRIOS ; DATA DE INICIO: 30/07/12 ; ; USO: TESTE DE CONTROLES REMOTOS COM CHIP HT6P20B E HCS 200...301 ; USE CRISTAL DE : 12MHZ ; 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. ;************************************************************************* ; PINAGENS: ; PINO 20= VCC (+5V) ;**************************************************************************** ; USER DEFINED REGISTER ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS EQU 21H ; USER FLAG REGISTER CNT0 EQU 24H ; LOOP COUNTERS CNT1 EQU 5CH LC EQU 25H CNT2 EQU 5DH HC EQU 26H BR0 EQU 51H BR1 EQU 52H BR2 EQU 53H C0 EQU 54H C1 EQU 55H TMP EQU 56H QB EQU 57H CSR4A EQU 58H CSR5A EQU 59H CSR6A EQU 5AH CSR7A EQU 5BH ; 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 ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== RFIN EQU P3.7 ;PINO 11 IN RF DB7 EQU P1.7 ;PINO 19 - DISPLAYS DB6 EQU P1.6 ;PINO 18 - DISPLAY DB5 EQU P1.5 ;PINO 17 - DISPLAYS DB4 EQU P1.4 ;PINO 16 - DISPLAY RS EQU P1.3 ;PINO 15 - DISPLAY E EQU P1.2 ;PINO 14 - DISPLAY LCD EQU P1 ;PORTA PARA ENVIO AO LCD ;****** FLAGS DEFINITIONS ************** FLAGX EQU FLAGS.6 ;RECEPÇÃO HT6P20B FLAGY EQU FLAGS.5 ;RECEPÇÃO HCS200...301 FLAGH EQU FLAGS.0 ;FLAG DE SITUAÇÃO FLAG1 EQU FLAGS.1 ;FLAG DE NOVA LEITURA FLAGPA EQU FLAGS.2 ;FLAG DE PREAMBULO FLAGH1 EQU FLAGS.3 ;FLAG DE HCS ACERTO VAL EQU 4H ; PERIODO DO TE CAPTADO TMAX EQU 50D ;50 TEMPO MAXIMO DO SINAL LOW LINHA1 EQU 80H LINHA2 EQU 0C0H ;------------------------------------------------------------------------------ ; PAGE 0: ;------------------------------------------------------------------------------ ORG 00H RESETA: MOV P1,#0H ;CLRF PORTA ; RESET PORTA MOV P3,#0H ;CLRF PORTB ; RESET PORTB MOV FLAGS,#0H ;CLRF FLAGS; RESET FLAGS ACALL LcdInit ;INICIALIZAÇÃO DO LCD ACALL MENS_N MOV CSR7,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR6,#0H MOV CSR5,#0H MOV CSR4,#0H MOV CSR6A,#0H MOV CSR5A,#0H MOV CSR4A,#0H MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H MOV QB,#28D ;QUANTIDADE DE BITS A RECEBER MAIN: ACALL RECEIVE ;ROTINA DE RECEPÇAO DE TRANSMISSÕES HT6P/HCS JNB FLAGX,U2 ;ROTINA DE TESTE DOS FLAGS FX(HT6P20B) E FY(HCS200..301) ACALL XROT_HT6P ;ROTINA DE APRESENTAÇÃO HT6P U2: JNB FLAGY,MAIN ACALL XROT_HCS ;ROTINA DE APRESENTAÇÃO HCS AJMP MAIN MENS_N: MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG1 ACALL ENV_MSG MOV A,#LINHA2 ACALL EC MOV DPTR,#MSG2 ACALL ENV_MSG ACALL RTSHOW ACALL RLIMPA MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG1 ACALL ENV_MSG MOV A,#0C5H ACALL EC MOV DPTR,#MSG3 ACALL ENV_MSG RET ENV_MSG: MOV TMP,#0H MOV A,#0H BC2: MOVC A,@A+DPTR CJNE A,#0H,BC1 RET BC1: ACALL ED INC TMP MOV A,TMP AJMP BC2 RET MSG1: DB 'CONTROL-TESTER_2',0 MSG2: DB 'LARIOS.TECNOL.WS',0 MSG3: DB 'TX?...',0 MSG4: DB 'CIRC.INTEG. HCS:',0 MSG5: DB 'CIRC.INTEG. HTP:',0 XROT_HT6P: AJMP ROT_HT6P RET XROT_HCS: AJMP ROT_HCS RET RECEIVE: ;=========================================================================== ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B/HCS200...301 ;========================================================== SS5: JNB FLAGH , L2 ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 SETB RFIN ;LEVANTA PARA TESTE FLAG=1 JB FLAGPA,W47 JNB RFIN, MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' AJMP L2 W47: JNB FLAGPA,W48 SETB RFIN JB RFIN,MO W48: L2: SETB RFIN ;LEVANTA PARA TESTE JNB RFIN, LA1 ;SIN=0 VAI INCREMENTAR LC EM 'LA1' JB FLAGPA,W45 ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG SETB FLAGH ;SIN=1 W45: INC HC MOV A,HC JNZ LA2 DEC HC LJMP LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1: JNB FLAGPA,W46 SETB FLAGH ;SIN=1 W46: INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOV A,LC JNZ LA2 DEC LC LA2: MOV R0,#12D ; 24D = 50 MICROSEG DELAY (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) DJNZ R0,$ LJMP L1 MO: ;OK LC>TMAX C=0 (VAI PARA O INICIO) CLR C ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF MOV A,LC SUBB A,#TMAX JC NK MOV A,QB CJNE A,#17D,F23 ;SE A=17, ENTÃO É UM PREAMBULO DO HCS. SETB FLAGPA MOV QB,#63D ;SE SETADO, TRANSMISSÃO HCS SETB RFIN ;ESPERA RFIN FICAR =1 JNB RFIN,$ AJMP RET_ F23: ;=========================TESTE AJMP SF1 JNB FLAGPA,SF1 MOV A,QB ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED SF1: ;=========================TESTE CLR FLAGPA MOV QB,#28D RET_: ;LC>TMAX (REJEITAR DADO - SEM TRANSMISSÃO ) MOV CSR7,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR6,#0H MOV CSR5,#0H MOV CSR4,#0H MOV CSR3,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR2,#0H MOV CSR1,#0H MOV CSR0,#0H L0: CLR FLAGH MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H L1: RET ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G SEG58: MOV A,HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) CLR C SUBB A,LC MOV A,CSR7 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV CSR7,A MOV A,CSR6 RRC A MOV CSR6,A MOV A,CSR5 RRC A MOV CSR5,A MOV A,CSR4 RRC A MOV CSR4,A JB FLAGPA,PULA2 AJMP SEG44 PULA2: MOV A,CSR3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV CSR3,A MOV A,CSR2 RRC A MOV CSR2,A MOV A,CSR1 RRC A MOV CSR1,A MOV A,CSR0 RRC A MOV CSR0,A AJMP SEG44 XLO: AJMP L0 ;LE PROXIMO BIT ;------------------------------------- SEG44: ;H DJNZ QB,XLO ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO JB FLAGPA, SEG66 MOV QB,#4D ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 ACERTA: CLR C MOV A,CSR7 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV CSR7,A MOV A,CSR6 RRC A MOV CSR6,A MOV A,CSR5 RRC A MOV CSR5,A MOV A,CSR4 RRC A MOV CSR4,A ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DJNZ QB,ACERTA JB FLAG1,PULA1 MOV CSR6A,CSR6 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOV CSR5A,CSR5 MOV CSR4A,CSR4 SETB FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO MOV QB,#28D AJMP RET_ PULA1: CLR FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOV A, CSR6 CJNE A,CSR6A,ERROR MOV A,CSR5 CJNE A,CSR5A,ERROR MOV A,CSR4 CJNE A,CSR4A,ERROR ;ERRO DE RECEPÇAO SETB FLAGX ;OK - BOA RECEPÇÃO HT6P20B MOV QB,#28D AJMP RET_ SEG66: SETB FLAGY ;OK - BOAS RECEPÇÃO HCS CLR FLAG1 MOV QB,#28D CLR FLAGPA AJMP L0 ERROR: MOV CSR6A,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV CSR5A,#0H MOV CSR4A,#0H SAI_ROT: CLR FLAGX CLR FLAGH MOV QB,#28D LJMP RET_ ROT_HT6P: MOV A,CSR6A CJNE A,#0H,J1 MOV A,CSR5A CJNE A,#0H,J1 MOV A,CSR4A CJNE A,#0H,J1 ACALL RLIMPA MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG1 ACALL ENV_MSG MOV A,#0C5H ACALL EC MOV DPTR,#MSG3 ACALL ENV_MSG AJMP MAIN J1: ACALL RLIMPA MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG5 ACALL ENV_MSG MOV A,#0C5H ACALL EC MOV A,CSR6A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR5A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR4A ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,#20H ACALL DELAYM CLR FLAGX CLR FLAGY AJMP MAIN ROT_HCS: ACALL RLIMPA MOV A,#LINHA1 ACALL EC MOV DPTR,#MSG4 ACALL ENV_MSG MOV A,#0C0H ;LINHA 2 ACALL EC MOV A,CSR7 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR6 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR5 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR4 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR3 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR2 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR1 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,CSR0 ACALL conv_asc2 MOV TMP,R1 ACALL ED MOV A,TMP ACALL ED MOV A,#20D ACALL DELAYM CLR FLAGX CLR FLAGY AJMP MAIN ;================================================================================= ; SUB-ROTINAS ;================================================================================= ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) ; ; ; EX: C0=FF ; C1=FF ; SERÁ APÓS CONVERSÃO : ; RES2=06 , RES1=55 ,RES0=35 (OBS. VALOR MÁXIMO 65535) ;*************************************************************************** ; RESERVAR ESTES REGISTRADORES NA MEMÓRIA ( SRAM) ; LC data 20H ;LOOPCOUNTER ; BR0 data 21H ;RESULTADOS DA CONVERSÃO ; BR1 data 22H ; BR2 data 23H ; C1 data 24H ;VALOR DE ENTRADA ALTO ; C0 data 25H ;BAIXO HEX_DEC: MOV LC,#16 ;CARREGA 16 MOV BR0,#0 ;ZERA RESULTADOS MOV BR1,#0 MOV BR2,#0 VOLTA: MOV A, C0 ;DESLOCA PARA ESQUERDA C0,C1,RES0,1,2 CLR C RLC A MOV C0,A MOV A, C1 RLC A MOV C1,A MOV A, BR0 RLC A MOV BR0,A MOV A, BR1 RLC A MOV BR1,A MOV A, BR2 RLC A MOV BR2,A DJNZ LC ,SEG9 ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO RET ;FI DA CONVERSÃO SEG9: MOV A,#3H ADD A,BR2 ;SOMA 3 EM RES2 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR2 MOV BR2,A NSOMA3: MOV A,#30H ADD A,BR2 ANL A,#80H CJNE A,#80H ,NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR2 MOV BR2,A NSOMA3A: MOV A,#3H ADD A,BR1 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR1 MOV BR1,A NSOMA3B: MOV A,#30H ADD A,BR1 ANL A,#80H CJNE A,#80H ,NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR1 MOV BR1,A NSOMA3C: MOV A,#3H ADD A,BR0 ANL A,#8H ; 2ELEV 3=8 CJNE A,#8H ,NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 MOV A,#3H ; É=1 ENTAO SOMA 3 ADD A,BR0 MOV BR0,A NSOMA3D: MOV A,#30H ADD A,BR0 ANL A,#80H CJNE A,#80H ,NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOV A,#30H ; É=1 ENTAO SOMA 30h ADD A,BR0 MOV BR0,A NSOMA3E: LJMP VOLTA ;======================================================================== conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOV R0,A ANL A,#0FH ADD A,#0F6H JC LETRAS ADD A,#3AH AJMP SAIQ LETRAS: ADD A,#41H SAIQ: MOV R1,A MOV A,R0 SWAP A ANL A,#0FH ADD A,#0F6H JC LETRAS1 ADD A,#3AH AJMP SAIQ1 LETRAS1: ADD A,#41H SAIQ1: ret LcdInit: mov r0, #7 ; envia 7 bytes mov dptr, #LcdISeq clr RS ;comando ajmp envfrase ED: envdado: setb rs mov r0,#1h ajmp envbyte EC: envcom: clr rs mov r0,#1h ajmp envbyte envfrase: ; coloque em r0 a quantidade de bytes a enviar ;use diretiva db xxh,xxh. ..... ;coloque em dptr o endereço do byte(s) a enviar ;rs=0 comando, rs=1 caracteres; rw=0 escrita, rw=1 leitura ; use acall 'envfrase'. clr a movc a, @a+dptr ; obtem sequencia de bytes inc dptr ; coloque 1 em r0, ajuste rs=1, rw=0 e coloque em'a' ; o caracter a enviar. use acall 'envbyte' envbyte: mov r4, #2 ; envia 2 nibbles mov r5, a ; guarda o byte em r5 LcdLoop2: anl a, #0F0H ;mov LCD, a anl LCD, #00001111b ;apaga lcd4..lcd7 e rs orl LCD, a setb E ;habilita display a receber nop clr E mov r7, #10 ; reliza um pouco de atraso LcdILoop3: ; porque 'buzy' não pode ser lido ainda djnz r6, LcdILoop3 djnz r7, LcdILoop3 mov a, r5 ; pega o byte original em r5 swap a ; obtem o primeiro nibble djnz r4, LcdLoop2 ; envia o segundo nibble djnz r0, envfrase ; volta a envia os 7 bytes ret ; rotina de inicialização do display LcdISeq: db 33H, 32H, 28H, 6H, 1H, 0FH, 0CH ;rotina de atraso em ms passado pelo 'a' delayms: mov R7,a volta3: mov R6,#2 volta2: mov R5,#250 volta1: djnz R5, volta1 djnz R6, volta2 djnz R7,volta3 ret ;****************************************************************** DELAYM: MOV R0,A XC: ACALL AGUARDE DJNZ R0,XC RET AGUARDE: ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOV R1,#64D CG2: MOV R2,#255D DJNZ R2,$ DJNZ R1,CG2 RET ;=========================================================== ;MUDA PARA LINHA1 RLINHA1: MOV A,#LINHA1 ACALL EC RET ;MUDA PARA LINHA 2 RLINHA2: MOV A,#LINHA2 ACALL EC RET ;LIMPA A TELA RLIMPA: MOV A,#01H ACALL EC RET ;TEMPO DE APRESENTAÇÃO DA MENSAGEM NO VISOR DO LCD RTSHOW: MOV A,#65H ACALL DELAYM RET end