;************************************************************************** ; RX_32.ASM ; ; ; RECEPTOR RF PARA CONTROLE REMOTOS 32 CANAIS ; COM CHAVES LIGA/DESLIGA ; ; PARA TRANSMISSÃO UTILIZA UM PIC 16F628A ; BLOG: 'LARIOS.TECNOLOGIA.WS' ; ; CLAUDIO LÁRIOS INICIO: 27-02-2013 TERMINO:05-03-2013 ;************************************************************************** ; APLICAÇÃO: CONTROLAR APLICAÇÕES A DISTANCIA ; TRABALHA EM CONJUNTO COM O RX_32_CH, COM ARQUIVO ASM: RX_32_CH_ASM ; UTILIZE TX + RX NA FREQUENCIA DE 27MHZ (OPCIONALMENTE 49 MHZ) OU 433MHZ ; PROTOCOLO: 1 STARTBIT + 2 BYTE (N. DO APARELHO) + 4 BYTE (BOTÕES) ; + 1 BYTE DE CONFERENCIA + TEMPO ENTRE TRANSMISSÕES ;*************************************************************************** ;INCLUDES LIST P=16F628A , R=DEC INCLUDE "P16F628A.INC" ;ELIMINA MENSAGEM DE ERRO ERRORLEVEL -302 ;=========================================================================================================== ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF ;=========================================================================================================== ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;=========================================================================================================== ;DEFINIÇÕES DE BITS E FLAGS #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE SIN PORTA,7 ;PINO 16 IN RF ;============================================================================================================ ;EQUATES T_LIGADO EQU .40 ;TEMPO MÁXIMO QUE RELE FICA LIGADO APÓS DESLIGAR BOTÃO TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .56 ;QUANTIDADE DE BYTES A SER RECEBIDO ;========================================================================================================== ; ESCOLHA AQUI O SEU SERIAL NUMBER (TEM QUE SER IGUAL NO RECEPTOR) SERIAL_NUMBER_L EQU 0XAA SERIAL_NUMBER_H EQU 0XCC ;========================================================================================================== ;RAM CBLOCK 0X20 TRES1,TRES0,R6,R5,R7, FLAGS,BITCOUNTER,LC,HC,CONT,R0,R1,R2,NOTX,NOTX1,AUX MPX,RESX,RES0,RES1,RES2,RES3,RES4,RES1M,RES2M,RES3M,RES4M,RES5,RES1K,RES2K,RES3K,RES4K,WTEMP,STATUSTEMP FRES1,FRES2,FRES3,FRES4,REG,REGM,REGF,MODO,DADO,CNT0,CNT1,Z1,Z0 ENDC ;========================================================================================================== ORG 0X00 GOTO START ORG 0X04 GOTO INT_MPX ;cada 2,048 Miliseg START: CLRF PORTB ;APAGA TODAS AS LINHAS BANK1 MOVLW B'00000000' ;SAIDAS MOVWF TRISB MOVLW B'10000000' ;PINO 16 (PA7) IN MOVWF TRISA MOVLW B'10000010' ;DESLIGA PULL UP MOVWF OPTION_REG ; PRESCALLER /8 BANK0 MOVLW 0XFF MOVWF PORTA ;SETA TODAS A COLUNAS MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF RES1K CLRF RES2K CLRF RES3K CLRF RES4K MOVLW .5 ;AGUARDA DESCARGA DE CAPACITOR PÓS RESET CALL DELAYW BSF INTCON,T0IE ;HABILITA INTERRUPÇÃO DO TMR0 BSF INTCON,GIE ;LIGA CHAVE GERAL DAS INTERRUPÇÕES CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS CLRF Z0 MOVLW T_LIGADO MOVWF Z1 ;============================================================================== ;INICIO DO PROGRAMA INICIO MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER L0 BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC L1 ;=================================================== DECFSZ Z0,F GOTO SEG91 DECFSZ Z1,F GOTO SEG91 CLRF RES1K CLRF RES2K CLRF RES3K CLRF RES4K SEG91 ;================================================ BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO GOTO L2 ;FLAG=0 BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF GOTO M0 ; SIN=0 L2 BTFSS SIN ;SIN ? GOTO LA1 ;SIN=0 BSF FLAG ;SIN=1 INCF HC,F BTFSC STATUS,Z DECF HC,F GOTO LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS LA1 INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF BTFSC STATUS,Z DECF LC,F LA2 MOVLW .11 ;.11 = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) MOVWF CONT DECFSZ CONT,F GOTO $-1 GOTO L1 M0 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) MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W RRF RES5,F RRF RES4,F RRF RES3,F RRF RES2,F RRF RES1,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES0,F RRF RESX,F DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT ;TESTA INTEGRIDADE DE ENVIO MOVFW RES4 ADDWF RES3,W ADDWF RES2,W ADDWF RES1,W ADDWF RES0,W ADDWF RESX,W XORWF RES5,W BTFSS STATUS,Z GOTO INICIO ;ERRO DE TRANSMISSÃO MOVFW RESX XORLW SERIAL_NUMBER_H BTFSS STATUS,Z GOTO INICIO ;NÃO É O MESMO APARELHO MOVFW RES0 XORLW SERIAL_NUMBER_L BTFSS STATUS,Z GOTO INICIO ;NÃO É O MESMO APARELHO ACIONAR MOVFW RES1 ;PEGA A PRIMEIRA COLUNA MOVWF RES1K ;PEGA VALOR E ATUALIZA SAIDA MOVFW RES2 ;PEGA A PRIMEIRA COLUNA MOVWF RES2K ;PEGA VALOR E ATUALIZA SAIDA MOVFW RES3 ;PEGA A PRIMEIRA COLUNA MOVWF RES3K ;PEGA VALOR E ATUALIZA SAIDA MOVFW RES4 ;PEGA A PRIMEIRA COLUNA MOVWF RES4K ;PEGA VALOR E ATUALIZA SAIDA CLRF Z0 MOVLW T_LIGADO MOVWF Z1 GOTO INICIO DELAYW DELAYM MOVWF R2 CLRF R1 CLRF R0 DECFSZ R0,F GOTO $-1 DECFSZ R1,F GOTO $-3 DECFSZ R2,F GOTO $-5 RETURN ;============================================================================= ; INTERRUPÇÃO DO TIMER 0 (OVERFLOW) ;============================================================================= ;ROTINA DE MULTIPLEXAÇÃO DE ACIONAMENTO DE CANAIS INT_MPX MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BCF INTCON,T0IF ;APAGA FLAG INTERRUPÇÃO TMR0 BANK0 MOVLW 0XFF MOVWF PORTA INCF MPX,F MOVFW MPX SUBLW .3 ;LIMITA CONTAGEM DE 0 A 3 BTFSC STATUS,C GOTO SSG1 CLRF MPX SSG1 MOVFW MPX XORLW .0 BTFSS STATUS,Z GOTO SSG2 MOVFW RES1K MOVWF PORTB BCF PORTA,0 GOTO SAI_INT SSG2 MOVFW MPX XORLW .1 BTFSS STATUS,Z GOTO SSG3 MOVFW RES2K MOVWF PORTB BCF PORTA,1 GOTO SAI_INT SSG3 MOVFW MPX XORLW .2 BTFSS STATUS,Z GOTO SSG4 MOVFW RES3K MOVWF PORTB BCF PORTA,2 GOTO SAI_INT SSG4 MOVFW RES4K MOVWF PORTB BCF PORTA,3 ; GOTO SAI_INT SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS MOVFW WTEMP ;RECUPERA 'W' RETFIE ;================================================================= ; FIM DA INTERRUPÇÃO DO TIMER 0 ;================================================================= END