;********************************************************************************************* ; RX_GEN_HT6P.ASM ; ; ; RECEPTOR GENERICO DE RF PARA CONTROLE REMOTOS (CHAVEIRINHOS) COM CI HT6P20B. ; MAX: 82 CONTROLE REMOTOS (MEMÓRIA 24C02) ; PARA DECODIFICAR UTILIZA UM ATMEL AT89C2051 DE 20 PINOS. ; ; AUTOR: CLAUDIO LÁRIOS INICIO: 04-07-2012 TERMINO:10-07-2012 ; BLOG 'LARIOS.TECNOLOGIA.WS' ; (LIBERADO PARA USO NÃO COMERCIAL) ;********************************************************************************************* ; ; GRAVAR CONTROLE: APERTE UM BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 6 DO AT89C2051 A MASSA)E ; SOLTE-O EM MENOS DE 1 SEGUNDOS. O LED 'LEARN'(PINO 7) PISCARÁ 1 ; VEZ, PARA INDICAR 'CODE APRENDIDO'. REPITA ISTO COM OS OUTROS CONTROLES ; QUE FOR UTILIZAR, UM POR VEZ. ESTA VERSÃO 'ZERA' AS INFORMAÇÕES DOS BOTÕES ; APERTADOS, DE MANEIRA QUE PROGRAMANDO APENAS QUALQUER UM DOS BOTÕES, OS OUTROS ; SERÃO AUTOMATICAMENTE ACEITOS. O OBJETIVO DISTO É POUPAR MEMÓRIA PARA PODERMOS ; GRAVAR MAIS CONTROLES NA EEPROM. ; ; APAGAR TODOS OS CONTROLES DA MEMÓRIA: APERTAR BOTÃO 'LEARN' NA PLACA E ; MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED 'LEARN' (PINO 7) PISCARÁ ; 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS SENSORES DA MEMÓRIA. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ; ; QUANTIDADE DE CONTROLES MAXIMA: 82 CONTROLES DIFERENTES. QUANDO ATINGIR ESTE LIMITE, ; NÃO ACEITARÁ NOVO APRENDIZADO, AVISANDO ESTA SITUAÇÃO POR DAR PISCADAS RAPIDAS POR 10 SEG ; NO LED 'LEARN'. NOVOS APRENDIZADOS SÓ OCORRERÁ COM O APAGAMENTO COMPLETO DA EEPROM E ; EM SEGUIDA, PODERÁ NOVAMENTE OCORRER O APRENDIZADO DOS CONTROLES. ; COM RESPEITO AO CI HT6P20B, ELE PERMITE O ENVIO DO ESTADO DE 2 BOTÕES APENAS, PORTANTO ; OS LEDS DOS PINOS 14 E 15 NÃO PRECISAM SER UTILIZADOS. ; USE CRISTAL 12 MHZ ;********************************************************************************************* ; Utiliza uma memória 24C02 para armazenar dados dos códigos dos ; transmissores permitidos. ; PINAGENS: ; PINO 1= RESET - LIGAR A MASSA 22K E CAPACITOR 1UF AO VCC ; PINO 2/8/9/11/18/19= NÃO USADOS ; PINO 3= ENTRADA DO SINAL A DECODIFICAR VIA RESISTOR DE 470 OHMS A 1K ; PINO 4/5= XTAL DE 12MHZ ; PINO 6= AO VCC VIA RESISTOR DE 10K E AO BOTÃO DE 'LEARN' A MASSA ; PINO 7= RESISTOR DE 470 OHMS AO LED DE 'LEARN' A MASSA. ; PINO 10= GND ; PINO 12= SAIDA 'S0' 1=SINAL OK ; PINO 13= SAIDA 'S1' 1=SINAL OK ; PINO 14= SAIDA 'S2' 1=SINAL OK ; NÃO USADO PARA HT6P20B ; PINO 15= SAIDA 'S3' 1=SINAL OK ; NÃO USADO PARA HT6P20B ; PINO 16= SDA DA 24C04 (DADO) ; PINO 17= SCL DA 24C04 (CLOCK) ; PINO 20= VCC (+5V) ; ; USE XTAL 12MHZ ;***************************************************************************************** ; REGISTRADORES E REDEFINIÇÕES IND EQU R0 ; INDIRECT ADDRESS REGISTER RTCC EQU TH0 ; REAL TIME COUNTER CLOCK STATUS EQU PSW ; STATUS REGISTER PORTA EQU P3 ; PORT A DE P3,0 A P3,5 E 3.7 (INCOMPLETA) PORTB EQU P1 ; PORT B P1 DE P1,0 A P1,7 (COMPLETA) ; REGISTRADORES E CONTADORES ; ENDEREÇO 20H RESERVADO PARA MACROS PIC TEMP EQU 20H FLAGS DATA 21H ; USER FLAG REGISTER ADDRESS DATA 22H ; ADDRESS REGISTER RES3 EQU 23H ; REGISTRADORES DE RECEPÇÃO DE BITS TRANSMITIDOS RES2 EQU 24H RES1 EQU 25H RES0 EQU 26H DYTA EQU 2BH ;DADOS DE ENTRADA E SAIDA NO I2C MEMORY BITCOUNTER EQU 2EH Z2 EQU 32H Z1 EQU 33H LC EQU 3BH HC EQU 3CH CONT EQU 3DH RES3A EQU 27H RES2A EQU 28H RES1A EQU 29H RES0A EQU 2AH TMP EQU 49H ;DEFINIÇÕES DA PORTAS E FLAGS ;=============================================================================== SDA EQU PORTB.4 ; LINHA DE DADOS DA 24C02 PINO 5(16) (P1.4) SCL EQU PORTB.5 ; LINHA DE CLOCK DA 24C02 PINO 6(17) (P1.5) FLAG EQU FLAGS.0 ;FLAG DE SITUAÇÃO FLAG1 EQU FLAGS.1 ;FLAG DE NOVA LEITURA FLAGGR EQU FLAGS.2 ;FLAG DE 'LEARN' APRENDER SIN EQU P3.1 ;PINO 3 IN RF LRN EQU P3.2 ;PINO 6 IN LEARN BOTTON LED EQU P3.3 ;PINO 7 SAIDA LED 'LEARN' LED1 EQU P1.0 ;PINO 12- SAIDA DO LED2 LED2 EQU P1.1 ;PINO 13- SAIDA DO LED1 LED3 EQU P1.2 ;PINO 14- SAIDA DO LED2 LED4 EQU P1.3 ;PINO 15- SAIDA DO LED1 ;VARIAVÉIS DE TEMPO E CARGA DE CONTADORES ;============================================================================== TMAX EQU 50D ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU 28D ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO + 4 ANTICODE) TGR EQU 220D ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO PONTM EQU 0H ;ENDEREÇO DO PONTEIRO DA MEMÓRIA EEPROM EXT. LEDACESO EQU 25D ;TEMPO QUE LED'S DA SAIDA FICAM ACESOS APÓS UM TOQUE ;------------------------------------------------------------------------------ ORG 00H AJMP RESETA ORG 30H RESETA: START: MOV PORTA,#0H ; PORTA ; RESET PORTA MOV PORTB,#0H ; PORTB ; RESET PORTB MOV FLAGS,#0H ; FLAGS; RESET FLAGS ;CONDIÇÃO DE PRIMEIRO USO DA MEMÓRIA (VIRGEM) MOV ADDRESS,#PONTM ACALL EEREAD1 CJNE A,#0FFH, SAD1 MOV DYTA,#0H ACALL EEWRITE1 SAD1: MOV Z2,#TGR ;CARGA DO TEMPO DO BOTÃO 'LEARN' APERTADO PARA APAGAR TODOS CONTROLES MOV Z1,#0H ;LIMPA REGISTRADORES INICIO: MOV RES3,#0H ;APAGA REGISTRADORES DE RECEPÇÃO DE CÓDIGO MOV RES2,#0H MOV RES1,#0H MOV RES0,#0H MOV BITCOUNTER,#QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER L0: CLR FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO MOV HC,#0H ;APAGA REGISTRADORES DE UNS E ZEROS MOV LC,#0H L1: ;--------------------------------- SETB LRN ;LEVANTA PARA TESTE JB LRN,L1HS ;TESTA BOTÃO 'LEARN' APERTADO AJMP TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO L1HS: MOV Z2,#TGR ;RENOVA CARGA DO TEMPO PARA APAGAMENTO MOV Z1,#0H ;LIMPA REGISTRADORES L1H: LJMP SS5 TAPAGAMENTO: ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DJNZ Z1,L1H ;QUANDO A CONTAGEM DESTE REGISTRADORES (Z1,Z2) CHEGAM AO FIM OCORRE O APAGAMENTO DJNZ Z2,L1H ACALL EEERASE ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA ACALL PTZERA ;POEM '00' NO PONTEIRO DA EEPROM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LED ;ACENDE LED (UMA PISCADA) MOV A,#10D ACALL DELAYM CLR LED ;APAGA LED MOV A,#10D ACALL DELAYM SETB LRN JNB LRN,$ ;AGUARDA SOLTAR BOTÃO 'LEARN' LJMP INICIO ;INICIA ROTINA DE RECEPÇÃO DE SINAL DO HT6P20B ;========================================================== SS5: ;A JNB FLAG , L2 ;TESTA FLAG DE HUM RECEBIDO ;FLAG=0 VAI PARA L2 ;-------------------------------- ;B SETB SIN ;LEVANTA PARA TESTE FLAG=1 JNB SIN, MO ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF SIN=0 VAI PARA 'MO' ;SE SIN=1 VAI PARA 'L2' ;---------------------------------- L2: ;C SETB SIN ;LEVANTA PARA TESTE JNB SIN, LA1 ;SIN=0 VAI INCREMENTAR LC EM 'LA1' ;SIN=1 VAI INCREMENTAR HC E SETAR FLAG ;------------------------------------- ;E SETB FLAG ;SIN=1 INC HC MOV A,HC JNZ LA2 DEC HC LJMP LA2 ;VAI PARA 'LA2' CONTAR TEMPO DE 50 MICRO SEGUNDOS ;--------------------------------------------------------- LA1: ;SIN=0 ;D INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF MOV A,LC JNZ LA2 DEC LC LA2: MOV CONT,#24D ; 24D = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) DJNZ CONT,$ LJMP L1 ;================================================================================================ MO: ;F ;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 LJMP INICIO ;LC>TMAX (REJEITAR DADO - SEM TRANSMISSÃO ) ;=============================================================================================== NK: ;OK C=1 SE LC>HC ;G MOV A,HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) CLR C SUBB A,LC MOV A,RES3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV RES3,A MOV A,RES2 RRC A MOV RES2,A MOV A,RES1 RRC A MOV RES1,A MOV A,RES0 RRC A MOV RES0,A AJMP SEG44 XLO: AJMP L0 ;AUXILIAR DE JUMP ;LE PROXIMO BIT ;------------------------------------- SEG44: ;H DJNZ BITCOUNTER,XLO ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO MOV BITCOUNTER,#4D ;DESPREZA OS 4 BITS DE 'ANTICODE' 1010 ACERTA: CLR C MOV A,RES3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRC A MOV RES3,A MOV A,RES2 RRC A MOV RES2,A MOV A,RES1 RRC A MOV RES1,A MOV A,RES0 RRC A MOV RES0,A ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DJNZ BITCOUNTER,ACERTA JB FLAG1,PULA1 MOV RES2A,RES2 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOV RES1A,RES1 MOV RES0A,RES0 SETB FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO LJMP INICIO PULA1: CLR FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOV A, RES2 CJNE A,RES2A,RESETAC MOV A,RES1 CJNE A,RES1A,RESETAC MOV A,RES0 CJNE A,RES0A,RESETAC ;ERRO DE RECEPÇAO AJMP ACAO ;OK - BOA RECEPÇÃO RESETAC: MOV RES3A,#0H ; APAGA RESULTADOS DE COMPARAÇÃO MOV RES2A,#0H MOV RES1A,#0H MOV RES0A,#0H LJMP INICIO ;====================================================================== ACAO: ;I SETB LRN ;LEVANTA PARA TESTE JB LRN,F55 ;BOTÃO ESTÁ APERTADO? NÃO SETB FLAGGR ;SIM F55: ACALL PPT CJNE A,#0H,MADDRESS ; É '0'? 0=NENHUM CONTROLE FOI GRAVADO LJMP APRENDER MADDRESS: MOV A,RES2 ANL A,#00111111B ;APAGA BOTÕES PARA SALVAR ESPAÇO NA EEPROM MOV RES2,A MOV ADDRESS,DYTA ;CARREGA ULTIMO ENDEREÇO GRAVADO ACALL EEREAD1 CJNE A,RES2,PROXIMO ;COMPARA COM RES2 DEC ADDRESS ACALL EEREAD1 CJNE A,RES1,PROXIMO1 ;COMPARA COM RES1 DEC ADDRESS ACALL EEREAD1 CJNE A,RES0,PROXIMO2 ;COMPARA COM RES0 AJMP ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO2: INC ADDRESS PROXIMO1: INC ADDRESS PROXIMO: ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA .PROCURAR.... MOV A,ADDRESS CLR C SUBB A,#3D ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA MOV DYTA,A ;SALVA (ESTAVA EM TMP A INVES DE DYTA) JC APRENDER JZ APRENDER AJMP MADDRESS ;VOLTA A BUSCA APRENDER: JB FLAGGR,F21A ;TESTA SE BOTÃO 'LEARN' FOI PRESSIONADO LJMP INICIO ;NÃO ESTÁ. F21A: ACALL PPT ;ESTÁ, PEGA PONTEIRO ;retorna em 'w' e 'dyta' MOV ADDRESS,A ;CARREGA 'ADDRESS' MOV A,#0FCH ;LIMITE MAXIMO DA EEPROM (255-1 /3= 82 CONTROLES MAX) CLR C SUBB A,ADDRESS ;PEGA O ENDEREÇO APONTADO ;LIMITE MAXIMO DA EEPROM (128-1 /3= 42 BOTÕES OU 24 CONTROLES) JNC FG31 ;=============================================================================================== ; OPÇÃO MELHOR: AVISAR QUE TODA A MEMÓRIA FOI OCUPADA E NÃO ACEITAR MAIS CONTROLES. AVISAR POR PISCADAS RAPIDAS ESTA ;SITUAÇÃO MOV A,#50D ; 50 PISCADAS RAPIDAS MOV R3,A PISC6: SETB LED ;LIGA LED MOV A,#3D ;TEMPO DE ATRASO ACALL DELAYM CLR LED ;DESLIGA MOV A,#3D ;TEMPO DE ATRASO ACALL DELAYM DJNZ R3,PISC6 JNB LRN,$ ;ESPERA SOLTAR BOTÃO LJMP RESETA ;================================================================================================== FG31: INC ADDRESS ;SOMA 1 MOV DYTA,RES0 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 ;ROTINA DE ESCRITA NA EEPROM INC ADDRESS ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOV DYTA,RES1 ;CARREGA REGISTRO DE GRAVAÇÃO ACALL EEWRITE1 INC ADDRESS MOV A,RES2 ;CARREGA REGISTRO DE GRAVAÇÃO ANL A,#00111111B ;APAGA BOTÕES MOV DYTA,A ACALL EEWRITE1 MOV DYTA,ADDRESS ;SALVA ULTIMA POSIÇÃO NO PONTEIRO MOV ADDRESS,#PONTM ACALL EEWRITE1 ;GRAVA NOVO ENDEREÇO DE PONTEIRO CLR FLAGGR SETB LRN ;LEVANTA PARA TESTE JNB LRN,$ ;ESPERA SOLTA BOTÃO 'LEARN' MOV A,#10D ;TEMPO DE ATRASO ACALL DELAYM ;============================================= ; UMA PISCA NO LED 'LEARN' PARA AVISAR QUE APRENDIZADO FOI ACEITO SETB LED ;LIGA LED MOV A,#10D ;TEMPO DE ATRASO ACALL DELAYM CLR LED ;DESLIGA ACIONAR: JNB RES2A.7,PY6 ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO SETB LED1 ;ATIVA LED1 PY6: JNB RES2A.6,PY5 SETB LED2 ;ATIVA LED2 PY5: ;=============================================================== ; ATENÇÃO: NÃO USADO PARA O HT6P20B , POIS ATUA SOMENTE 2 BOTÕES ;JNB RES2A.5,PY4 ; SETB LED3 ;ATIVA LED3 ;PY4: ;JNB RES2A.4,PY3 ; SETB LED4 ;ATIVA LED4 ;PY3: ;================================================================= MOV A,#LEDACESO ACALL DELAYM ;TEMPO QUE SE MANTEM ACESOS CLR LED1 CLR LED2 CLR LED3 CLR LED4 LJMP INICIO ;****************************************************************** ; ; ROTINAS DE DELAY E OUTRAS ; ;****************************************************************** DELAYM: MOV R0,A XC: ACALL AGUARDE DJNZ R0,XC RET ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT: MOV ADDRESS,#PONTM ACALL EEREAD1 ;LE PONTEIRO DA EEPROM RET ;**************************************************** AGUARDE: ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOV R1,#64D CG2: MOV R2,#255D DJNZ R2,$ DJNZ R1,CG2 RET ;****************************************************** ;----------------------------------------------------------------------------- ; ; I2C ROTINAS PARA EEPROM 24C0X ; ;------------------------------------------------------------------------------- I2C_READ: ;reading 8 bits from i2c device MOV R7,#8 GFD: SETB SDA ;LEVANTA PARA LEITURA SETB SCL MOV C,SDA RLC A NOP CLR SCL DJNZ R7,GFD RET I2C_WRITE: ;writing 8 bits in to i2c device MOV R7,#8 WRITING: RLC A MOV SDA,C LCALL CLOCK DJNZ R7,WRITING RET I2C_START: ;start of i2c routine SETB SCL SETB SDA NOP CLR SDA NOP CLR SCL RET I2C_STOP: ;end of i2c routine CLR SDA SETB SCL NOP SETB SDA NOP CLR SCL RET CLOCK: ;synchronizing clock SETB SCL NOP NOP NOP NOP CLR SCL RET ACK: ;acknowledge from transmitter or receiver SETB SDA SETB SCL JB SDA,$ CLR SCL RET NO_ACK: ;no acknowledge from transmitter or receiver SETB SDA NOP CLR SCL NOP JNB SDA,$ NOP SETB SCL RET ;***************************************************************** ; ROTINA DE ESCRITA NA EEPROM ;****************************************************************** EEWRITE1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E DADO EM 'DYTA' EEPROM_WRITE: ;write in to eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;USE SOMENTE PARA ADDRESS DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK MOV A,DYTA LCALL I2C_WRITE LCALL ACK LCALL I2C_STOP LCALL DELAY_STOP RET ;*********************************************************************** ; ROTINA DE LEITURA NA EEPROM ;*********************************************************************** EEREAD1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E RECEBA O DADO EM 'DYTA'E 'A' EEPROM_READ: ;LENDO A EEPROM LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;SOMENTE PARA MEMORIAS COM ENDEREÇO DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK LCALL I2C_START LCALL EEPROM_READ_ADDR LCALL ACK LCALL I2C_READ LCALL NO_ACK LCALL I2C_STOP MOV DYTA,A RET ;-------------------------------------------- EEPROM_READ_ADDR: ;A2,A1,A0 ZERAR MOV A,#10100001B LCALL I2C_WRITE RET EEPROM_WRITE_ADDR: ;A2,A1,A0 ZERAR MOV A,#10100000B LCALL I2C_WRITE RET DELAY_STOP: ;FIM DA LEITURA MOV R4,#20 VH1: MOV R3,#250 DJNZ R3,$ DJNZ R4,VH1 RET ;************************************************************************************************* ; APAGAMENTO DE TODA EEPROM ;------------------------------------------------------------- EEERASE: ;APAGA TODAS AS POSIÇÕES DE MEMÓRIA SELECIONADA EM A0 (1=PAGINA HIGH/0=PAG LOW) MOV R6,#32 ;32 PAGINAS DE 8 BYTES MOV R5,#8 ; 8 BYTES POR PAGINA MOV ADDRESS,#0H EET1: LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK EET2: MOV A,#0FFH LCALL I2C_WRITE LCALL ACK DJNZ R5,EET2 LCALL I2C_STOP ACALL DELAY_STOP ; TEMPO DE GRAVAÇÃO MOV A,#8 ADD A,ADDRESS MOV ADDRESS,A DJNZ R6,EET1 LCALL DELAY_STOP RET ;******************************************************************* PTZERA: MOV ADDRESS,#PONTM ;CARREGA ENDEREÇO DO PONTEIRO DA EEPROM MOV DYTA,#0H ACALL EEWRITE1 RET ;******************************************************************* END