;********************************************************************************************************** ; TX_SENSOR_PROP.ASM ; PROJETO CONTROLE REMOTO PROPORCIONAL ; MICROCONTROLADOR: PIC16F628A ; INICIO : 05/09/2013 TERM.: 13/09/2013 ; ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 16F628A ; OBJETIVO: CONTROLAR EQUIPAMENTOS A DISTANCIA ; OBS. MONTAGEM APENAS DIDÁTICA ;********************************************************************************************************** QBYTE EQU .88 ;QUANTIDADE DE BYTES A SER TRANSMITIDO ;---------------------------------------------------------------------------------------------------------- ;DEFINIÇÕES DO USUÁRIO: ;---------------------------------------------------------------------------------------------------------- SERIAL_NUMB EQU 0X37 ;NUMERO DO SERIAL A SER ENVIADO LIST P=16f628a , R=DEC #INCLUDE ; ARQUIVO PADRAO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_ON & _MCLRE_OFF & _LVP_OFF ;_INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;ELIMINA MENSAGENS DE BANCO ERRADO ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP,TEMP1,TEMP2,VALOR,FLAGS,VALOR_SN,VALOR_P0,VALOR_P1,VALOR_P2,VALOR_P3,VALOR_P4 VALOR_P5,VALOR_P6,VALOR_P7,VALOR_B,VALOR_CONF,LC,LC1,R5,R6,R7,VP0,VP1,VP2,VP3,VP4,VP5,VP6,VP7 ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== ; PORTS #DEFINE P0 PORTB,0 ; PINO 6 #DEFINE P1 PORTB,1 ; PINO 7 #DEFINE P2 PORTB,2 ; PINO 8 #DEFINE P3 PORTB,3 ; PINO 9 #DEFINE P4 PORTB,4 ; PINO 10 #DEFINE P5 PORTB,5 ; PINO 11 #DEFINE P6 PORTB,6 ; PINO 12 #DEFINE P7 PORTB,7 ; PINO 13 #DEFINE OUT PORTA,0 ; SAIDA RF PINO 17 #DEFINE B4 PORTA,5 ; PINO 4 #DEFINE B3 PORTA,4 ; PINO 3 #DEFINE B2 PORTA,3 ; PINO 2 #DEFINE B1 PORTA,2 ; PINO 1 #DEFINE B0 PORTA,1 ; PINO 18 #DEFINE FLAG_P0 FLAGS,0 ; FLAG P0 #DEFINE FLAG_P1 FLAGS,1 ; FLAG P1 #DEFINE FLAG_P2 FLAGS,2 ; FLAG P2 #DEFINE FLAG_P3 FLAGS,3 ; FLAG P3 #DEFINE FLAG_P4 FLAGS,4 ; FLAG P4 #DEFINE FLAG_P5 FLAGS,5 ; FLAG P5 #DEFINE FLAG_P6 FLAGS,6 ; FLAG P6 #DEFINE FLAG_P7 FLAGS,7 ; FLAG P7 ;================================================================================================= ; VETOR DE RESET ;================================================================================================= ORG 0X00 GOTO INICIO ;================================================================================================= ; VETOR DE INTERRUPÇÕES ;================================================================================================= ORG 0X04 RETFIE ;================================================================================================= ; INICIALIZAÇÃO DE VARIAVÉIS E PORTAS ;================================================================================================= INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 MOVLW 0X80 MOVWF OPTION_REG ;DESLIGA PULL-UPS MOVLW B'11111110' ; SAÍDA PA0 APENAS (PARA RF) MOVWF TRISA MOVLW B'00000000' ;SAÍDAS MOVWF TRISB BANK0 MOVLW 0XFF MOVWF PORTB CLRF PORTA CLRF VALOR_P0 CLRF VALOR_P1 CLRF VALOR_P2 CLRF VALOR_P3 CLRF VALOR_P4 CLRF VALOR_P5 CLRF VALOR_P6 CLRF VALOR_P7 MOVLW SERIAL_NUMB MOVWF VALOR_SN ;SERIAL NUMBER DO APARELHO MOVLW .2 CALL DELAYW ;================================================================================================= ; PROGRAMA PRINCIPAL ;================================================================================================= MAIN CALL LE_POT CALL ENV_TX GOTO MAIN ;================================================================================================= ; LE ENTRADAS E POTENCIOMETROS ;================================================================================================= LE_POT MOVLW SERIAL_NUMB MOVWF VALOR_SN ;SERIAL NUMBER DO APARELHO CLRF FLAGS CLRF VALOR BANK1 MOVLW B'11111111' ;PORTB COMO ENTRADA MOVWF TRISB BANK0 LOOP1 MOVFW VALOR BTFSC FLAG_P0 GOTO SEGJ1 ;NÃO PEGAR BTFSC P0 GOTO SEGH1 MOVWF VALOR_P0 BSF FLAG_P0 GOTO V_P1 SEGJ1 NOP GOTO $+1 GOTO V_P1 SEGH1 NOP GOTO $+1 V_P1 BTFSC FLAG_P1 GOTO SEGJ2 ;NÃO PEGAR BTFSC P1 GOTO SEGH2 MOVWF VALOR_P1 BSF FLAG_P1 GOTO V_P2 SEGJ2 NOP GOTO $+1 GOTO V_P2 SEGH2 NOP GOTO $+1 V_P2 BTFSC FLAG_P2 GOTO SEGJ3 ;NÃO PEGAR BTFSC P2 GOTO SEGH3 MOVWF VALOR_P2 BSF FLAG_P2 GOTO V_P3 SEGJ3 NOP GOTO $+1 GOTO V_P3 SEGH3 NOP GOTO $+1 V_P3 BTFSC FLAG_P3 GOTO SEGJ4 ;NÃO PEGAR BTFSC P3 GOTO SEGH4 MOVWF VALOR_P3 BSF FLAG_P3 GOTO V_P4 SEGJ4 NOP GOTO $+1 GOTO V_P4 SEGH4 NOP GOTO $+1 V_P4 BTFSC FLAG_P4 GOTO SEGJ5 ;NÃO PEGAR BTFSC P4 GOTO SEGH5 MOVWF VALOR_P4 BSF FLAG_P4 GOTO V_P5 SEGJ5 NOP GOTO $+1 GOTO V_P5 SEGH5 NOP GOTO $+1 V_P5 BTFSC FLAG_P5 GOTO SEGJ6 ;NÃO PEGAR BTFSC P5 GOTO SEGH6 MOVWF VALOR_P5 BSF FLAG_P5 GOTO V_P6 SEGJ6 NOP GOTO $+1 GOTO V_P6 SEGH6 NOP GOTO $+1 V_P6 BTFSC FLAG_P6 GOTO SEGJ7 ;NÃO PEGAR BTFSC P6 GOTO SEGH7 MOVWF VALOR_P6 BSF FLAG_P6 GOTO V_P7 SEGJ7 NOP GOTO $+1 GOTO V_P7 SEGH7 NOP GOTO $+1 V_P7 BTFSC FLAG_P7 GOTO SEGJ8 ;NÃO PEGAR BTFSC P7 GOTO SEGH8 MOVWF VALOR_P7 BSF FLAG_P7 GOTO V_P8 SEGJ8 NOP GOTO $+1 GOTO V_P8 SEGH8 NOP GOTO $+1 V_P8 INCFSZ VALOR,F GOTO LOOP1 MOVLW .9 MOVWF TEMP MOVFW PORTA ;OBTEM ESTADO DOS INTERRUPTORES ANDLW B'00111110' MOVWF VALOR_B MOVLW VALOR_SN ;APONTA MOVWF FSR MOVFW INDF MOVWF VALOR_CONF LOOP_CR INCF FSR,F MOVFW INDF ADDWF VALOR_CONF,F ;SOMA TODOS OS VALORES E COLOCA EM VALOR_CONF PARA TESTE DA TX DECFSZ TEMP,F GOTO LOOP_CR RETURN ;================================================================================================= ; ENVIA DADOS PARA TX ;================================================================================================= ENV_TX MOVLW 0XFF MOVWF PORTB ;CARREGA CAPACITORES NA TRANSMISSÃO BANK1 MOVLW B'00000000' ;PORTB COMO SAÍDA MOVWF TRISB BANK0 CALL ENVIAR_BYTES RETURN ENVIAR_BYTES: ;---------------------------------------------------- CALL STARTBIT ;---------------------------------------------------- MOVLW QBYTE ;QUANTIDADE DE BITS A TRANSMITIR MOVWF R5 MOVFW VALOR_P0 MOVWF VP0 MOVFW VALOR_P1 MOVWF VP1 MOVFW VALOR_P2 MOVWF VP2 MOVFW VALOR_P3 MOVWF VP3 MOVFW VALOR_P4 MOVWF VP4 MOVFW VALOR_P5 MOVWF VP5 MOVFW VALOR_P6 MOVWF VP6 MOVFW VALOR_P7 MOVWF VP7 VOLT10: BCF STATUS,C RRF VALOR_SN,F RRF VP0,F RRF VP1,F RRF VP2,F RRF VP3,F RRF VP4,F RRF VP5,F RRF VP6,F RRF VP7,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 .228 ;PARA 366 MICROSEGUNDOS = .228 (LAMBDA) MOVWF R7 ; GOTO $+1 GOTO $+1 NOP DECFSZ R7,F GOTO $-4 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