*************************************************************************************************** ;************************************************************************** ; RX_GEN_HT6P20B_908QT1.ASM ; ; ; RECEPTOR RF PARA CONTROLE REMOTOS (CHAVEIRINHOS) COM CI HT6P20B ; ; PARA DECODIFICAR UTILIZA UM MC68HC908QT1. ; CLAUDIO LÁRIOS INICIO: 01-04-2013 TERMINO:04-04-2013 ; VERSÃO 4: MANTÉM LEDS ACESOS ENQUANTO BOTÃO FICAR PRESSIONADO (NÃO PISCA) ;************************************************************************** ; ; GRAVAR CONTROLE: APERTE UM BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 4 DO PIC 12F629 A MASSA)E ; SOLTE-O EM MENOS DE 1 SEGUNDOS. O LED 'LEARN'(PINO 2) PISCARÁ 1 ; VEZ, PARA INDICAR 'CODE APRENDIDO'.sE A 'OPÇÃO DE USUÁRIO FOR 'SET LEARN_ONE' ; TODOS OS OUTROS BOTÕES SERÃO APRENDIDOS JUNTOS NESTA OPERAÇÃO. ; CASO A OPÇÃO DE USUÁRIO FOR 'SETNOT LEARN_ONE' DEVERÁ ENTÃO REPITIR A OPERAÇÃO ; COM OS OUTROS BOTÕES DO CONTROLE E COM TODOS OS CONTROLES REMOTOS QUE FOR ; UTILIZAR, UM POR VEZ. ; 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 4) 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. ;*************************************************************************** ************************************************************************************** ;OPÇÃO DO USUÁRIO ;(DESCOMENTE A OPÇÃO DESEJADA E COMENTE A OUTRA) ;MODO DE APRENDIZADO: $SET LEARN_ONE ;APRENDE UM BOTÃO, APRENDE TODOS (UNICA OPERAÇÃO POR CONTROLE) ;$SETNOT LEARN_ONE ;APRENDE CADA BOTÃO EM SEPARADO (3 OPERAÇÕES POR CONTROLE) ************************************************************************************** $base 10T ;Base Decimal como default\par ;$include "C:\pemicro\pkg08sz\Mreg\qtqy_registers.inc" ;use esta opção para caminho diferente $include 'qtqy_registers.inc' ;use esta quando arquivo estiver na mesma pasta do ASM * EQUATES: RAMSPACE EQU $80 ;INICIO DA RAM (128 BYTES) FLASHSPACE EQU $F800 ;INICIO DA FLASH BUSFREQ EQU 4 USCOUNT EQU $0E USDELAY EQU BUSFREQ*USCOUNT PAG EQU $3F ;COLOQUE AQUI A PAGINA A SER USADA COMO EEPROM 64 BYTES (USE DE PREFERENCIA A ULTIMA 0-3F) EEPROM_INIT EQU 0FD80H ;INICIO DO ESPAÇO DA FLASH QUE SERÁ USADA COMO 'EEPROM'. TMAX EQU 50T ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU 28T ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO+ 4 ANTICODE) TGR EQU 0FFH ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO T_DESL_LED EQU 20T ;TEMPO MÁXIMO QUE LEDS FICAM ACESOS APÓS CESSAR TRANSMISSÃO PORTS: SIN EQU PTA0 LED EQU PTA3 LRN EQU PTA1 LED1 EQU PTA4 LED0 EQU PTA5 ;flags: FLAG EQU 0 FLAG1 EQU 1 FLAGGR EQU 2 ;EQUATES DE SUBROTINAS DELNUS EQU 280CH ;ROTINA DE DELAY NA ROM RESIDENTE ERARNGE EQU 2806H ;ROTINA DE APAGAMENTO NA ROM RESIDENTE PRGRNGE EQU 2809H ;ROTINA DE PROGRAMAÇÃO NA ROM RESIDENTE GETBYTE EQU 2800H ;ROTINA DE SERIAL 9600 BAUDS (IN) NA ROM RESIDENTE * ------------------------------------------------------------------- * RAM variables * ------------------------------------------------------------------- ORG RAMSPACE ;Start of RAM LC RMB 1 ;LOOP COUNTER HC RMB 1 ;LOOP COUNTER Z1 RMB 1 ;LOOP COUNTER Z2 RMB 1 ;LOOP COUNTER Y1 RMB 1 ;LOOP COUNTER Y2 RMB 1 ;LOOP COUNTER TMP RMB 1 ;REGISTRADOR TEMP RMB 1 ;REGISTRADO LOW DO DADO A SER CONVERTIDO DE BCD PARA DECIMAL ;NÃO ALTERE A POSIÇÃO DOS PRÓXIMOS 7 BYTES CTRBYT RMB 1 ;DATA STRUCT ;88H CPUSPD RMB 1 ;IDEM LADDR RMB 2 ;IDEM RES0 RMB 1 ;(DATA)REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (UNIDADE) RES1 RMB 1 ;(DATA)REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (DEZENA) RES2 RMB 1 ;(DATA)REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (CENTENA) RES3 RMB 1 ;IDEM RES0A RMB 1 ;REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (DEZENA) RES1A RMB 1 ;REGISTRADO DO RESULTADO DA CONVERSÃO PARA DECIMAL (CENTENA) RES2A RMB 1 ;IDEM RES3A RMB 1 ;IDEM RAU RMB 1 ;AUXILIAR (USO DO CONVERSOR BCD_TO_DEC FLAGS RMB 1 ;FLAGS CONT RMB 1 ;CONTADOR CONT1 RMB 1 ;CONTADOR CONT2 RMB 1 ;CONTADOR CONT3 RMB 1 ;CONTADOR Counter RMB 1 ;CONTADOR BITCOUNTER RMB 1 ;CONTADOR TMP_SALVO RMB 1 ;REGISTRADOR ADDRESS RMB 1 ;REGISTRADOR C0 RMB 1 ;REGISTRADO LOW DO DADO A SER CONVERTIDO DE BCD PARA DECIMAL C1 RMB 1 ;REGISTRADO HIGH DO DADO A SER CONVERTIDO DE BCD PARA DECIMAL CNT RMB 1 ;GERAL ******************************************************************************* * INICIO DO PROGRAMA ******************************************************************************* ;CONFIGURAÇÕES INICIAIS ORG FLASHSPACE ;Start of FLASH memory Start: MOV #$0B,CONFIG1 ;Set LVI5OR3 and COPD, enable STOP MOV #$00,CONFIG2 ;CLOCK INTERNO SEM RESET NOP NOP SEI MOV #%00000000,PTA ;LIMPA PORTA CLR C0 ;LIMPA REGISTRADORES CLR C1 MOV #%00000010,PTAPUE ;PORT A PULLUP ENABLE REGISTER MOV #%00111000,DDRA ;1=SAIDA 0= ENTRADA MOV #%00000010,KBSCR ;DESABILITA INTERRUPÇÃO DO KEYBOARD MOV 0EH,CPUSPD ;CARGA DA FREQUÊNCIA PARA ROTINAS DA ROM RESIDENTE ******************************************************************************* INICIO: CLR RES3 ;LIMPA REGISTRADORES DE RECEPÇÃO CLR RES2 CLR RES1 CLR RES0 MOV #QBYTE,BITCOUNTER ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER L0 BCLR FLAG,FLAGS ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLR HC CLR LC L1 BRCLR LRN,PTA,TAPAGAMENTO ;TESTA BOTÃO 'LEARN' APERTADO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO MOV #TGR,Z2 ;RECARGA DO TEMPO DE APAGAMENTO CLR Z1 ;LIMPA REGISTRADORES L1H BRA SS5 TAPAGAMENTO ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DBNZ Z1,L1H DBNZ Z2,L1H JSR APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA PISCA BSET LED,PTA ;ACENDE LED (UMA PISCADA) LDA #8T ;DELAY 0,5 SEGUNDOS JSR DELAYM BCLR LED,PTA ;APAGA LED LDA #8T JSR DELAYM BSET LED,PTA ;ACENDE LED (UMA PISCADA) LDA #8T JSR DELAYM BCLR LED,PTA ;APAGA LED LDA #8T JSR DELAYM BSET LED,PTA ;ACENDE LED (UMA PISCADA) LDA #8T JSR DELAYM BCLR LED,PTA ;APAGA LED LDA #8T JSR DELAYM NOP BRCLR LRN,PTA,$-1 ;AGUARDA SOLTAR BOTÃO 'LEARN' BRA INICIO ;===================ROTINA DE RECEPÇÃO========================== SS5: ;A BRCLR FLAG,FLAGS,L2 ;TESTA FLAG DE HUM/ZERO RECEBIDO ;FLAG=0 ;-------------------------------- ;B BRCLR SIN,PTA,M0 ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF ; SIN=0 VAI PARA 'MO' ;---------------------------------- L2 ;C BRCLR SIN,PTA,LA1 ;SIN=0 VAI PARA 'LA1' ;------------------------------------- ;E BSET FLAG,FLAGS ;SIN=1 INC HC LDA HC CBEQA #0,LD1 BRA LA2 LD1 DEC HC BRA LA2 ;VAI CONTAR TEMPO DE 90 MICRO SEGUNDOS ;--------------------------------------------------------- LA1 ;D INC LC ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF LDA LC CBEQA #0,LD2 BRA LA2 LD2 DEC LC LA2 DBNZ Y1,J0 ;CONTADOR DE TEMPO DE DESLIGAMENTO DE SAIDAS DBNZ Y2,J0 ;CONTADOR DE TEMPO DE DESLIGAMENTO DE SAIDAS BCLR LED1,PTA ;APAGA LEDS BCLR LED0,PTA INC Y1 INC Y2 J0 LDA #30T ; 90 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) DBNZA * BRA L1 M0 ;---------------------------------- ;F LDA #TMAX ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUB LC BCC SEG55 ;C=1(NEGATIVO) LC>TMAX (REJEITAR DADO - PAUSA INICIAL) JMP INICIO SEG55 ;F' ;----------------------------------- ;G LDA HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUB LC ROR RES3 ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO ROR RES2 ROR RES1 ROR RES0 BRA H1 ;------------------------------------- ;H L0_AUX JMP L0 ;AUXILIAR DE JUMP H1 DBNZ BITCOUNTER,L0_AUX ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO ;LE PROXIMO BIT MOV #4T,BITCOUNTER ;DESPREZA OS BITS DE 'ANTICODE' 1010 ACERTA LSR RES3 ROR RES2 ROR RES1 ROR RES0 ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DBNZ BITCOUNTER,ACERTA BRSET FLAG1,FLAGS,PULA1 ;TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO MOV RES2,RES2A ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOV RES1,RES1A MOV RES0,RES0A BSET FLAG1,FLAGS ;SETA FLAG DE PRIMEIRA RECEPÇÃO JMP INICIO PULA1 BCLR FLAG1,FLAGS ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA LDA RES2 CBEQ RES2A,S1 BRA RESETAC S1 LDA RES1 CBEQ RES1A,S2 BRA RESETAC S2 LDA RES0 CBEQ RES0A,AÇÃO ;OK - BOA RECEPÇÃO BRA RESETAC ;ERRO DE RECEPÇÁO RESETAC CLR RES3A ; APAGA RESULTADOS DE COMPARAÇÃO CLR RES2A CLR RES1A CLR RES0A JMP INICIO ;------------------------------------- AÇÃO ;=========================================================== ;ROTINA PARA ELIMINAR RECEPÇÃO 'FFFFFF' (MEMÓRIA VIRGEM) LDA #0FFH CBEQ RES2,S11 BRA R_CONT S11 LDA #0FFH CBEQ RES1,S22 BRA R_CONT S22 LDA #0FFH CBEQ RES0,RESETAC ;RECEBEU 'FFFFFF' = ERRO BRA R_CONT R_CONT ;======================================================== MOV RES2,RES3 ;SALVA BOTÕES $IF LEARN_ONE BCLR 7,RES2 ;MASCARA OS BOTÕES BCLR 6,RES2 ;IDEM $ENDIF ;I BRSET LRN,PTA,I4 ;BOTÃO ESTÁ APERTADO? BSET FLAGGR,FLAGS I4 JSR PPT STA TMP_SALVO ;SALVA 'A' EM TMP_SALVO SUB #0T BEQ APRENDER ;NENHUM CONTROLE FOI GRAVADO MADDRESS LDA TMP_SALVO STA ADDRESS JSR EEREAD CBEQ RES2,I5 ;COMPARA COM RES2 BRA PROXIMO I5 DEC ADDRESS LDA ADDRESS JSR EEREAD CBEQ RES1,I6 ;COMPARA COM RES1 BRA PROXIMO I6 DEC ADDRESS LDA ADDRESS JSR EEREAD CBEQ RES0,ACIONAR ;COMPARA COM RES0, ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... LDA TMP_SALVO SUB #3T STA TMP_SALVO ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA BCS APRENDER ;SE 'C'= 0 VAI APRENDER BEQ APRENDER ;SE 'Z'= 1 ,VAI APRENDER BRA MADDRESS ;VOLTA A BUSCA ;============================================================================= INICIO1_AUX JMP INICIO ;AUXILIAR DE JUMP APRENDER BRCLR FLAGGR,FLAGS,INICIO1_AUX ;TESTA SE BOTÃO 'LEARN' ESTÁ PRESSIONADO JSR PPT ;ESTÁ, PEGA PRÓXIMO ENDEREÇO VAZIO STA ADDRESS ;PEGA O ENDEREÇO APONTADO LDA #1EH ;LIMITE MAXIMO DA EEPROM (32 /3= 10 BOTÕES OU 3 CONTROLES) SUB ADDRESS BCC AP1 ;CLR ADDRESS ;INICIA SOBREGRAVAÇÃO JMP PISCA ;NÃO CONSEGUE SOBREGRAVAR, PISCARÁ AVISANDO QUE MEMÓRIA ;ESTÁ CHEIA E DEVERÁ SER APAGADA PARA NOVAS GRAVAÇÕES AP1 LDA ADDRESS JSR EEWRITE_3BYTES ;ESCREVE NA FLASH OS 3 BYTES (RES0..RES2) BCLR FLAGGR,FLAGS ;APAGA FLAG DE GRAVAÇÃO BRCLR LRN,PTA,$ LDA #8T ;TEMPO DE ATRASO DE 0,5 SEG JSR DELAYM BSET LED,PTA ;LIGA LED LDA #8T ;TEMPO DE ATRASO DE 0,5 SEG JSR DELAYM BCLR LED,PTA ;DESLIGA ;************************************************************************************ ; ACIONAR SAÍDAS DE CONTROLE ;************************************************************************************ ACIONAR BRCLR 7,RES3,AC1 ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO BSET LED1,PTA ;ATIVA LED1 AC1 BRSET 7,RES3,AC2 BCLR LED1,PTA ;APAGA LED1 AC2 BRCLR 6,RES3,AC3 BSET LED0,PTA ;ATIVA LED0 AC3 BRSET 6,RES3,AC4 BCLR LED0,PTA ;APAGA LED0 AC4 MOV #T_DESL_LED,Y2 ;RECARGA DO TEMPORIZADOR DE DESLIGAMENTO CLR Y1 JMP INICIO ;******************************************************************** ; SUB ROTINAS ;******************************************************************** ;================================================================================== ; ROTINA APAGAEEPROM ;================================================================================== ;APAGAMENTO DOS CONTROLES GRAVADOS NA FLASH COMO SE FOSSE UMA 'EEPROM' APAGAEEPROM CLR CTRBYT ;MODO PAGE ERASE MOV #13T,CPUSPD ;FREQUENCIA * 4 (3,2 MHZ * 4 = 13) LDHX #0FD81H ;APAGA DE FD80 A FDFF JSR ERARNGE RTS ;==================================================================================== ; ROTINA EEREAD ;==================================================================================== ;LER EEPROM ; COLOQUE EM 'ACC' O ENDEREÇO A LER . VALOR RETORNARÁ EM 'ACC' EEREAD LDHX #EEPROM_INIT ;INICIO DA FLASH 'EEPROM' AND #31T ;LIMITA A 32 BYTES MAXIMO ADD #7FH TAX LDA ,X RTS ;================================================================================== ; ROTINA EEWRITE_3BYTES ;================================================================================== ;ESCREVER NA FLASH (COMO SE FOSSE UMA EEPROM) EEWRITE_3BYTES ;RECEBE EM 'W' O ENDEREÇO E OS 3 BYTES (RES1,RES2,RES3) SÃO OS DADOS A GRAVAR MOV #$0D,CPUSPD ;fop = 3,2MHz LDHX #EEPROM_INIT ;INICIO DA FLASH 'EEPROM' AND #31T ;LIMITA A 32 BYTES MÁXIMOS ADD #82H ;80H (1 BYTE) + 2 BYTES A GRAVAR TAX STHX LADDR DECX DECX ;ENDEREÇO INICIAL EM H:X JSR PRGRNGE ;ROTINA DE PROGRAMAÇÃO DA ROM RESIDENTE RTS ;=================================================================================== ; ROTINA PPT ;=================================================================================== ;PEGA PRÓXIMO ENDEREÇO LIVRE ;RETORNA EM 'ACC' OU 'ADDRESS', O PRÓXIMO ENDEREÇO LIVRE PPT MOV #0H,ADDRESS ;LIMPA ADDRESS MOV #31T,CNT ;LIMITA BUSCA A 32 BYTES LDHX #EEPROM_INIT ;APONTA PARA ENDEREÇO INICIAL LOOP1A LDA ,X ;PEGA CONTEUDO APONTADO POR H:X CBEQA #0FFH,TP1 ;COMPARA COM 'FF', SE IGUAL, JUMP BRA INC1 TP1 AIX #1H ;INCREMENTA 'X' LDA ,X ;CARREGA 'ACC' COM VALOR APONTADO POR H:X CBEQA #0FFH,TP2 ;COMPARA COM 'FF' BRA INC2 TP2 AIX #1H ;INCREMENTA 'X' LDA ,X CBEQA #0FFH,TP3 ;COMPARA COM 'FF' BRA INC3 ;DIFERENTE (JÁ ESTÁ GRAVADO) INC1 AIX #1H ;INCREMENTA 'X' INC ADDRESS ;INCREMENTA ADDRESS INC2 AIX #1H ;INCREMENTA 'X' INC ADDRESS ;INCREMENTA ADDRESS INC3 AIX #1H ;INCREMENTA 'X' INC ADDRESS ;INCREMENTA ADDRESS DBNZ CNT,LOOP1A ;TESTA ATÉ 32 POSIÇÕES TP3 LDA ADDRESS ;RETORNA EM 'ACC' O VALOR DE 'ADDRESS' RTS * ---------------------------------------------------------------------------------- * DELAY ROUTINES * ---------------------------------------------------------------------------------- ;ROTINA DE DELAY PARA MULTIPLOS DE 62 MS DELAYM STA TEMP B2 JSR DELAY_62MS DBNZ TEMP,B2 RTS *------------------------------------------------------------------- DELAY_62MS LDX #0FFH ; 3 * 'A' * 'X' + 8 (CICLOS) LDA #0FFH JSR DELNUS ;ROTINA DE DELAY NA ROM RESIDENTE RTS * ------------------------------------------------------------------- * VECTOR ASSIGNMENTS * ------------------------------------------------------------------- ORG ADCVEC FDB Trap ORG KBIVEC FDB Trap ORG TIMOFVEC FDB Trap ORG TIMCH1VEC FDB Trap ORG TIMCH0VEC FDB Trap ORG IRQ1VEC FDB Trap ORG SWIVEC FDB Trap ORG RESETVEC Trap FDB Start