;******************************************************************************************************************* ; TOUCH.ASM ; OBJETIVO: ABORDAR CONTROLE DE CARGA USANDO O SISTEMA DE TOQUE. ; PERMITE VISUALIZAR PELA SERIAL, OS VALORES DO TIMER0 ATUAL E ; A MÉDIA ANTERIOR. ; FACILITA O DESENVOLVIMENTO, POR PODER VISUALIZAR O RESULTADO APÓS ; A TROCA DE VALORES DE CONSTANTES, SEGUNDO A NECESSIDADE DA APLICAÇÃO ; METODO: MEDINDO VARIAÇÃO DE FREQUENCIA IMPOSTA PELO AUMENTO DE ; CAPACITANCIA AO TOQUE. ; PARA VISUALIZAÇÃO, USE TERMINAL SERIAL (HYPERTERMINAL,POR EX.) ; A 38400 BAUDS, 8 BITS, SEM PARIDADE, NO HANDSHAKE. ; AUTOR: CLAUDIO LÁRIOS INICIO: 09-05-2013 TERMINO:12-05-2013 ; USO DIDÁTICO APENAS. ; BASEADO EM NOTE APPLICATION AN1202 DA MICROCHIP (COM ADAPTAÇÕES ; NO OSCILADOR E FORMA DE DETENÇÃO. ;******************************************************************************************************************** ;DEFINIÇÕES DO USUARIO (DESCOMENTE A OPÇÃO DESEJADA E COMENTE AS OUTRAS) ;#DEFINE F629 ;ESCOLHE MICROCONTROLADOR PIC12F629 #DEFINE F675 ;ESCOLHE MICROCONTROLADOR PIC12F675 #DEFINE TESTE_COM_SERIAL ;COMENTAR SE NÃO USAR A SERIAL PARA VER VALORES DO TIMER 0 ;=================================================================================================================== IFDEF F675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF IFDEF F629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;FLAGS #DEFINE FLAG_AP FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE T_232 GPIO,5 ;PINO2 SERIAL ;SAIDAS #DEFINE LED2 GPIO,5 ;PINO 2- SAIDA DO LED1 #DEFINE LED1 GPIO,4 ;PINO 3- SAIDA DO LED3 ;EQUATES LIMITE_HX EQU .0 ;LIMITE PARA COMUTAÇÃO LIMITE_LX EQU .200 HIST_H EQU .0 ;VALOR DE HISTERESE HIST_L EQU .100 ;RAM CBLOCK 0X20 TEMP, C1,C0,FLAGS,T1H,T1L,T3H,T3L,T2H,T2L,CT,CT1,CT2 ENDC IFDEF TESTE_COM_SERIAL CBLOCK 0X30 BR0,BR1,BR2,LC,R0,R1,BUFFER,PAG,CNT,CNT1 ENDC ENDIF ;INICIO DO PROGRAMA ORG 0X00 GOTO START ORG 0X04 RETFIE ;SETUPS INICIAIS START: BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW B'001011' ;GP2=0 POR SER SAIDA EXTERNA P/ COMPARADOR MOVWF TRISIO MOVLW B'10100101' MOVWF VRCON ;VOLTAGEM DE REFERENCIA LIGADA COM 1 VOLTS,LOW RANGE VR3..VR0=5 MOVLW B'10100111' MOVWF OPTION_REG IFDEF F675 CLRF ANSEL ;DESLIGA ADC ENDIF BANK0 MOVLW 0X05 MOVWF CMCON ;COMPARADOR COM SAIDA EM GP2 (PINO 5), VREF, ENTRADAS POR SELEÇÃO CLRF GPIO CLRF FLAGS MOVLW .16 ;16 LEITURA PARA A MÉDIA INICIAL MOVWF CT2 C_LOOP CALL LE_FREQ CALL MEDIA ;MÉDIA EM T2H/T2L DECFSZ CT2,F GOTO C_LOOP CALL SUB_LIMITE ;SUBTRAI LIMITE DA MEDIA ;================================================================================== ; MAIN ;================================================================================== MAIN ;LOOP PRINCIPAL ;================================================================================== IFDEF TESTE_COM_SERIAL ;ENVIA PELA SERIAL MOVFW T2H ;VER MEDIA - LIMITE MOVWF C1 MOVFW T2L MOVWF C0 CALL CONV_DEC MOVLW 'A' CALL SEND CALL MOSTRA_TEMP ENDIF ;================================================================================== CALL LE_FREQ ;FAZ NOVA LEITURA DE FREQUENCIA ;=================================================================================== IFDEF TESTE_COM_SERIAL ; ENVIA PELA SERIAL MOVFW T1H ;VER ULTIMO VALOR (VALOR ATUAL) MOVWF C1 MOVFW T1L MOVWF C0 CALL CONV_DEC MOVLW 'B' CALL SEND CALL MOSTRA_TEMP ;SE DESEJAR UMA LEITURA CONTINUA (RELATÓRIO), COMENTE AS 2 PRÓXIMAS LINHAS ; MOVLW 0X0D ;VOLTA PARA MESMA LINHA ; CALL SEND ;================================================ ENDIF ;================================================================================== CALL SALVA_LEITURA ;================================================================================== ;COMPARA MOVFW T1L ;COMPARA LEITURA ATUAL SUBWF T2L,W ;COM A MÉDIA DE LEITURAS BTFSS STATUS,C INCF T1H,F MOVFW T1H SUBWF T2H,W BTFSS STATUS,C ;TESTA SE LEITURA ATUAL É MENOR QUE A MÉDIA GOTO NAO_ACIONADO ; É MAIOR ;===================================================================================== ; ACIONADO BTFSS FLAG_AP ;É MENOR, BOTÃO FOI TOCADO, TESTA FLAG CALL SOMA_HISTERESE ;ACRESCENTA VALOR DE HISTERESE, SE FLAG=0, SENÃO, APENAS PULA BSF FLAG_AP ;SETA FLAG DE BOTÃO TOCADO BSF GPIO,4 ;ACIONA A SAÍDA MOVLW .10 ;TEMPO MÍNIMO QUE CONTINUARÁ ACIONADO A SAÍDA MOVWF CT1 VBFK CALL DELAY_X ;DELAY DECFSZ CT1,F GOTO VBFK ;VOLTA AO LOOP DO DELAY GOTO MAIN ;VAI PARA LOOP PRINCIPAL NAO_ACIONADO BCF FLAG_AP ;APAGA FLAG DE BOTÃO TOCADO BCF GPIO,4 ;MANTÉM SAÍDA DESLIGADA CALL REC_LEITURA ;RECUPERA VALOR DA LEITURA CALL MEDIA ;FAZ MEDIA DA LEITURA ANTERIOR + ATUAL /2 CALL SUB_LIMITE ;SUBTRAI LIMITE DA MEDIA GOTO MAIN ;************************************************************************************ ; SUB-ROTINAS ;************************************************************************************ MEDIA ;========================================================= ;FAZ A MÉDIA DA LEITURA ATUAL COM A ANTERIOR E SALVA MOVFW T1L ADDWF T2L,F BTFSC STATUS,C INCF T1H,F MOVFW T1H ADDWF T2H,F BCF STATUS,C ;DIVIDE POR 2 (MÉDIA) RRF T2H,F RRF T2L,F RETURN ;========================================================= SUB_LIMITE MOVLW LIMITE_LX ;APERTADO SUBWF T2L,F BTFSS STATUS,C DECF T2H,F MOVLW LIMITE_HX SUBWF T2H,F RETURN SOMA_HISTERESE MOVLW HIST_L ADDWF T2L,F BTFSC STATUS,C INCF T2H,F MOVLW HIST_H ADDWF T2H,F RETURN ;===================================================== ;DELAY DE 10 MILISEGUNDOS DELAY_X MOVLW .11 ;.11 MOVWF C0 V1 MOVLW .142 MOVWF C1 V2 NOP NOP DECFSZ C1, F GOTO V2 DECFSZ C0, F GOTO V1 RETURN LE_FREQ MOVLW 0X05 ;LIGA COMPARADOR MOVWF CMCON ;COMPARADOR COM SAIDA EM GP2 (PINO 5), VREF, ENTRADAS POR SELEÇÃO BCF GPIO,2 ;DEIXA EM '0' A SAIDA GP2 CLRF TMR0 ;ZERA TMR E PRESCALLER BCF INTCON,T0IF ;APAGA FLAG T0IF CALL DELAY_X MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADOR MOVFW TMR0 MOVWF T1H BTFSS INTCON,T0IF GOTO VP4 MOVLW 0XFF MOVWF T1H ;LIMITA CONTAGEM QUANDO OCORRER ESTOURO DO TMR0 MOVWF T1L RETURN ;============================================================================================= ; EXTRAI O CONTEUDO DO PRESCALLER VP4 BANK1 BCF OPTION_REG,5 ;CLOCK INTERNO (PULSA ENTRE CLOCK INTERNO E ENTRADA ATERRADA) BSF OPTION_REG,5 ;CLOCK EXTERNO BANK0 INCF T1L,F INCF T1L,F MOVFW T1H SUBWF TMR0,W ;COMPARA SE HOUVE INCREMENTO EM TMR0 BTFSC STATUS,Z GOTO VP4 ;NÃO HOUVE, RETORNA PARA PULSAR MAIS UMA VEZ MOVFW T1L ;T1L ESTÁ COM O VALOR QUE FALTOU PARA CHEGAR EM '0' SUBLW .0 MOVWF T1L ;ACERTA PARA O VALOR REAL CONTADO NO PRESCALLER RETURN ;============================================================================================= SALVA_LEITURA MOVFW T1H ;SALVA LEITURA PARA USO FUTURO MOVWF T3H MOVFW T1L MOVWF T3L RETURN REC_LEITURA MOVFW T3H ;RECUPERA LEITURA MOVWF T1H MOVFW T3L MOVWF T1L RETURN ;============================================================================================ ; SUBROTINAS ADICIONAIS EM CASO DE USO DA SERIAL PARA VISUALIZAÇÃO ;============================================================================================ IFDEF TESTE_COM_SERIAL ;=======================================SOMENTE DESENVOLVIMENTO MOSTRA_TEMP MOVFW BR2 CALL conv_asc2 ;CONVERTE PARA ASCII CALL SEND ;ENVIA CENTENA DE MILHAR MOVFW R1 CALL SEND ;ENVIA DEZENA DE MILHAR MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII CALL SEND ;ENVIA MILHAR MOVFW R1 CALL SEND ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL SEND MOVFW R1 ;ENVIA UNIDADE CALL SEND MOVLW ' ' ;ENVIA ESPAÇO CALL SEND MOVLW ' ' ;ENVIA 'V' (VOLTS) CALL SEND MOVLW ' ' ;ENVIA 'V' (VOLTS) CALL SEND RETURN CONV_DEC ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) HEX_DEC: MOVLW .16 MOVWF LC ;CARREGA 16 CLRF BR0 ;ZERA RESULTADOS CLRF BR1 CLRF BR2 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,BR0,1,2 RLF C1,F RLF BR0,F RLF BR1,F RLF BR2,F DECFSZ LC,F ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO GOTO SEG9 RETURN ;FI DA CONVERSÃO SEG9: MOVLW .3 ADDWF BR2,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR2,F ; É=1 ENTAO SOMA 3 NSOMA3: MOVLW 0X30 ADDWF BR2,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR2,F NSOMA3A: MOVLW .3 ADDWF BR1,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR1,F ; É=1 ENTAO SOMA 3 NSOMA3B: MOVLW 0X30 ADDWF BR1,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR1,F NSOMA3C: MOVLW .3 ADDWF BR0,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR0,F ; É=1 ENTAO SOMA 3 NSOMA3D: MOVLW 0X30 ADDWF BR0,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR0,F NSOMA3E: GOTO VOLTA ;================================================================================ CONV_ASC2: conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOVWF R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS ADDLW 0X3A GOTO SAIQ LETRAS: ADDLW 0X41 SAIQ: MOVWF R1 SWAPF R0,F MOVFW R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS1 ADDLW 0X3A GOTO SAIQ1 LETRAS1: ADDLW 0X41 SAIQ1: RETURN ;======================================================================== ;ROTINA DE ENVIO DA SERIAL (38400 BAUDS) 'W' ESTÁ COM O BIT A TRANSMITIR SEND MOVWF BUFFER MOVLW .8 MOVWF CNT BCF T_232 ;ENVIA START BIT MOVLW .7 CALL T_BAUD VTP1 RRF BUFFER,F BTFSS STATUS,C BCF T_232 BTFSC STATUS,C BSF T_232 NOP MOVLW .4 CALL T_BAUD DECFSZ CNT,F GOTO VTP1 BSF T_232 ;STOP BIT MOVLW .7 CALL T_BAUD RETURN ;TEMPO DE 26 uSEG (INCLUINDO RETORNO) T_BAUD MOVWF CNT1 DECFSZ CNT1,F GOTO $-1 RETURN ENDIF END