;************************************************************************** ; CR_RX_1PWM_1_0_5V__3B.ASM ; ; ; RECEPTOR DE CONTROLE REMOTO DE 2 CANAIS PROPORCIONAIS E 3 BOTÕES ON/OFF ; ; AUTOR: CLÁUDIO LÁRIOS ; INÍCIO: 07-10-13 TÉRMINO : 08-10-13 ; OBJETIVO: CONTROLAR PEQUENOS APARELHOS A DISTÂNCIA (BRINQUEDOS) USANDO: ; 1 CANALl (PINO 5) EM MODO PWM (1MS A 2MS PARA USO DE SERVOCONTROLE) ; 1 CANAL COM SAIDA PWM (PINO 3) - 0 A 5 VOLTS (PARA CONTROLE DE VELOCIDADE DO MOTOR) ; 3 CANAIS P/COMANDO ON/OFF pINOS 2,6 E 7) ; USA MICROCONTROLADOR PIC12F675 DE 8 PINOS ;*************************************************************************** ; CERTIFIQUE-SE DE TER O BYTE DE CALIBRAÇÃO NO ENDEREÇO 0X3FF SALVO ;=================================================================================================================== ;---------------------------------------------------------------------------------------------------------- ;DEFINIÇÕES DO USUÁRIO: ;---------------------------------------------------------------------------------------------------------- SERIAL_NUMB EQU 0X57 ;NUMERO DO SERIAL A SER ENVIADO ;=================================================================================================================== LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;PALAVRA DE CONFIGURAÇÃO ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;DEFINIÇÕES #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 #DEFINE FLAG_ROK FLAGS,3 ;FLAG DE RECEPÇÃO DE TX ;DEFINIÇÕES DE PORTAS DE SAIDA #DEFINE SIN GPIO,3 ;PINO 4- IN RF #DEFINE B2 GPIO,0 ;PINO 7- OUT BOTÃO 2 #DEFINE B3 GPIO,5 ;PINO 2- OUT BOTÃO 3 #DEFINE B1 GPIO,1 ;PINO 6- OUT BOTÃO 1 #DEFINE CANAL1 GPIO,2 ;PINO 5- OUT DO POT_1 #DEFINE CANAL2 GPIO,4 ;PINO 3- OUT DO POT_2 #DEFINE LIGAC ADCON0,1 ;BIT QUE LIGA A CONVERSÃO AD ;RAM CBLOCK 0X20 TEMP,TEMP1,TEMP2,VALOR,FLAGS,VALOR_SNA,VALOR_P1A,VALOR_P2A,VALOR_BA,VALOR_CONFA,LC1,R5,R6,R7 PONT,VP1,VP2,HC,LC,BITCOUNTER,WTEMP,STATUSTEMP,CONT,TIME_P VALOR_SN,VALOR_P1,VALOR_P2,VALOR_B,VALOR_CONF ENDC ;EQUATES RX TMAX EQU .30 ;.50 ;TEMPO MAXIMO DO SINAL LOW QB EQU .40 ;QUANTIDADE DE BYTES A SER RECEBIDO (5 BYTES X 8 BITS = 40) ;EQUATES PWM T_MIN EQU .55 ;TEMPO PARA 1 MSEG CARGA_TMR1H EQU HIGH(.65536 - .80 + .14) CARGA_TMR1L EQU LOW(.65536 - .80 + .14) ;========================================================================================================= ; RESET ;========================================================================================================= ORG 0X00 GOTO START ;========================================================================================================= ; INTERRUPÇÃO ;========================================================================================================= ORG 0X04 GOTO INTERRUPÇÃO ;========================================================================================================= ; INICIO DO PROGRAMA ;========================================================================================================= START: BANK1 CALL 0X3FF MOVWF OSCCAL ;CALIBRA OSCILADOR (CERTIFIQUE DE TER BYTE DE CALIBRAÇÃO SALVO) MOVLW B'001000' ; SETUP PORTA MOVWF TRISIO MOVLW B'10000001' MOVWF OPTION_REG ;DESABILITA PULL-UPS TMR0/4 CLRF ANSEL CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS MOVLW 0XFF MOVWF TIME_P 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 MOVLW 0X3F MOVWF VP1 MOVWF VP2 MOVLW VP1 ;PEGA ENDEREÇO MOVWF PONT ; E PÕEM NO PONTEIRO MOVLW QB ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC ;====================================================================================================== ; PROGRAMA PRINCIPAL ;====================================================================================================== INICIO_RX: BCF FLAG_ROK BTFSS FLAG_ROK GOTO $-1 ;AGUARDA UMA RECEPÇÃO ;====================================================================================================== ; CONFERE SE TRANSMISSÃO PERTENCE AO RECEPTOR ;====================================================================================================== RECEBEU_TX 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 ;COLOCA BOTÕES NA SAÍDA BCF GPIO,5 BTFSS VALOR_B,3 BSF GPIO,5 BCF GPIO,0 BTFSS VALOR_B,0 BSF GPIO,0 BCF GPIO,1 BTFSS VALOR_B,1 BSF GPIO,1 ; CARGA DAS SAIDAS PWM COMF VALOR_P1,W MOVWF VP1 COMF VALOR_P2,W MOVWF VP2 GOTO INICIO_RX ;;====================================================================================================== ; INTERRUPÇÃO ;====================================================================================================== 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 ;;====================================================================================================== ; INTERRUPÇÃO DO TIMER 1 ;====================================================================================================== MOVLW CARGA_TMR1H MOVWF TMR1H MOVLW CARGA_TMR1L MOVWF TMR1L BCF PIR1,0 ;APAGA FLAG DO TMR1 INCF TIME_P,F MOVFW TIME_P XORLW .0 BTFSS STATUS,Z GOTO SPWM_0_5 ;;====================================================================================================== ; RESETA PWM 1-2 MS ;====================================================================================================== BSF INTCON,T0IE ;LIGA INTERRUPÇÃO DO TIMER 0 BCF TP ;RESETA FLAGS DE CONTROLE BCF TPR BCF GPIO,2 GOTO MULTI_SAIDA ;;====================================================================================================== ; GERA TENSÃO NO CANAL 2 - MODO PWM TENSÃO (0 - 5VOLTS) NO PINO 3 ;====================================================================================================== SPWM_0_5 MOVFW TIME_P SUBWF VP2,W BTFSC STATUS,C BSF GPIO,4 ;CANAL 2 PINO 3 (0-5 VOLTS) BTFSS STATUS,C BCF GPIO,4 ;;====================================================================================================== ; INTERRUPÇÃO DO TIMER 0 ;====================================================================================================== 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 ;PRODUZ PWM 1-2 MS ;;====================================================================================================== ; SAIDA DA INTERRUPÇÃO ;====================================================================================================== SAI_INT CALL RECEIVE ;EXECUTA ROTINA DE RECEPÇÃO DE SINAIS RF SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ;====================================================================================================== ; MULTIPLEXA A SAIDA PADRÃO (1-2MS) AJUSTANDO PARA VALORES RECEBIDOS ; CANAL 1 - PINO 5 ;====================================================================================================== MULTI_SAIDA BTFSC TP ;TESTA SE JÁ HOUVE O PERIODO DE 1 MS GOTO TEMPO_REG ;SIM, ENTÃO VAI PRÓXIMA ETAPA BSF GPIO,2 ;CANAL 1 PINO 5 ;====================================================================================================== ; 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 VP1 MOVWF TMR0 BSF TPR GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; QUARTA ETAPA: FINALIZA O TEMPO CARREGADO (VALOR RECEBIDO) ;====================================================================================================== FINALIZA_TEMPO BCF GPIO,2 ;CANAL 1 PINO 5 BCF INTCON,T0IE ;DESLIGA INTERRUPÇÃO DO TIMER 0 GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; ROTINA DE RECEPÇÃO RF ;====================================================================================================== RECEIVE BTFSC FLAG_ROK RETURN 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 RETURN LA1 INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF BTFSC STATUS,Z DECF LC,F RETURN 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 REJ ;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_P1,F RRF VALOR_P2,F RRF VALOR_B,F RRF VALOR_CONF,F DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO PROX_LO ;LE PROXIMO BIT GOTO SEG1 REJ MOVLW QB ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER PROX_LO BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC RETURN SEG1 MOVLW QB ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC MOVFW VALOR_SN ADDWF VALOR_P1,W ADDWF VALOR_P2,W ADDWF VALOR_B,W XORWF VALOR_CONF,W BTFSS STATUS,Z RETURN BSF FLAG_ROK RETURN ; FIM DO PROGRAMA ;====================================================================================================== END