;************************************************************************** ; CR_TX_2PWM_3B.ASM ; ; ; TRANSMISSOR 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 FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE FLAG_R FLAGS,2 ;FLAG DE 'LEARN' APRENDER #DEFINE FLAGGR FLAGS,3 ;FLAG DE 'LEARN' APRENDER ;DEFINIÇÕES DE PORTAS DE SAIDA #DEFINE B3 GPIO,3 ;PINO 4 IN BOTÃO 3 #DEFINE B2 GPIO,0 ;PINO 7 IN BOTÃO 2 #DEFINE OUT GPIO,5 ;PINO 2- SAIDA RF #DEFINE B1 GPIO,1 ;PINO 6- IN BOTÃO 1 #DEFINE POT1 GPIO,2 ;PINO 5- IN DO POT_1 #DEFINE POT2 GPIO,4 ;PINO 3- IN DO POT_2 #DEFINE LIGAC ADCON0,1 ;BIT QUE LIGA A CONVERSÃO AD ;RAM CBLOCK 0X20 TEMP,TEMP1,TEMP2,VALOR,FLAGS,VALOR_SN,VP1,VP2,VALOR_B,VALOR_CONF,LC,LC1,R5,R6,R7 ENDC ;EQUATES QB EQU .40 ;QUANTIDADE DE BYTES A SER ENVIADO (5 BYTES X 8 BITS = 40) T_LAMB EQU .112 ;TEMPO DE DURAÇÃO DA UNIDADE DO BIT ;========================================================================================================= ; RESET ;========================================================================================================= ORG 0X00 GOTO START ;========================================================================================================= ; INTERRUPÇÃO ;========================================================================================================= ORG 0X04 RETFIE ;========================================================================================================= ; INICIO DO PROGRAMA ;========================================================================================================= START: BANK1 CALL 0X3FF MOVWF OSCCAL ;CALIBRA OSCILADOR (CERTIFIQUE DE TER BYTE DE CALIBRAÇÃO SALVO) MOVLW B'011111' ; SETUP PORTA MOVWF TRISIO MOVLW B'00000000' ;LIBERA PULL UPS MOVWF OPTION_REG CLRF ANSEL BSF ANSEL,ANS3 ;LIBERA PINO PARA AD BSF ANSEL,ANS2 ;IDEM BSF ANSEL,ADCS0 ;CLOCK /8 MOVLW B'000011' MOVWF WPU ;LIGA PULLUP EM GP0,GP1 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 .1 CALL DELAYW ;========================================================================================================= ; PROGRAMA PRINCIPAL ;========================================================================================================= INICIO: CALL LE_POT CALL ENVIAR_BYTES GOTO INICIO ;================================================================================================= ; LE ENTRADAS E POTENCIOMETROS ;================================================================================================= LE_POT MOVLW SERIAL_NUMB MOVWF VALOR_SN ;SERIAL NUMBER DO APARELHO MOVFW GPIO ANDLW B'001011' ;FILTRA OS BOTÕES MOVWF VALOR_B ;COLOCA OS VALOR DOS BOTÕES ;OBTEM VALOR DO POT 1 MOVLW B'00001001';LIGA CONVERSOR AN/DIG (USA TENSÃO VCC COMO REFERÊNCIA) MOVWF ADCON0 ;ESCOLHE CANAL 2/REF AO VCC/MODO DE SAIDA PARA ESQUERDA MOVLW .20 CALL WAIT_uS ;TEMPO DE ESTABILIZAÇÃO BSF LIGAC ;INICIA CONVERSÃO BTFSC LIGAC ;TESTA SE CHEGOU AO FIM DA CONVERSÃO GOTO $-1 ;SE NÃO LOOP ATÉ TERMINO DA CONVERSÃO MOVFW ADRESH MOVWF VP1 ;OBTEM VALOR DE POT2 MOVLW B'00001101';LIGA CONVERSOR AN/DIG (USA TENSÃO VCC COMO REFERÊNCIA) MOVWF ADCON0 ;ESCOLHE CANAL 3/REF AO VCC/MODO DE SAIDA PARA ESQUERDA MOVLW .20 CALL WAIT_uS ;TEMPO DE ESTABILIZAÇÃO BSF LIGAC ;INICIA CONVERSÃO BTFSC LIGAC ;TESTA SE CHEGOU AO FIM DA CONVERSÃO GOTO $-1 ;SE NÃO LOOP ATÉ TERMINO DA CONVERSÃO MOVFW ADRESH MOVWF VP2 MOVFW VALOR_SN ;SOMA OS QUATRO BYTES DE INFORMAÇÃO ADDWF VALOR_B,W ADDWF VP1,W ADDWF VP2,W MOVWF VALOR_CONF ;OBTEM VALOR PARA CONFERENCIA NA RECEPÇÃO RETURN ;================================================================================================= ; ENVIA DADOS PARA TX ;================================================================================================= ENVIAR_BYTES: ;---------------------------------------------------- CALL STARTBIT ;---------------------------------------------------- MOVLW QB ;QUANTIDADE DE BITS A TRANSMITIR MOVWF R5 VOLT10: BCF STATUS,C RRF VALOR_SN,F RRF VP1,F RRF VP2,F RRF VALOR_B,F RRF VALOR_CONF,F BTFSC STATUS,C GOTO EB1 CALL BIT0 VV13: DECFSZ R5,F GOTO VOLT10 CALL PAUSA RETURN ;------------------------------------------------- EB1: CALL BIT1 GOTO VV13 ;================================================= ;ROTINAS DELAY1CK: MOVLW T_LAMB ;PARA 366 MICROSEGUNDOS MOVWF R7 ; DECFSZ R7,F GOTO $-1 RETURN BIT0: BCF OUT CALL DELAY1CK BSF OUT CALL DELAY1CK CALL DELAY1CK BCF OUT RETURN BIT1: BCF OUT CALL DELAY1CK CALL DELAY1CK BSF OUT CALL DELAY1CK BCF OUT RETURN STARTBIT: BSF OUT CALL DELAY1CK BCF OUT RETURN ;----------------------------------------------------- PAUSA: MOVLW .11;.23 ;23 CLOCKS MOVWF R6 RTY: CALL DELAY1CK DECFSZ R6,F GOTO RTY RETURN ;================================================================================================= ; ROTINAS DE DELAY ;================================================================================================= DELAY2 MOVLW .20 DELAYW DELAYM MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================================= ; FIM DO PROGRAMA ;================================================================================================= END