;****************** PROJETO VOLTIMETRO DIGITAL INICIO : 01/06/06 TERM.:05/06/06********************************* ; VERSÃO COM MENSAGEM PRÉGRAVADA NO CÓDIGO ASM. ; MODIFICADO EM: 16/12/2012 ; AUTOR: CLÁUDIO CARMONA LÁRIOS ; PROCESSADOR: PIC 16F676 DE 14 PINOS ,8 AD ,1 COMPARADOR, 1024 K FLASH, 64BYTES RAM,128 EEPROM,12 I/O ; OBJETIVO: MOSTRAR VALOR DE UMA TENSÃO ANALOGICA NOS DIGITOS DE UM DISPLAY EXTERNO, SENDO ; ESTE POR MULTIPLEXAÇÃO. A CONVERSÃO BINARIA PARA BCD E BCD PARA 7 SEGUIMENTOS SERÁ ; FEITO PELO PROGRAMA FIRMWARE. ; USE RC INTERNO NO_CLOCKOUT,WATCH DOG OFF, BROWN DETECT ON,POWER ON RESET ON, ; PINOS:1=VDD* 2=RA5/TICK1/OSC1/CLK IN* 3=RA4/T1G-/OSC2/CLKOUT* 4=RA3IN APENAS/-MCLR/VPP* 5=RC5* 6=RC4* 7=AN7/RC3 ; 8-RC2/AN6* 9=RC1/AN5* 10=RC0/AN4* 11=RA2/C OUT/T0CK1/INT/AN2* 12=RA1/-CIN/PGD/AN1/VREF* 13=RA0/+CIN/PGD/AN0* ; 14=VSS (TERRA). ;___________________________________________________________________________________________________ ; LIST P=16f676 , R=DEC INCLUDE "P16F676.INC" ; ARQUIVO PADRAO ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN & _MCLRE_ON ; 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 DIG0 ;ACUMULADOR DOS DIGITOS DO DISPLAY ZERO (0) DIG1 ;ACUMULADOR DOS DIGITOS DO DISPLAY UM(1) DIG2 ;ACUMULADOR DOS DIGITOS DO DISPLAY DOIS (2) DIG3 ;ACUMULADOR DOS DIGITOS DO DISPLAY TREIS (3)(NÃO USADO) CENV ;CONTADOR DE ENVIO PARA MOSTRADOR EXTERNO DEL1 ;DELAY DEL2 ;IDEM DEL3 ;IDEM DEL4 ;DELAY PARA TRANSMISSAO E AMOSTRAGEM DOS DISPLAYS DEL5 ;IDEM FLAGS ;IDEM CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT2 ;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 CONTX TEMP CONT CONT_AP ENDC CBLOCK 0X3F PILHA ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE LIGAC ADCON0,1;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE BIT4 VALCOM,4;BITE N.4 DO REGISTRO DE VALOR A SER COMPARADO #DEFINE BIT5 VALCOM,5 #DEFINE BIT6 VALCOM,6 #DEFINE BIT7 VALCOM,7 #DEFINE FLAG_MSG_LOADED FLAGS,7 ;*********************************************************************************************** ; CONSTANTES VDEL1 EQU .250 ;VALOR INICIAIS PARA DELAY VDEL2 EQU .5 ;IDEM VDEL3 EQU .1 ; IDEM VDEL4 EQU .125 ;FREQUENCIA DE APRESENTAÇÃO MULTIPLEXADA (ALTERA O ABAIXO) VDEL5 EQU .1 VDELAP EQU .40 ; VALOR DE VEZES QUE SERÁ REPETIDA A ULTIMA CONVERSÃO AD ;************************************************************************************************** ; CONTANTES PARA MENSAGEM T_APRES EQU 3 * 0X1A ;PRIMEIRO NÚMERO DEFINE TEMPO DE APRESENTAÇÃO ; ;( EM DÉCIMOS DE SEGUNDO)PARA 3 DIGITOS DE MENSAGEM V_CONTX EQU 1 * 0X0A ;PRIMEIRO NÚMERO DEFINE QUANTAS VEZES APARECERÁ REPETIDAMENTE ; A MENSAGEM ( NO CASO, UMA ÚNICA VEZ) T_APR_ENTRE_LEITURA EQU 30 * 0X03 ;PRIMEIRO NÚMERO DEFINE INTERVALO ENTRE APRESENTAÇÕES ;(EM SEGUNDOS) DA MENSAGEM ;************************************************************************************************* ; VETOR E2PROM ; ORG H'2100' ;................................................................................................. ; VETOR DE RESET ORG 0X00 GOTO INICIO ;................................................................................................ ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;................................................................................................ ; ; 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'00000001' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; MOVLW .0 MOVWF TRISC MOVLW B'10000000' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM MOVLW B'01010000' ; SELEÇÃO DE FREQUENCIA DE CONVERSÃO ( OSC/16=01010000) MOVWF ADCON1 ; MOVLW B'00000001' ;SELECIONA RA0 COMO ANALOGICA. - 00000001 MOVWF ANSEL MOVLW .0 MOVWF VRCON BANK0 MOVLW .7 MOVWF CMCON MOVLW B'10000001' ;LIGA CONVERSOR AN/DIG B6=1 VREF E 0 VDD PARA COMPARAR 10000001 MOVWF ADCON0 ; * ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA CLRF PORTA ;LIMPA PORTA CLRF CONT1 CLRF CONT2 CLRF DEL1 CLRF DEL2 CLRF DEL3 CLRF PONTK CLRF PT_MSG CLRF FLAGS MOVLW VDELAP MOVWF CDELAP MOVLW T_APR_ENTRE_LEITURA MOVWF CONT_AP SHOW_APR ;============================================================= ;CARGA DE LETRAS DA MENSAGEM NA RAM MOVLW B'11001110' ;LETRA 'P' MOVWF PILHA MOVLW B'01100000' ;LETRA 'I' MOVWF PILHA+1 MOVLW B'10011100' ;LETRA 'C' MOVWF PILHA+2 MOVLW B'00000000' ;LETRA ' ' MOVWF PILHA+3 MOVLW B'10001110' ;LETRA 'F' MOVWF PILHA+4 MOVLW B'11111100' ;LETRA '0' MOVWF PILHA+5 MOVLW B'11101100' ;LETRA 'N' MOVWF PILHA+6 MOVLW B'00001110' ;LETRA 'T' MOVWF PILHA+7 MOVLW B'10011110' ;LETRA 'E' MOVWF PILHA+8 MOVLW B'00000000' ;LETRA ' ' MOVWF PILHA+9 MOVLW B'00000000' ;LETRA ' ' MOVWF PILHA+.10 MOVLW B'00000000' ;LETRA ' ' MOVWF PILHA+.11 BANK1 CLRF ANSEL CLRF TRISA ;SAIDA BANK0 BSF PORTA,0 ;DESLIGA PONTO CLRF PORTC CALL DELAYX ;FICA APAGADO POR UM POUCO MOVLW V_CONTX ;TEMPO DE CADA APRESENTAÇÃO MOVWF CONTX R_LOOP_EXT MOVLW T_APRES MOVWF CONT R_LOOP_INT MOVFW PILHA MOVWF WAUX CALL COPYD BSF PORTC,4 ;SETA RC2 K2 CALL DELAYX MOVFW PILHA+1 MOVWF WAUX CALL COPYD BSF PORTC,3 ;SETA RC2 K1 CALL DELAYX MOVFW PILHA+2 MOVWF WAUX CALL COPYD BSF PORTC,2 ;SETA RC2 K0 CALL DELAYX DECFSZ CONT,F GOTO R_LOOP_INT ;CONTINUA MOSTRANDO AS MESMAS LETRAS CALL RODA_MENSAGEM DECFSZ CONTX,F GOTO R_LOOP_EXT CLRF PORTC CALL DELAYX ;FICA APAGADO POR UM POUCO BANK1 MOVLW B'00000001' ;SELECIONA RA0 COMO ANALÓGICA. - 00000001 MOVWF ANSEL BSF TRISA,0 ;ENTRADA BANK0 MOVLW B'10000001' ;LIGA CONVERSOR AN/DIG B6=1 VREF E 0 VDD PARA COMPARAR 10000001 MOVWF ADCON0 ; * ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA MAIN NOP 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 CONT2 ;CARREGA CONTADOR AUXILIAR COM RESULTADO ALTO BANK1 MOVFW ADRESL BANK0 MOVWF CONT1 ;CARREGA CONTADOR AUXILIAR 1 COM RESULTADO BAIXO MOVLW VDELAP ;VALOR DE VEZES QUE SERA AMOSTRADO O MESMO NUMERO ANTES DE CONVERSÃO MOVWF CDELAP CALL CONVDEC ;CONVERTE PARA DECIMAL OS RESULTADOS H E L CALL ACERTO ;ACERTA VALOR SOMANDO E REDUZINDO ;------------------------------------------------------------------------------------------ CD7S MOVFW DIG0 ;CONVERTE PRIMEIRO DIGITO PARA 7 SEGMENTOS CALL SEG7 MOVWF DIG0 MOVFW DIG1 ;CONVERTE SEGUNDO DIGITO PARA 7 SEGUIMENTOS CALL SEG7 MOVWF DIG1 MOVFW DIG2 ;CONVERTE TERCEIRO DIGITO PARA 7 SEGUIMENTOS CALL SEG7 MOVWF DIG2 MOVFW DIG3 ;CONVERTE QUARTO DIGITO PARA 7 SEGUIMENTOS CALL SEG7 MOVWF DIG3 ;------------------------------------------------------------------------------------------ MOSTRA MOVFW PONTK ANDLW B'00000011' ADDWF PCL,F GOTO M0 GOTO M1 GOTO M2 GOTO M3 INCF PONTK,F GOTO MOSTRA ;__________________________________________________________________________________ SEG7 ADDWF PCL,F ;TABELA DE CONVERSÃO "CALCULO GOTO" RETORNA 7 SEGUIMENTOS 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 ;------------------------------------------------------------------------------------ M0 MOVFW DIG0 MOVWF WAUX ;CARREGA CONTADOR AUXILIAR CALL COPYD BSF PORTC,2 ;SETA RC2 K0 INCF PONTK,F CALL DELAY2 GOTO MOSTRA M1 MOVFW DIG1 MOVWF WAUX CALL COPYD BSF PORTC,3 ;SETA RC3 K1 INCF PONTK,F CAll DELAY2 GOTO MOSTRA M2 MOVFW DIG2 ;TESTA SE DIG2 É ZERO XORLW 0XFC BTFSC STATUS,Z GOTO NAOMZ ;SE FOR, APAGA ZERO A ESQUERDA MOVFW DIG2 MOVWF WAUX CALL COPYD BSF PORTC,4 ;SETA RC2 K2 INCF PONTK,F CALL DELAY2 GOTO NCONV NAOMZ BCF PORTC,4 ;APAGA RC2 K2 , SE FOR ZERO (DIG2) INCF PONTK,F GOTO NCONV M3 CLRF PORTC ;MOSTRA APENAS O PONTO CALL DELAY2 INCF PONTK,F GOTO MOSTRA ;------------------------------------------------------------------------- COPYD CLRF PORTA BSF PORTA,0 CLRF PORTC BTFSC WAUX,1 BSF PORTA,2 ;SETA RA2 'g' BTFSC WAUX,2 BSF PORTA,1 ;SETA RA1 'f' BTFSC WAUX,3 BSF PORTC,5 ;SETA RC5 'e' BTFSC WAUX,4 BSF PORTA,4 ;SETA RA4 'd' BTFSC WAUX,5 BSF PORTA,5 ;SETA RA5 'c' BTFSC WAUX,6 BSF PORTC,1 ;SETA RC1 'b' BTFSC WAUX,7 BSF PORTC,0 ;SETA RC0 'a' RETURN ;------------------------------------------------------------------------- NCONV DECFSZ CDELAP,F ; CONTA QUANTAS VEZES VAI AMOSTRAR O MESMO RESULTADO GOTO MOSTRA DECFSZ CONT_AP,F GOTO MAIN MOVLW T_APR_ENTRE_LEITURA MOVWF CONT_AP GOTO SHOW_APR ;-------------------------------------------------------------------------- DELAYTX MOVLW VDEL4 MOVWF DEL4 MOVLW VDEL5 MOVWF DEL5 LOOP2 DECFSZ DEL4,F GOTO LOOP2 DECFSZ DEL5,F GOTO LOOP2 RETURN ;-------------------------- ---------------- ;ROTINA DE ATRASO ENTRE AMOSTRAGENS DELAY2 MOVLW VDEL1 MOVWF DEL1 MOVLW VDEL2 MOVWF DEL2 MOVLW VDEL3 MOVWF DEL3 LOOP1 DECFSZ DEL1,F GOTO LOOP1 DECFSZ DEL2,F GOTO LOOP1 DECFSZ DEL3,F GOTO LOOP1 RETURN ;-------------------------------------------------------------------------------------- ; ROTINA DE CONVERSÃO BINÁRIA PARA BCD CONVDEC CLRF DIG0 ;LIMPA OU ZERA ACUMULADORES BCD CLRF DIG1 CLRF DIG2 CLRF DIG3 BTFSC CONT2,1 ;TESTA 10 BIT DO RESULTADO DA CONVERSÃO CALL B10 ;ROTINA DE SOMATÓRIA P/ 10B BTFSC CONT2,0 ;TESTA 9 BIT CALL B9 BTFSC CONT1,7 ;TESTA 8 BIT DO RESULTADO DA CONVERSÃO CALL B8 BTFSC CONT1,6 ;TESTA 7 BIT CALL B7 BTFSC CONT1,5 ;TESTA 6 BIT DO RESULTADO DA CONVERSÃO CALL B6 BTFSC CONT1,4 ;TESTA 5 BIT CALL B5 BTFSC CONT1,3 ;TESTA 4 BIT DO RESULTADO DA CONVERSÃO CALL B4 BTFSC CONT1,2 ;TESTA 3 BIT CALL B3 BTFSC CONT1,1 ;TESTA 2 BIT DO RESULTADO DA CONVERSÃO CALL B2 BTFSC CONT1,0 ;TESTA 1 BIT CALL B1 CALL ACERTO RETURN ;------------------------------------------------------------------------------------- B10 MOVLW .5 ;SUB-ROTINA DE SOMA RELATIVA AO EXPOENTE BINÁRIO 2 ELEVADO A BX ADDWF DIG2,F MOVLW .1 ADDWF DIG1,F MOVLW .2 ADDWF DIG0,F RETURN B9 MOVLW .2 ADDWF DIG2,F MOVLW .5 ADDWF DIG1,F MOVLW .6 ADDWF DIG0,F RETURN B8 MOVLW .1 ADDWF DIG2,F MOVLW .2 ADDWF DIG1,F MOVLW .8 ADDWF DIG0,F RETURN B7 MOVLW .6 ADDWF DIG1,F MOVLW .4 ADDWF DIG0,F RETURN B6 MOVLW .3 ADDWF DIG1,F MOVLW .2 ADDWF DIG0,F RETURN B5 MOVLW .1 ADDWF DIG1,F MOVLW .6 ADDWF DIG0,F RETURN B4 MOVLW .8 ADDWF DIG0,F RETURN B3 MOVLW .4 ADDWF DIG0,F RETURN B2 MOVLW .2 ADDWF DIG0,F RETURN B1 MOVLW .1 ADDWF DIG0,F RETURN ;-------------------------------------------------------------------------------- ;ROTINA DE REDUÇAO PARA MAXIMO 9 EM CADA DIGITO APOS SOMATORIA POR PESO. ACERTO MOVLW .10 SUBWF DIG0,W BTFSC STATUS,C ;SE CARRY É ZERO NUMERO NEGATIVO CALL REDUZ0 ;/PULA E MANTEM VALOR ORIGINAL DO MOVLW .10 ;/ DIG0 SUBWF DIG1,W BTFSC STATUS,C CALL REDUZ1 MOVLW .10 SUBWF DIG2,W BTFSC STATUS,C CALL REDUZ2 RETURN ;------------------------------------------------------------------------------ REDUZ0 INCF DIG1,F MOVWF DIG0 MOVLW .10 SUBWF DIG0,W BTFSS STATUS,C RETURN INCF DIG1,F MOVWF DIG0 GOTO $-6 REDUZ1 INCF DIG2,F MOVWF DIG1 MOVLW .10 SUBWF DIG1,W BTFSS STATUS,C RETURN INCF DIG2,F MOVWF DIG1 GOTO $-6 REDUZ2 INCF DIG3,F MOVWF DIG2 MOVLW .10 SUBWF DIG2,W BTFSS STATUS,C RETURN INCF DIG3,F MOVWF DIG2 GOTO $-6 ;------------------------------------------------------------------ DELAYX MOVLW .1 MOVWF DEL3 MOVLW .4 MOVWF DEL2 MOVLW .255 MOVWF DEL1 CALL LOOP1 RETURN RODA_MENSAGEM MOVLW PILHA MOVWF FSR MOVFW INDF MOVWF TEMP ;SALVA PILHA+0 MOVLW .12 MOVWF AUX1 L_12 INCF FSR,F MOVFW INDF DECF FSR,F MOVWF INDF DECFSZ AUX1,F GOTO L_80 MOVFW TEMP MOVWF PILHA+11 RETURN L_80 INCF FSR GOTO L_12 END