VU meter com 628A + display 16x2

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

VU meter com 628A + display 16x2

Mensagempor Adauto sampaio » 14 Jan 2007 13:08

E aí pessoal do fórum, blz. Recentemente estou desenvolvendo um projetinho com o 16F628A e estou encontrando dificuldades. É o seguinte: preciso fazer um medidor de intensidade de áudio (bargraph, ou VU) utilizando um display 16x2. a linha de cima é L (esquerdo) e a linha de baixo é R (direito). Até aí, blz. Coloquei um potenciômetro na entrada para variar entre 0 e 5V. Como o 628 não tem AD interno, estou usando um conversor Delta Sigma, baseado na AN700 da Microchip. Criei um caractere na CGRAM do display para fazer “acender” a quantidade certa de acordo com a intensidade do sinal de entrada. O problema é que não estou conseguindo fazer funcionar, ele acende uma determinada quantidade de caracteres, e fica só nisso. Parece que a entrada do conversor não funciona mais. Já fiz um voltímetro usando o mesmo processo, com rotinas de multiplicação e divisão, e funcionou perfeito, apresentando o resultado no display.
Se alguém do fórum puder dar uma mãozinha, agradeço. Aí vai uma parte do código em assembler. Já tentei usar sem as rotinas de divisão e multiplicação, mas o resultado foi o mesmo. Desculpem, mas a rotina é meio grande, mas coloquei o máximo de informação possível.



; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * CONSTANTES INTERNAS *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A DEFINIÇÃO DE CONSTANTES FACILITA A PROGRAMAÇÃO E A MANUTENÇÃO.

C1 EQU .18 ;CONSTANTES USADAS PARA POSTERIOR COMPARAÇÃO COM C2 EQU .36 ;CONVERSOR AD, PARA FORMAÇÃO DO BARGRAPH.
C3 EQU .54 .
C4 EQU .72
C5 EQU .90
C6 EQU .108
C7 EQU .126
C8 EQU .144
C9 EQU .162
C10 EQU .180
C11 EQU .198
C12 EQU .216
C13 EQU .234
C14 EQU .250

;****************************************************************************
; ROTINA PARA ESCRITA DE UM CARACTERE NA CGRAM DO DISPLAY
; ESTE CARACTERE SERÁ O CURSOR DO V.U.
;****************************************************************************

CARACTERE_1

MOVLW 0X40 ;APONTA PARA O PRIMEIRO ENDEREÇO DA CGRAM
CALL SEND_CMD
MOVLW 0X1E
CALL SEND_CHAR ;ENVIA OS BYTES NA SEQUÊNCIA, PARA FORMAR
MOVLW 0X1E ;O CARACTERE
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR
MOVLW 0X1E
CALL SEND_CHAR

RETURN


;******************************************************************
; ROTINA DE INICIALIZAÇÃO DO CONVERSOR SIGMA DELTA
;******************************************************************

InitDeltaSigA2D
bsf STATUS,RP0
movlw 0xEC
movwf VRCON
bcf PORTA,3 ; set comparator pin to output
bcf STATUS,RP0
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return
;
; Delta Sigma A2D
; The code below contains a lot of nops and goto next instruction. These
; are necessary to ensure that each pass through the loop takes the same
; amount of time, no matter the path through the code.
;

DeltaSigA2D
clrf COUNTER
clrf RESULT
movlw 0x03 ; set up for 2 analog comparators with common reference
movwf CMCON
loop
btfsc CMCON,C1OUT ; Is comparator high or low?
goto complow ; Go the low route
comphigh
nop ; necessary to keep timing even
bcf PORTA,3 ; PortA.3 = 0
incfsz RESULT,f ; bump counter
goto eat2cycles ;
goto endloop ;
complow
bsf PORTA,3 ; Comparator is low
nop ; necessary to keep timing even
goto eat2cycles ; same here
eat2cycles
goto endloop ; eat 2 more cycles
endloop
incfsz COUNTER,f ; Count this lap through the loop.
goto eat5cycles ;
incf COUNTER,f ;
movf COUNTER,w ;
andlw 0xFF ; Are we done? (We're done when bit2 of
btfsc STATUS,Z ; the high order byte overflows to 1).
goto loop ;
goto exit

eat5cycles
goto $+1 ; more wasted time to keep the loops even
nop ;
goto loop ;
exit
movlw 0x06 ; set up for 2 analog comparators with common reference
movwf CMCON
return




;**************************************************************
; ROTINA DE ESCRITA DE COMANDO NO DISPLAY
;**************************************************************

SEND_CMD
MOVWF CHAR ;GUARDA O COMANDO OU CARACTERE EM CHAR
MOVLW .10
CALL DELAY_MS ;PERDE 10MS PARA ESTABILIZAÇÃO
BCF RS
BSF E ;ENVIA PULSO DE ENABLE AO DISPLAY
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN


;**************************************************************
; ROTINA DE ESCRITA DE CARACTERE NO DISPLAY
;**************************************************************

SEND_CHAR
MOVWF CHAR
MOVLW .10
CALL DELAY_MS
BSF RS
BSF E
MOVF CHAR,W
MOVWF DISPLAY
BCF E
RETURN



