;*************************************************************************************************** ; ; PROJETO : PIC_VOLTIMETRO_SERIAL ; ; OBJETIVO: MOSTRAR TENSÃO DE ENTRADA NOS PINOS 7,6,5,3, COM VISUALISAÇÃO EM PC USANDO TERMINAL RS232 ; (HYPERTERMINAL). ; ESCALA: 0 A 5 VOLTS ; AJUSTAR HYPERTERMINAL PARA 38400 BAUDS, 8 BITS, SEM PARIDADE, 1 STOP BIT, NO HANDSHAKE ; INICIO : 21/01/13 TERM.:21/01/13 ; AUTOR: CLÁUDIO CARMONA LÁRIOS ; PROCESSADOR: PIC 12F675 ; PROJETO DIDÁTICO APENAS. ; PINAGEM: ; PINO 1 = VCC ; PINO 2 = RS232 (ENVIA) P/ PINO 2 DA DB9 ; PINO 3 = ; PINO 4 = RESET ; PINO 5 ; PINO 6 = V REF (AJUSTE DE CALIBRAÇÃO = 2,048 VOLTS) ; PINO 7 = V ENTRADA (MEDIÇÃO) ; PINO 8 = GND ;___________________________________________________________________________________________________ ; LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ;PALAVRA DE CONFGURAÇÃO: __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON ;PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS DA RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA CONT0 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO CONT0A ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1A ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO TEMP ;TEMPORÁRIO AUX ;IDEM AUX1 ;IDEM LC ;DELAY LC1 ;IDEM TR ;BUFFER PARA ENVIO DO LCD C0 ;REGISTRADOR PARA CONVERSÃO C1 ;IDEM BR0 ;RESULTADO DE CONVERSÃO BR1 ;IDEM BR2 ;IDEM R0 ;AUXILIAR USADO NA CONVERSÃO HEXA PARA ASCII R1 ;IDEM PAG ;AUX DE SALTO GOTO FLAGS ;FLAGS BUFFER ;REGISTRADOR PARA A SERIAL CNT CNT1 PROXIMO SALVA_ANSEL TMP ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE LIGAC ADCON0,1 ;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE T_232 GPIO,5 ;PINO 2 TRANSMITE P/ RS232 (2 DA DB9) #DEFINE FLAG_NC FLAGS,1 ;FLAG DE NOVA CONVERSÃO #DEFINE FLAG_NCA FLAGS,2 ;FLAG DE REPETE NOVA CONVERSÃO #DEFINE FLAG_ZESQ FLAGS,3 ;FLAG DE ZERO A ESQUERDA T_APRES EQU .20 ;TEMPO DE APRESENTAÇÃO DA ULTIMA COMVERSÃO ;========================================================================================= ; VETOR DE RESET ORG 0X00 GOTO INICIO ;========================================================================================= ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;========================================================================================= ;PAGINA ZERO ;ROTINA PARA ENVIO DE FRASES PARA A SERIAL ENV_SERIAL MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL SEND INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL FRASE1: dt 0x0a,0x0d,0x0a,0x0d, " ***********PIC_VOLTIMETRO_RS232_4CANAIS***********",0x0a,0x0d,0x0a,0x0d, " BLOG: 'LARIOS.TECNOLOGIA.WS'", 0x0a,0x0d,0x0a,0x0d,0 FRASE2: dt " CANAL ",0 ;================================================================================== ; INICIO DO PROGRAMA ;================================================================================== ;CONFIGURAÇÕES INICIAIS DOS REGISTRADORES E PORTAS INICIO BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW .0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'11011111' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA GPI5 MOVWF TRISIO ; MOVLW B'10000000' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM CLRF ANSEL BSF ANSEL,5 ;SELECIONA OSC/32 BSF ANSEL,0 ;SELECIONA TODOS CANAIS BSF ANSEL,1 BSF ANSEL,2 BSF ANSEL,3 CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON MOVLW B'10000001';LIGA CONVERSOR AN/DIG (USA TENSÃO VCC COMO REFERÊNCIA) MOVWF ADCON0 ;ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA CLRF GPIO ;LIMPA PORTA E C BSF T_232 ;TX SERIAL NIVEL ALTO CLRF FLAGS ;IDEM FLAGS CLRF PROXIMO ;CONTADOR DE CANAL ATIVO CLRF PAG MOVLW FRASE1 ;ENVIA MENSAGEM INICIAL CALL ENV_SERIAL ;============================================================================================ ; LOOP PRINCIPAL ;============================================================================================ MAIN ;============================================================================================ ; SEGUE UMA SEQUENCIA DE 4 LEITURAS COM TEMPO DE 8,3 mSeg ENTRE ELAS. MOVLW .40 ;TEMPO DE ESTABILIZAÇÃO PARA LEITURA DO CANAL MOVWF TMP DECFSZ TMP,F GOTO $-1 BCF FLAG_ZESQ ;FLAG DE ZERO A ESQUERDA 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 C1 ;CARREGA CONTADOR AUXILIAR COM RESULTADO ALTO BANK1 MOVFW ADRESL ;OBTEM A PARTE BAIXA DA CONVERSÃO BANK0 MOVWF C0 ;CARREGA CONTADOR AUXILIAR 1 COM RESULTADO BAIXO BTFSC FLAG_NC GOTO FEITA_2_LEIT BSF FLAG_NC MOVFW C0 MOVWF CONT0 MOVFW C1 MOVWF CONT1 MOVLW .1 CALL WAIT_WMSEC ;DELAY GOTO MAIN ;VAI FAZER NOVA LEITURA FEITA_2_LEIT CLRF TEMP BCF FLAG_NC MOVFW CONT0 ADDWF C0,F RLF TEMP,F ;SALVA CARRY MOVFW CONT1 ADDWF TEMP,W ADDWF C1,F BCF STATUS,C RRF C1,F ;DIVIDE POR 2 PARA OBTER PRIMEIRA MÉDIA RRF C0,F BTFSC FLAG_NCA ;TESTA SE FOI FEITA AS 2 LEITURAS FINAIS GOTO FEITA_MAIS_2_LEIT MOVFW C0 ;SALVA C0 MOVWF CONT0A MOVFW C1 ;SALVA C1 MOVWF CONT1A BSF FLAG_NCA MOVLW .1 CALL WAIT_WMSEC ;DELAY GOTO MAIN FEITA_MAIS_2_LEIT BCF FLAG_NCA MOVFW CONT0A MOVWF CONT0 MOVFW CONT1A MOVWF CONT1 CLRF TEMP BCF FLAG_NC MOVFW CONT0 ADDWF C0,F RLF TEMP,F ;SALVA CARRY MOVFW CONT1 ADDWF TEMP,W ADDWF C1,F ;SOMA OS RESULTADOS BCF STATUS,C RRF C1,F ;DIVIDE POR 2 PARA OBTER MÉDIA FINAL RRF C0,F CALL CONV_DEC CALL MOSTRA_TEMP ;ENVIA PELA SERIAL PARA O PC MOVFW PROXIMO XORLW .3 BTFSS STATUS,Z GOTO PULA5 MOVLW .10 CALL DELAYW MOVLW 0X0D ;RETORNA PARA O COMEÇO DA LINHA A SER APRESENTADA CALL SEND PULA5 INCF PROXIMO,F MOVFW PROXIMO ANDLW 0X03 ;LIMITA A 4 CANAIS MOVWF PROXIMO XORLW .0 BTFSC STATUS,Z GOTO SELECT_CANAL_0 MOVFW PROXIMO XORLW .1 BTFSC STATUS,Z GOTO SELECT_CANAL_1 MOVFW PROXIMO XORLW .2 BTFSC STATUS,Z GOTO SELECT_CANAL_2 BSF ADCON0,2 ;CANAL 3 BSF ADCON0,3 GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS SELECT_CANAL_0 BCF ADCON0,2 ;CANAL 0 BCF ADCON0,3 GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS SELECT_CANAL_1 BSF ADCON0,2 ;CANAL 1 BCF ADCON0,3 GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS SELECT_CANAL_2 BCF ADCON0,2 ;CANAL 2 BSF ADCON0,3 GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS ;====================================================================================================== ; SUB-ROTINAS ;====================================================================================================== MOSTRA_TEMP CLRF PAG MOVLW FRASE2 CALL ENV_SERIAL MOVFW PROXIMO XORLW .0 BTFSC STATUS,Z MOVLW '0' BTFSC STATUS,Z GOTO CONT99 MOVFW PROXIMO XORLW .1 BTFSC STATUS,Z MOVLW '1' BTFSC STATUS,Z GOTO CONT99 MOVFW PROXIMO XORLW .2 BTFSC STATUS,Z MOVLW '2' BTFSC STATUS,Z GOTO CONT99 MOVLW '3' CONT99 CALL SEND MOVLW ' ' CALL SEND MOVLW '=' CALL SEND MOVLW ' ' CALL SEND MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVFW R1 CALL SEND ;ENVIA CENTENA MOVLW '.' ;ENVIA PONTO CALL SEND MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL SEND MOVFW R1 ;ENVIA UNIDADE CALL SEND MOVLW ' ' ;ENVIA ESPAÇO CALL SEND MOVLW 'V' ;ENVIA 'V' (VOLTS) CALL SEND MOVLW ' ' ;ENVIA ESPAÇO CALL SEND MOVLW ' ' ;ENVIA ESPAÇO CALL SEND RETURN CONV_DEC ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) ; ; ; EX: C0=FF ; C1=FF ; SERÁ APÓS CONVERSÃO : ; BR2=06 , BR1=55 ,BR0=35 (OBS. VALOR MÁXIMO 65535) ;*************************************************************************** ; RESERVAR ESTES REGISTRADORES NA MEMÓRIA ( SRAM) ; LC data 20H ;LOOPCOUNTER ; BR0 data 21H ;RESULTADOS DA CONVERSÃO ; BR1 data 22H ; BR2 data 23H ; C1 data 24H ;VALOR DE ENTRADA ALTO ; C0 data 25H ;BAIXO 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 ;================================================================================ ;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 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== ;DELAY MICROSEGUNDOS WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;======================================================================== ;ROTINA DE ENVIO DE FRASE INICIAL FRASEINIT CLRF PAG MOVLW FRASE1 CALL ENV_SERIAL MOVLW FRASE2 CALL ENV_SERIAL 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 END