;************************************************************************** ; CR_RX_2PWM_3B.ASM ; ; ; RECEPTOR DE CONTROLE REMOTO DE 2 CANAIS PWM E 3 BOTÕES ON/OFF ; ; AUTOR: CLÁUDIO LÁRIOS ; INÍCIO: 06-10-13 TÉRMINO : 07-10-13 ; OBJETIVO: CONTROLAR PEQUENOS APARELHOS A DISTÂNCIA (BRINQUEDOS) USANDO ; 2 CANAIS EM MODO PWM (1MS A 2MS) E 3 COMANDO ON/OFF ; 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 ;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 POT1 GPIO,2 ;PINO 5- OUT DO POT_1 #DEFINE POT2 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_SN,VALOR_P1,VALOR_P2,VALOR_B,VALOR_CONF,LC1,R5,R6,R7 PONT,VP1,VP2,HC,LC,BITCOUNTER,WTEMP,STATUSTEMP,CONT ENDC ;EQUATES RX TMAX EQU .50 ;.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 - .10000 + .14) CARGA_TMR1L EQU LOW(.65536 - .10000 + .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 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 ;====================================================================================================== ; PROGRAMA PRINCIPAL ;====================================================================================================== INICIO_RX: MOVLW QB ;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_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 L0 ;LE PROXIMO BIT MOVFW VALOR_SN ADDWF VALOR_P1,W ADDWF VALOR_P2,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 ;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 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 BCF GPIO,2 BCF GPIO,4 ;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 ; ;====================================================================================================== 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 VP1 SUBWF PONT,W ANDLW .1 ADDWF PCL,F ;ACIONA A SÁIDA DA VEZ GOTO FOI_1 GOTO FOI_2 FOI_1 BSF GPIO,2 GOTO SAI_G FOI_2 BSF GPIO,4 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 BCF GPIO,2 ;DESLIGA QUALQUER SAIDA LIGADA BCF GPIO,4 BCF INTCON,T0IE ;DESLIGA INTERRUPÇÃO DO TIMER 0 MOVLW VP2+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 VP1 MOVWF PONT GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;====================================================================================================== ; FIM DO PROGRAMA ;====================================================================================================== END