;**************************************************************
;* inicio do programa
;**************************************************************
INICIO

CLRF PORTA
CLRF PORTB

BANK1 ; SELECIONA O BANCO 1 DE MEMÓRIA

MOVLW B'00110111' ; AJUSTA OS BITS DO PORTA
MOVWF TRISA

MOVLW 0x00 ; AJUSTA OS BITS DO PORTB COMO SAÍDA
MOVWF TRISB

MOVLW B'10000000' ; PRESCALER 1:0 NO TMR0
MOVWF OPTION_REG ; PULL'UPS DESABILITADOS
; DEMAIS CONFIGURAÇÕES SÃO IRRELEVANTES

MOVLW 0X00
MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS

BANK0 ; VOLTA AO BANCO 0 (PADRÃO DE RESET)


BCF E ;ACERTA OS PINOS DE CONTROLE DO DISPLAY
BCF RS


;*******************************************************************
; Inicializa o display
; caracter 5x7, 2 linhas, cursor ligado, mensagem fixa
;*******************************************************************
;
DISPLAY_INIT

MOVLW .30 ; ESCREVE COMANDO 0X30 TRES VEZES
CALL DELAY_MS ; PARA INICIALIZAÇÃO

MOVLW 0x30
CALL SEND_CMD

MOVLW 0x30
CALL SEND_CMD

MOVLW 0X30
CALL SEND_CMD

MOVLW B'00111000' ; INTERFACE DE 8 VIAS
CALL SEND_CMD

MOVLW B'00000001' ; LIMPA DISPLAY
CALL SEND_CMD

MOVLW B'00001100' ; LIGAR DISPLAY SEM CURSOR
CALL SEND_CMD

MOVLW B'00000110' ; COMANDO PARA INCREMENTO AUTOMÁTICO À DIREITA
CALL SEND_CMD

CALL CARACTERE_1


; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA DE ESCRITA DA TELA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ESCREVE A TELA PRINCIPAL DO PROGRAMA, COM AS FRASES:
; LINHA 1 - "L"
; LINHA 2 - "R"

TELA_PRINCIPAL

MOVLW 0X01
CALL SEND_CMD ;LIMPA DISPLAY

MOVLW 0X80 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 0 / COLUNA 0

MOVLW 'L' ;ESCREVE NA LINHA 0 COLUNA 0
CALL SEND_CHAR

MOVLW 0XC0 ; COMANDO PARA POSICIONAR O CURSOR
CALL SEND_CMD ; LINHA 1 / COLUNA 0

MOVLW 'R'
CALL SEND_CHAR



;*******************************************************************************
; LOOP PRINCIPAL - MAIN
;*******************************************************************************

MAIN
CALL InitDeltaSigA2D
CALL DeltaSigA2D



; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA PRINCIPAL *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; A ROTINA PRINCIPAL FICA COMPARANDO AS CONSTANTES DE C1 A C14 COM O RESULTADO DA CONVERSÃO E PULANDO PARA O PONTO CERTO DE ACORDO COM O VALOR.

PRINCIPAL

MOVLW C1
SUBWF RESULT,W ; SUBTRAI O VALOR DA CONVERSÃO DE C1
BTFSS STATUS,C ; TESTA CARRY, RESULTADO NEGATIVO?
GOTO VU_1

MOVLW C2
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_2

MOVLW C3
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_3

MOVLW C4
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_4

MOVLW C5
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_5

MOVLW C6
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_6

MOVLW C7
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_7

MOVLW C8
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_8

MOVLW C9
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_9

MOVLW C10
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_10

MOVLW C11
SUBWF RESULT,W
BTFSS STATUS,C
GOTO VU_11

GOTO FIM



VU_1
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_2
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_3
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_4
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_5
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN


VU_6
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN


VU_7
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN


VU_8
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_9
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN


VU_10
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN

VU_11
MOVLW 0X83
CALL SEND_CMD
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
CALL SEND_CHAR
MOVLW 0X00
CALL SEND_CHAR
MOVLW .100
CALL DELAY_MS
GOTO MAIN




; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * FIM DO PROGRAMA *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

FIM
END ; FIM DO PROGRAMA
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor proex » 14 Jan 2007 15:43

Use o PIC16F819 quem tem AD de 10 bits e é barato pacas.

PS: Vc retificou o sinal de áudio?
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Adauto sampaio » 18 Jan 2007 20:26

Boa noite Proex, desculpe pela demora na resposta. Depois de muito tempo em cima, acabei descobrindo uma maneira fácil. Apenas precisei considerar a parte mais significativa (MSB) do byte (SWAPF), limitar até 16 segmentos (AND) e aplicar ao PCL, e aí sim a coisa funcionou.
Preferi usar um conversor AD sigma delta, pois não tinha disponível nenhum PIC com AD interno, e de quebra, se usar um multiplex (4051, 52 ou 53), posso ter um conversor AD de quantos canais precisar, hehehe!!! E não estava usando um sinal de áudio, mas somente um potenciometro entre o VCC e terra. Mesmo assim, obrigado pela resposta!!!!!!!!
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x