;================================================================ ===================================== ; PROJETO CONTROLE PWM E VOLTIMETRO COM 3 DIGITOS DE 0 A 18 VOLTS ; INICIO : 26/03/13 TERM.:27/03/13 ; AUTOR: CLÁUDIO LÁRIOS ; PROCESSADOR: PIC 16F628A ; OBJETIVO: CONTROLAR SAÍDA PWM E MEDIR TENSÕES DE 0 A 18 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 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 CONTL CONTH FLAGS ;FLAGS BYPASS RAP ENDC ;================================================================ ============================== ;FLAGS #DEFINE FLAG_UP FLAGS,7 #DEFINE FLAG_DOWN FLAGS,6 #DEFINE FLAG_MIN FLAGS,5 #DEFINE FLAG_MAX FLAGS,4 #DEFINE FLAG_RAPIDO FLAGS,3 ;**************************************************************** ******************************* ; CONSTANTES VDEL0 EQU .250 ; 250 VALOR INICIAIS PARA DELAY VDEL10MS EQU .13 ; PARA 10 MILISEGUNDOS VDEL1MS EQU .1 ; PARA 1 MILISEGUNDOS C_RAPIDO EQU .30 ;INCREMENTO/DECREMENTO RÁPIDO C_NORMAL EQU .5 ; VELOCIDADE DE INCREMENTO/DECREMENTO NORMAL C_INI_RAP EQU .5 ;CARGA PARA INICIAR INCREMENTO/DECREMENTO RÁPIDO ;================================================================ ================================== ; 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 BTFSS PORTB,7 ;TESTA INTERRUPTOR UP BCF FLAG_UP BTFSC PORTB,7 BSF FLAG_UP GOTO SAI_INT M1 MOVFW DIG1 MOVWF WAUX CALL COPYD BSF PORTB,6 ;SETA RB6 K1 INCF PONTK,F BTFSS PORTB,7 ;TESTA INTERRUPTOR DOWN BCF FLAG_DOWN BTFSC PORTB,7 BSF FLAG_DOWN 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'10000000' 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 MOVLW 0XFF ;ACERTA FREQUENCIA DE TRABALHO MOVWF PR2 BANK0 MOVLW B'00001100' MOVWF CCP1CON ;ACERTA PARA FUNÇÃO 'PWM' (RB3 SAIDA) MOVLW B'00000111' ;B2=ON/OFF TMR2 B1/B0=PRESCALER MOVWF T2CON 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 CLRF CONTL ;INICIALIZA CONTADORES CLRF CONTH BSF FLAG_MIN ;BLOQUEIA NO MÍNIMO MOVLW .0 MOVWF CCPR1L ;INICIA ZERADO O PWM BCF CCP1CON,4 BCF CCP1CON,5 MOVLW C_NORMAL ;CARGA DE NÚMERO DE VEZES QUE PULA A CONVERSÃO MOVWF BYPASS MOVLW C_INI_RAP ;CARGA DE TEMPO PARA ENTRAR 'MODO RÁPIDO' MOVWF RAP ;================================================================ ============================== ; LOOP PRINCIPAL ;================================================================ ============================== MAIN DECFSZ BYPASS,F GOTO PULA_CONVERSÃO CALL LE_TENSÃO ;LE A TENSÃO NA ENTRADA (DELTA-SIGMA) BTFSC FLAG_RAPIDO GOTO RAPIDO MOVLW C_NORMAL ;CARGA DE NÚMERO DE VEZES QUE PULA A CONVERSÃO MOVWF BYPASS GOTO PULA_CONVERSÃO RAPIDO MOVLW C_RAPIDO ;CARGA DE NÚMERO DE VEZES QUE PULA A CONVERSÃO MOVWF BYPASS PULA_CONVERSÃO BTFSS FLAG_UP GOTO SEG71 BCF FLAG_MIN ;LIBERA CONTAGEM DECRESCENTE BTFSC FLAG_MAX ;TESTA FLAG SE JÁ CHEGOU NO MÁXIMO GOTO SAI_PWM DECFSZ RAP,F GOTO F19 BSF FLAG_RAPIDO F19 MOVFW CONTL IORLW B'11111100' MOVWF CONTL INCFSZ CONTL,F GOTO SEG72 INCFSZ CONTH,F GOTO SEG72 BSF FLAG_MAX ;TRAVA NA CONTAGEM MÁXIMA MOVLW 0XFF MOVWF CONTL ;MANTÉM NO MÁXIMO MOVWF CONTH SEG71 BTFSC FLAG_MIN GOTO SAI_PWM BCF FLAG_MAX BTFSS FLAG_DOWN ;TESTA FLAG SE JÁ CHEGOU NO MÍNIMO GOTO SAI_PWM DECFSZ RAP,F GOTO F20 BSF FLAG_RAPIDO F20 MOVFW CONTL ANDLW B'00000011' MOVWF CONTL DECFSZ CONTL,F GOTO SEG72 DECFSZ CONTH,F GOTO SEG72 BSF FLAG_MIN ;TRAVA NA CONTAGEM MÍNIMA SEG72 BTFSS CONTL,0 ;ACERTA DUTY CICLE BCF CCP1CON,4 BTFSC CONTL,0 BSF CCP1CON,4 BTFSS CONTL,1 BCF CCP1CON,5 BTFSC CONTL,1 BSF CCP1CON,5 MOVFW CONTH MOVWF CCPR1L GOTO MAIN SAI_PWM BTFSS FLAG_RAPIDO GOTO MAIN BCF FLAG_RAPIDO ;RESETA FLAG DE MODO RÁPIDO MOVLW C_NORMAL ;CARGA DE NÚMERO DE VEZES QUE PULA A CONVERSÃO MODO NORMAL MOVWF BYPASS GOTO MAIN ;================================================================ =============================== ; SUB ROTINAS ;================================================================ =============================== ;ROTINA DE CONVERSÃO DELTA-SIGMA LE_TENSÃO MOVLW 0X10 ; RESOLUÇÃO 12 BITS 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 .10 ;.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 ;DESPREZAMOS RESULTADOS EM BR0 NO NIBLE LOW (INSTABILIDADE OCASIONADA PELA INTERRUPÇÃ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