;===================================================================================================== ; PROJETO VOLTIMETRO COM 3 DIGITOS DE 0 A 25 VOLTS ; INICIO : 26/03/13 TERM.:27/03/13 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 16F628A ; OBJETIVO: MEDIR TENSÕES DE 0 A 25 VOLTS,PARA USO EM FONTES DE ALIMENTAÇÃO DE BANCADA ; USA O METODO DELTA_SIGMA PARA CONVERTER A TENSÃO ANALÓGICA EM DIGITAL. ;============================================================================================================== ;ARQUIVOS PARA COMPILAÇÃO LIST P=16f628a , R=DEC INCLUDE "P16F628a.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ;============================================================================================================== ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF ;=============================================================================================================== ;TROCA DE BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;================================================================================================================ ;RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA DIG0 ;ACUMULADOR DOS DIGITOS DO DISPLAY ZERO (0) DIG1 ;ACUMULADOR DOS DIGITOS DO DISPLAY UM(1) DIG2 ;ACUMULADOR DOS DIGITOS DO DISPLAY DOIS (2) CENV ;CONTADOR DE ENVIO PARA MOSTRADOR EXTERNO DEL0 ;DELAY DEL1 ;IDEM FLAGS ;IDEM CONT0 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO CDELAP ;DELAY PARA REDUZIR CONVERSÕES E OPERAR MULTIPLEXAÇÃO PONTK ;PONTEIRO PARA KATODOS DOS SEGUIMENTOS WAUX ;W AUXILIAR PT_MSG ;PONTEIRO PARA MENSAGEM AUX AUX1 ;AUXILIAR WTEMP ;USADO PARA SALVAR 'W' STATUSTEMP ;USADO PARA SALVAR 'STATUS' LC ;REGISTRADORES GERAL C1 ;RESULTADO HIGH CONVERSOR DELTA-SIGMA C0 ;RESULTADO LOW DELTA-SIGMA BR0 ;RESULTADOS DA CONVERSÃO HEX PARA DECIMAL BR1 ;IDEM BR2 ;IDEM BR3 ;IDEM CICLO1 ;REGISTRADOR DE RESOLUÇÃO HIGH CICLO ;REGISTRADOR DE RESOLUÇÃO LOW CNT ;REGISTRADOR GERAL ENDC ;*********************************************************************************************** ; CONSTANTES VDEL0 EQU .250; 250 VALOR INICIAIS PARA DELAY VDEL10MS EQU .13; PARA 10 MILISEGUNDOS VDEL1MS EQU .1 ;================================================================================================== ; VETOR DE RESET ORG 0X00 GOTO INICIO ;=================================================================================================== ; VETOR DE INTERRUPCAO ;=================================================================================================== ORG 0X04 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BCF INTCON,T0IF ;APAGA FLAG INTERRUPÇÃO TMR0 BANK0 MX MOVFW PONTK ANDLW B'00000011' ADDWF PCL,F GOTO M0 GOTO M1 GOTO M2 INCF PONTK,F GOTO MX M0 MOVFW DIG0 MOVWF WAUX ;CARREGA CONTADOR AUXILIAR CALL COPYD BSF PORTB,2 ;SETA RB2 K0 INCF PONTK,F GOTO SAI_INT M1 MOVFW DIG1 MOVWF WAUX CALL COPYD BSF PORTB,6 ;SETA RB6 K1 INCF PONTK,F GOTO SAI_INT M2 MOVFW DIG2 MOVWF WAUX CALL COPYD BSF PORTB,4 ;SETA RB4 K2 INCF PONTK,F GOTO SAI_INT SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS MOVFW WTEMP ;RECUPERA 'W' RETFIE ;================================================================================================= ; INICIALIZAÇÃO DE REGISTRADORES E PORTAS ;================================================================================================= INICIO BANK1 ;BANCO 1 MOVLW B'10100000' ;LIGA INTERRUPÇÃO GERAL E DO TIMER 0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'00100110' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; MOVLW b'00000000' MOVWF TRISB MOVLW B'10000011' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM MOVLW B'11101100' ;0XEC MOVWF VRCON ;VREF= 2,5 VOLTS NO PINO RA2 BANK0 MOVLW .5 ;CONFIGURA PARA UM COMPARADOR APENAS MOVWF CMCON CLRF PORTA ;LIMPA PORTA CLRF PORTB ;LIMPA PORTB CLRF CONT0 ;LIMPA OS REGISTRADORES ABAIXO CLRF CONT1 CLRF DEL1 CLRF PONTK MOVLW 0XFC ;VALOR INICIAL DO DISPLAY ('0.0') MOVWF DIG0 COMF DIG0,F MOVWF DIG1 COMF DIG1,F CLRF DIG2 COMF DIG2,F CLRF FLAGS ;============================================================================================== ; LOOP PRINCIPAL ;============================================================================================== MAIN CALL LE_TENSÃO ;LE A TENSÃO NA ENTRADA (DELTA-SIGMA) MOVLW .127 ;TEMPO ENTRE AMOSTRAGEM CALL DELAY ;ROTINA DE DELAY GOTO MAIN ;=============================================================================================== ; SUB ROTINAS ;=============================================================================================== ;ROTINA DE CONVERSÃO DELTA-SIGMA LE_TENSÃO MOVLW 0X10 ; 12 BITS DE RESOLUÇÃO MOVWF CICLO1 CLRF CICLO CLRF C1 ;APAGA RESULTADOS CLRF C0 DELTA_SIGMA BTFSS CMCON,7 ;C2OUT (TESTA SAIDA DO COMPARADOR 1) GOTO E_ZERO ;PULA SE ZERO BSF PORTA,0 ;SE '1', LIGA ALIMENTAÇÃO PARA RESISTOR DE 47K GOTO $+1 ;ATRASO PARA MANTER O MESMO TEMPO TOTAL GOTO $+1 GOTO $+1 GOTO $+1 DELAY_D MOVLW .60 ;TEMPO DE ATRASO MOVWF CNT DECFSZ CNT,F GOTO $-1 DECFSZ CICLO,F ;DECREMENTA CICLO (CICLO= 'RESOLUÇÃO') GOTO SAI_D DECFSZ CICLO1,F GOTO SAI_D1 GOTO FIM_DA_CONVERSÃO ;FIM DA CONVERSÃO SAI_D GOTO $+1 ;ATRASO PARA MANTER O MESMO TEMPO TOTAL SAI_D1 GOTO DELTA_SIGMA ;VOLTA AO LOOP PRINCIPAL E_ZERO BCF PORTA,0 ;DESLIGA ALIMENTAÇÃO PARA O RESISTOR DE 47K INCFSZ C0,F ;INCREMENTA RESULTADO GOTO DELAY_D1 INCFSZ C1,F GOTO DELAY_D2 DELAY_D1 NOP ;ATRASO PARA MANTER O MESMO TEMPO TOTAL DELAY_D2 GOTO DELAY_D ;VAI PARA O ATRASO FIM_DA_CONVERSÃO BCF PORTA,0 ;DESCARREGA CAPACITOR CALL CONV_DEC ;CONVERTE PARA DECIMAL CALL CD7S ;CONVERTE E COLOCA NOS BUFFER DE SAIDA PARA MULTIPLEXAÇÃO RETURN ;=============================================================================================== ;CONVERTE PARA 7 SEGUIMENTOS E COLOCA NOS BUFFERS (DIG2 A 0) DO MULTIPLEX PARA APRESENTAÇÃO CD7S SWAPF BR1,W ;CONVERTE TERCEIRO DIGITO PARA 7 SEGUIMENTOS ANDLW 0X0F ADDLW .0 BTFSS STATUS,Z GOTO PR1 CLRF DIG2 COMF DIG2,F GOTO V_DIG1 PR1 CALL SEG7 MOVWF DIG2 COMF DIG2,F V_DIG1 MOVFW BR1 ;CONVERTE SEGUNDO DIGITO PARA 7 SEGMENTOS ANDLW 0X0F CALL SEG7 MOVWF DIG1 COMF DIG1,F V_DIG0 SWAPF BR0,W ;CONVERTE PRIMEIRO DIGITO PARA 7 SEGMENTOS ANDLW 0X0F CALL SEG7 MOVWF DIG0 COMF DIG0,F RETURN ;__________________________________________________________________________________ ;TABELA DE CONVERSÃO "CALCULO GOTO" RETORNA 7 SEGUIMENTOS SEG7 ADDWF PCL,F RETLW B'11111100' ;RETORNA NUMERO 0 (ABCDEFGP) F C RETLW B'01100000' ;RETORNA 1 60 RETLW B'11011010' ;RETORNA 2 DA RETLW B'11110010' ;RETORNA 3 F2 RETLW B'01100110' ;RETORNA 4 66 RETLW B'10110110' ;RETORNA 5 B6 RETLW B'10111110' ;RETORNA 6 BE RETLW B'11100000' ;RETORNA 7 E0 RETLW B'11111110' ;RETORNA 8 RETLW B'11110110' ;RETORNA 9 ;------------------------------------------------------------------------- ;TRASFERE PARA OS PORT'S DE SAIDA O DIGX SELECIONADO COPYD CLRF PORTA CLRF PORTB BTFSC WAUX,1 BSF PORTA,7 ;SETA RA2 G BTFSC WAUX,2 BSF PORTA,6 ;SETA RA1 F BTFSC WAUX,3 BSF PORTB,5 ;SETA RC5 E BTFSC WAUX,4 BSF PORTA,4 ;SETA RA4 D BTFSC WAUX,5 BSF PORTA,3 ;SETA RA3 C BTFSC WAUX,6 BSF PORTB,1 ;SETA RC1 B BTFSC WAUX,7 BSF PORTB,0 ;SETA RC0 A RETURN ;-------------------------------------------------------------------------- ;ROTINA DE ATRASO DELAY MOVWF DEL1 CLRF DEL0 DECFSZ DEL0,F GOTO $-1 DECFSZ DEL1,F GOTO $-3 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 ;================================================================================ END