;*************************************************************************************************** ; ; PROJETO : PIC_TERMOMETRO_SERIAL ; ; OBJETIVO: MOSTRAR TEMPERATURA DE UM SENSORES LM35, COM VISUALISAÇÃO EM PC USANDO TERMINAL RS232 ; (HYPERTERMINAL). ; ESCALA: 0 ºC A 150 ºC (LIMITE DO LM35) ; AJUSTAR HYPERTERMINAL PARA 38400 BAUDS, 8 BITS, SEM PARIDADE, 1 STOP BIT, NO HANDSHAKE ; INICIO : 20/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 =xtal ; PINO 3 =xtal ; PINO 4 = RESET ; PINO 5 = RS232 (ENVIA) P/ PINO 2 DA DB9 ; PINO 6 = V REF (AJUSTE DE CALIBRAÇÃO = 2,048 VOLTS) ; PINO 7 = SENSOR 1 ; 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 & _XT_OSC & _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 ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE LIGAC ADCON0,1 ;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE SENSOR1 GPIO,0 ;PINO 7 #DEFINE T_232 GPIO,2 ;PINO 5 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_TERMOMETRO_RS232***********",0x0a,0x0d,0x0a,0x0d, " BLOG: 'LARIOS.TECNOLOGIA.WS'", 0x0a,0x0d,0x0a,0x0d,0 FRASE2: dt " TEMPERATURA = ",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'11111011' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO 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 PARA O AN0 CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON MOVLW B'11000001';LIGA CONVERSOR AN/DIG (USA TENSÃO EM PORTA1 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 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. 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 CLRF ANSEL 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 .11 CALL WAIT_WMSEC ;DELAY DE 8,33 mSEG 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 .11 CALL WAIT_WMSEC ;DELAY DE 8,33 mSEG 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 CALL CONV_DEC CALL MOSTRA_TEMP ;ENVIA PELA SERIAL PARA O PC MOVLW .10 CALL DELAYW MOVLW 0X0D CALL SEND GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS ;====================================================================================================== ; SUB-ROTINAS ;====================================================================================================== MOSTRA_TEMP CLRF PAG MOVLW FRASE2 CALL ENV_SERIAL MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVWF AUX XORLW 0X30 ;TESTA SE É ZERO A ESQUERDA BTFSS STATUS,Z GOTO SEGUI2 BSF FLAG_ZESQ MOVLW ' ' ;APAGA ZERO A ESQUERDA GOTO SEGUI4 SEGUI2 MOVFW AUX SEGUI4 CALL SEND ;ULTIMO ZERO MOVFW R1 BTFSS FLAG_ZESQ GOTO SEGUI3 XORLW 0X30 ;VERIFICA SE É ZERO MOVLW ' ' ;SE ZERO ENVIA ESPAÇO BTFSS STATUS,Z MOVFW R1 SEGUI3 CALL SEND ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL SEND MOVLW '.' ;ENVIA PONTO CALL SEND MOVFW R1 ;ENVIA UNIDADE CALL SEND MOVLW ' ' CALL SEND ;ENVIA 'C' (CENTIGRADOS) MOVLW 'C' 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