;************************************************************************************************* ; RX_PWM8_5B_V2.ASM ; ; RECEPTOR RF PARA CONTROLE REMOTOS C/ 8 CANAIS PROPORCIONAIS E 5 ON/OFF ; ; PARA RECEPÇÃO UTILIZA UM PIC 16F628A ; BLOG: 'LARIOS.TECNOLOGIA.WS' ; ; CLAUDIO LÁRIOS INICIO: 30-09-13 TERMINO:02-10-13 ; USE XTAL DE 4 MHZ ; NESTA VERSÃO, UTILIZA OS TIMER 0 E 1 PARA CONTROLAR OS TEMPOS DE MULTIPLEXAÇÃO DAS SAÍDAS ; PWM, DANDO MAIS ESTABILIDADE E PRECISÃO. ;************************************************************************************************* ; APLICAÇÃO: CONTROLAR BRINQUEDOS OU OUTRAS APLICAÇÕES A DISTANCIA USANDO PWM (8 CANAIS, USANDO ; PULSO DE 1MS A 2MS, TÍPICO PARA SERVO COMANDO), COM MAIS 5 INTERRUPTORES ON/OFF ; ;************************************************************************************************* ;ESCOLHA AQUI O NUMERO SERIAL DO APARELHO, TENDO QUE USAR O MESMO NO RECEPTOR PARA HAVER ;A ACEITAÇÃO E FUNCIONAMENTO CORRETO: SERIAL_NUMB EQU 0X37 ;NUMERO DO SERIAL A SER RECEBIDO ; ATENÇÃO: QUANDO USAR MAIS DE UM TX E RX PRÓXIMOS, CADA UM DEVERÁ TRABALHAR EM UM CANAL DIFERENTE ; DE FREQUENCIA, PARA NÃO INTERFERIR ENTRE SÍ. ;================================================================================================= ;MICROCONTROLADOR LIST P=16F628A , R=DEC INCLUDE "P16F628A.INC" ERRORLEVEL -302 ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _MCLRE_OFF & _LVP_OFF ;DEFINES #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE TP FLAGS,1 ;FLAG TP #DEFINE TPR FLAGS,2 ;FLAG TPR ;PORT #DEFINE SIN PORTA,5 ;PINO 4 IN RF ;EQUATES TMAX EQU .50 ;.50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .88 ;QUANTIDADE DE BYTES A SER RECEBIDO T_MIN EQU .15 ;TEMPO PARA 1 MSEG CARGA_TMR1H EQU HIGH(.65536 - .2500 + .14) CARGA_TMR1L EQU LOW(.65536 - .2500 + .14) ;RAM CBLOCK 0X20 TRES1,TRES0,R6,R5,R7, RES1,RES0,RES1A,RES0A,FLAGS,BITCOUNTER,LC,LC1,HC,CONT,R0,R1,R2,AUX VALOR_SN,VALOR_P0,VALOR_P1,VALOR_P2,VALOR_P3,VALOR_P4,VALOR_P5,VALOR_P6,VALOR_P7,VALOR_B,VALOR_CONF PONT,VP0,VP1,VP2,VP3,VP4,VP5,VP6,VP7,TMP,XXX ENDC CBLOCK 0X70 STATUSTEMP,WTEMP ENDC ;====================================================================================================== ; RESET ;====================================================================================================== ORG 0X00 GOTO START ORG 0X04 GOTO INTERRUPÇÃO ;====================================================================================================== ; INICIALIZAÇÃO DE REGISTRADORES E PORTAS ;====================================================================================================== START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES MOVLW .0 MOVWF PORTA MOVWF PORTB BANK1 MOVLW B'10000001' MOVWF OPTION_REG ;DESABILITA PULL-UPS TMR0/4 MOVLW B'00000000' ;PB7..PB4 = ENTRADAS PB3...PB0 = SAIDAS MOVWF TRISB MOVLW B'11100000' ;PA5=ENTRADA RF PA6,PA7=XTAL 4MHZ MOVWF TRISA BANK0 MOVLW B'00000001' MOVWF T1CON ;LIGA TIMER1 BANK1 MOVLW B'00000001' ;LIGA INTERRUPÇÃO DO TMR1 MOVWF PIE1 BANK0 MOVLW CARGA_TMR1H MOVWF TMR1H MOVLW CARGA_TMR1L MOVWF TMR1L BCF PIR1,0 ;APAGA FLAG DO TMR1 BSF INTCON,PEIE ;LIGA INTERRUPÇÃO PARA PERIFÉRICOS BSF INTCON,GIE ;LIGA GERAL DE INTERRUPÇÕES CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS MOVLW 0X3F MOVWF VP0 MOVWF VP1 MOVWF VP2 MOVWF VP3 MOVWF VP4 MOVWF VP5 MOVWF VP6 MOVWF VP7 MOVLW VP0 ;PEGA ENDEREÇO MOVWF PONT ; E PÕEM NO PONTEIRO ;====================================================================================================== ; PROGRAMA PRINCIPAL ;====================================================================================================== INICIO_RX: 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 L1H SS5: 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 .12 ;.9 = 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_RX ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W RRF VALOR_SN,F RRF VALOR_P0,F RRF VALOR_P1,F RRF VALOR_P2,F RRF VALOR_P3,F RRF VALOR_P4,F RRF VALOR_P5,F RRF VALOR_P6,F RRF VALOR_P7,F RRF VALOR_B,F RRF VALOR_CONF,F DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT MOVFW VALOR_SN ADDWF VALOR_P0,W ADDWF VALOR_P1,W ADDWF VALOR_P2,W ADDWF VALOR_P3,W ADDWF VALOR_P4,W ADDWF VALOR_P5,W ADDWF VALOR_P6,W ADDWF VALOR_P7,W ADDWF VALOR_B,W XORWF VALOR_CONF,W BTFSC STATUS,Z GOTO REC_OK ;OK - BOA RECEPÇÃO ERROTX GOTO INICIO_RX ;ERRO DE RECEPÇÃO ;====================================================================================================== ; CONFERE SE TRANSMISSÃO PERTENCE AO RECEPTOR ;====================================================================================================== REC_OK MOVLW SERIAL_NUMB ;CODIGO DO NOSSO TRANSMISSOR XORWF VALOR_SN,W BTFSS STATUS,Z GOTO INICIO_RX ;NÃO É O NOSSO TRANSMISSOR, VOLTA AO INICIO ;================================================================================================ ; GERAR SAIDAS EM MODO 1MS A 2MS E SAIDAS ON/OFF ;================================================================================================ AÇÃO BCF STATUS,C ;SAIDAS ON/OFF RRF VALOR_B,W MOVWF PORTA ;COLOCA OS BOTÕES NA SAÍDA COMF VALOR_P0,W MOVWF VP0 COMF VALOR_P1,W MOVWF VP1 COMF VALOR_P2,W MOVWF VP2 COMF VALOR_P3,W MOVWF VP3 COMF VALOR_P4,W MOVWF VP4 COMF VALOR_P5,W MOVWF VP5 COMF VALOR_P6,W MOVWF VP6 COMF VALOR_P7,W MOVWF VP7 GOTO INICIO_RX ; ;====================================================================================================== ; INTERRUPÇÃO DO TIMER 1 ;====================================================================================================== INTERRUPÇÃO MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 FOI_TMR1 BTFSS PIR1,0 GOTO FOI_TMR0 ;VAI TESTAR SE FOI DO TIMER 0 MOVLW CARGA_TMR1H MOVWF TMR1H MOVLW CARGA_TMR1L MOVWF TMR1L BCF PIR1,0 ;APAGA FLAG DO TMR1 BSF INTCON,T0IE ;LIGA INTERRUPÇÃO DO TIMER 0 BCF TP ;RESETA FLAGS DE CONTROLE BCF TPR CLRF PORTB ;DESLIGA TUDO GOTO MULTI_SAIDA FOI_TMR0 BTFSS INTCON,T0IF ;TESTA SE INTERRUPÇÃO FOI DO TMR0 GOTO SAI_INT ;NÃO FOI, ENTÃO SAI DA INTERRUPÇÃO BCF INTCON,T0IF ;APAGA FLAG DO TMR0 GOTO MULTI_SAIDA SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ;====================================================================================================== ; MULTIPLEXA AS SAIDAS AJUSTANDO PARA VALORES RECEBIDOS ; UTILIZA O PORTB PARA SAIDAS PROPORCIONAIS (PWM) ;====================================================================================================== MULTI_SAIDA BTFSC TP ;TESTA SE JÁ HOUVE O PERIODO DE 1 MS GOTO TEMPO_REG ;SIM, ENTÃO VAI PRÓXIMA ETAPA MOVLW HIGH($) ; NÃO, ENTÃO VAI ESCOLHER A SAÍDA DA VEZ E INICIAR O TEMPO DE 1MS MOVWF PCLATH MOVLW VP0 SUBWF PONT,W ANDLW .7 ADDWF PCL,F ;ACIONA A SÁIDA DA VEZ GOTO FOI_0 GOTO FOI_1 GOTO FOI_2 GOTO FOI_3 GOTO FOI_4 GOTO FOI_5 GOTO FOI_6 GOTO FOI_7 FOI_0 BSF PORTB,0 GOTO SAI_G FOI_1 BSF PORTB,1 GOTO SAI_G FOI_2 BSF PORTB,2 GOTO SAI_G FOI_3 BSF PORTB,3 GOTO SAI_G FOI_4 BSF PORTB,4 GOTO SAI_G FOI_5 BSF PORTB,5 GOTO SAI_G FOI_6 BSF PORTB,6 GOTO SAI_G FOI_7 BSF PORTB,7 GOTO SAI_G ;====================================================================================================== ; PRIMEIRA ETAPA: SETA TIMER0 COM VALOR PARA GERAR 1 MS (TEMPO MÍNIMO) ;====================================================================================================== SAI_G MOVLW T_MIN MOVWF TMR0 BCF INTCON,T0IF ;APAGA FLAG BSF TP GOTO SAI_INT ;====================================================================================================== ; SEGUNDA ETAPA: CARGA DE TEMPO DO REGISTRADOR DA VEZ ;====================================================================================================== TEMPO_REG BTFSC TPR GOTO FINALIZA_TEMPO ;FINALIZOU TEMPO DO REG, ENTÃO VAI PARA PRÓXIMA ETAPA MOVFW PONT MOVWF FSR MOVFW INDF MOVWF TMR0 BSF TPR GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; QUARTA ETAPA: FINALIZA O TEMPO CARREGADO (VALOR RECEBIDO) ;====================================================================================================== FINALIZA_TEMPO CLRF PORTB ;DESLIGA QUALQUER SAIDA LIGADA BCF INTCON,T0IE ;DESLIGA INTERRUPÇÃO DO TIMER 0 MOVLW VP7+1 INCF PONT,F XORWF PONT,W BTFSS STATUS,Z GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; REINICIA PONTEIRO DA MULTIPLEXAÇÃO ;====================================================================================================== REINICIA_PONT MOVLW VP0 MOVWF PONT GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; FIM DO PROGRAMA ;====================================================================================================== END