Conversor AD + display 16x2

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Conversor AD + display 16x2

Mensagempor Adauto sampaio » 01 Fev 2007 14:57

Boa tarde. Preciso fazer um pic 16f873 ler duas entradas analógicas, fazer uma conversão AD e mostrar o resultado em um display 16x2. O resultado será mostrado como uma barra de segmentos, um de cada vez, onde já defini o caractere na CGRAM do display. o problema começa agora: se vou mostrar somente a linha de cima, ou a linha de baixo, tudo bem, mas se tento realizar duas conversões (primeiro em RA3 e depois em RA5), uma seguida da outra, o display não consegue separar as linhas. Se alguém puder dar uma ajuda, agradeço. Aí vai uma parte do código fonte:

;Configuração do display
DISPLAY_INIT
MOVLW .100
CALL DELAY_MS

MOVLW 0x30 ; ESCREVE COMANDO 0X30 TRES VEZES
CALL SEND_CMD ; PARA INICIALIZAÇÃO

MOVLW .4
CALL DELAY_MS

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 .2
CALL DELAY_MS

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

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



;Configura entrada analógica RA1
BANK0
MOVLW B'10001001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/32
; CANAL 0
; MÓDULO LIGADO
MOVLW .2
CALL DELAY_MS

BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
CLRWDT
SWAPF ADRESH,W
ANDLW B'00001111'
ADDWF PCL,F

GOTO VU_1L
GOTO VU_2L
GOTO VU_3L
GOTO VU_4L
GOTO VU_5L
GOTO VU_6L
GOTO VU_7L
GOTO VU_8L
GOTO VU_9L
GOTO VU_10L
GOTO VU_11L
GOTO VU_12L
GOTO VU_13L
GOTO VU_14L
GOTO VU_15L
GOTO VU_CLIPL

VU_1L
MOVLW 0X81
CALL SEND_CMD
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
GOTO MAIN2
V2L:::::: assim por diante

MAIN2
BANK1
MOVLW B'00000010'
MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D
; RA0A RA4 ANALÓGICO
; RA5, 6 E 7 COMO I/O DIGITAL
; PORTE COMO I/O DIGITAL
; JUSTIFICADO À ESQUERDA
; 8 BITS EM ADRESH E 2 BITS EM ADRESL
; Vref+ = VDD (+5V)
; Vref- = GND ( 0V)
BANK0
MOVLW B'10011001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/32
; CANAL 0
; MÓDULO LIGADO
MOVLW .2
CALL DELAY_MS

BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
CLRWDT
SWAPF ADRESH,W
ANDLW B'00001111'
ADDWF PCL,F

GOTO VU_1
GOTO VU_2
GOTO VU_3
GOTO VU_4
GOTO VU_5
GOTO VU_6
GOTO VU_7
GOTO VU_8
GOTO VU_9
GOTO VU_10
GOTO VU_11
GOTO VU_12
GOTO VU_13
GOTO VU_14
GOTO VU_15
GOTO VU_CLIP
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor fabim » 01 Fev 2007 15:15

Adauto seja mais exato..
"não consegue separar as linhas"...

E outra coisa esse negocio de
SWAPF ADRESH,W
ANDLW B'00001111'
.. pra que isso ?

Fabim.
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Adauto sampaio » 01 Fev 2007 15:30

fabim escreveu:Adauto seja mais exato..
"não consegue separar as linhas"...

E outra coisa esse negocio de
SWAPF ADRESH,W
ANDLW B'00001111'
.. pra que isso ?

Fabim.



É o seguinte: se uso uma das entradas do conversor AD e faço a conversão, o resultado é guradado em ADRESH (justificado à esquerda, jogo fora os 2 bits menos significativos). Faço uma inversão (SWAPF) para usar somente os quatro bits mais significativos, limito o sesultado até 16 (ANDLW) e somo ao PCL (ADDWF PCL) para pular para a linha certa, de acordo com o resultado.
Mas se preciso chavear outra entrada do conversor, e escrever na linha de baixo do display, dentro da rotina principal, aí o programa bagunça as duas linhas, sem estabilizar. Na verdade é um VU bargraph que preciso fazer, se puder me ajudar, agradeço.
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor fabim » 01 Fev 2007 15:37

bom como não tenho o fonte nas minhas mãos fica dificir maisss...


LE AD1 e faz a conversão de valor até 15
Guarda em myvar1
LE AD2 e faz a conversão de valor até 15
guarda em myvar2

coloca pra escrever na linha um e chama a rotina do bargraph usando myvar1
coloca pra escrever na linha dois e chama a rotina do bargraph usando myvar2

entendeu a lógica.. pode ser algum erro seu também..

Abraços

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Adauto sampaio » 01 Fev 2007 15:44

fabim escreveu:bom como não tenho o fonte nas minhas mãos fica dificir maisss...


LE AD1 e faz a conversão de valor até 15
Guarda em myvar1
LE AD2 e faz a conversão de valor até 15
guarda em myvar2

coloca pra escrever na linha um e chama a rotina do bargraph usando myvar1
coloca pra escrever na linha dois e chama a rotina do bargraph usando myvar2

entendeu a lógica.. pode ser algum erro seu também..

Abraços

Fabim



Beleza Fabim, vou tentar e te falo se deu certo
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor Adauto sampaio » 01 Fev 2007 16:32

É, infelizmente ainda não deu certo. To mandando uma copia do programa, já to ficando sem cabelo!!! Aqui to postando somente um canal da conversão, e não deu certo ainda. Se vc ou mais alguém tiver alguma idéia, fiquem à vontade. Obrigado


MAIN

MOVLW B'10001001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/32
; CANAL 1
; MÓDULO LIGADO
MOVLW .4
CALL DELAY_MS

BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
SWAPF ADRESH,W ; FAZ A INVERSÃO PARA APROVEITAR SOMENTE A PARTE
ANDLW B'00001111' ; ALTA DA CONVERSÃO
MOVWF RESULTADO_VU1 ; SALVA EM RESULTADO VU1

CLRWDT

MOVLW B'10011001'
MOVWF ADCON0 ; CONFIGURA CONVERSOR A/D
; VELOCIDADE -> Fosc/32
; CANAL 3
; MÓDULO LIGADO
MOVLW .4
CALL DELAY_MS

BSF ADCON0,GO ; INICIA CONVERSÃO A/D
BTFSC ADCON0,GO ; FIM DA CONVERSÃO ?
GOTO $-1 ; NÃO - VOLTA 1 INSTRUÇÃO
; SIM
SWAPF ADRESH,W ; FAZ A INVERSÃO PARA APROVEITAR SOMENTE A PARTE
ANDLW B'00001111' ; ALTA DA CONVERSÃO
MOVWF RESULTADO_VU2 ; SALVA EM RESULTADO VU2


CONVERTE_1
MOVLW RESULTADO_VU1
ADDWF PCL,F

GOTO VU_1L
GOTO VU_2L
GOTO VU_3L
GOTO VU_4L
GOTO VU_5L
GOTO VU_6L
GOTO VU_7L
GOTO VU_8L
GOTO VU_9L
GOTO VU_10L
GOTO VU_11L
GOTO VU_12L
GOTO VU_13L
GOTO VU_14L
GOTO VU_15L
GOTO VU_CLIPL

VU_1L
MOVLW 0X81
CALL SEND_CMD
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
MOVLW ' '
CALL SEND_CHAR
GOTO MAIN :) :)
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor Adauto sampaio » 01 Fev 2007 16:48

O problema é que quando salvo o valor da conversão em um registrador temporário, ele parece alterar o conteúdo. Agora, se eu efetuar o salto do PCL logo após a conversão, usando o registrador ADRESH, então funciona, mas só para uma entrada de conversão (para uma linha do LCD).
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor proex » 01 Fev 2007 17:44

Se vc esta salvando o ADRESH no RESULTADO_VU2, vc deve usar
MOVF RESULTADO_VU2,W
ADDWF PCL,F

E nao MOVLW RESULTADO_VU2

Entende?
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Renie » 01 Fev 2007 17:58

Olá Adauto!

Adauto sampaio escreveu:O problema é que quando salvo o valor da conversão em um registrador temporário, ele parece alterar o conteúdo. .....


o comando abaixo está errado, ele está movendo um valor fixo para w

MOVLW RESULTADO_VU1

o correto seria

MOVFW RESULTADO_VU1
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor proex » 01 Fev 2007 19:22

Pô Renie, assim nao vale hehehhehe.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Renie » 01 Fev 2007 20:06

Po Jr, você foi mais rápido no gatilho, digo ENTER, do que eu! hehehhe


Adauto,

verifique também se seus ADDFW PCL não estão gerando uma
"quebra de página".
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor Adauto sampaio » 02 Fev 2007 07:57

Renie escreveu:Po Jr, você foi mais rápido no gatilho, digo ENTER, do que eu! hehehhe


Adauto,

verifique também se seus ADDFW PCL não estão gerando uma
"quebra de página".


Desculpe, Renie, mas sem querer abusar da sua boa vontade, como assim uma quebra de página? Vc fala entre bank0 e bank1?

Outra coisa, realmente lá em cima tinha um "gato" na programação, que corrigi ontem à noite mesmo, mas o problema ainda continua. Como desencargo, na linha de baixo eu usei outra porta do conversor para montar um voltímetro e funcionou, mas quando vai tentar junto com o VU, aí ele trava (o VU). Se coloco dois voltimetros , um na linha de cima e outro na de baixo, tudo funciona perfeito, mesmo usando duas portas analogicas. O bendito problema está quando tento adicionar o VU. Se algum de vcs tiver outra idéia, será muito bem vinda :lol:
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor Renie » 02 Fev 2007 09:06

Olá Adauto!

Não, os bancos são relativos a RAM.

Dê uma olhada no datasheet do PIC, veja PCL e PCLATCH.

O PCL é um registro de 8 bits onde fica a parte baixa do endereço atual,
no PCLATH fica a parte alta, um "estouro" do PCL não incrementa o
PCLATH.

Ex. se seu ADDWF PCL,F estiver no endereço 3FAh, qualquer valor de
W maior que 5 vai bagunçar seu programa, digamos que W esteja com
8 , o comando vai fazer o ponteiro de endereço mudar para 303h e não
para 403h.
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor Adauto sampaio » 02 Fev 2007 09:41

Renie escreveu:Ex. se seu ADDWF PCL,F estiver no endereço 3FAh, qualquer valor de
W maior que 5 vai bagunçar seu programa, digamos que W esteja com
8 , o comando vai fazer o ponteiro de endereço mudar para 303h e não
para 403h.


Agora sim entendi. E como faço para saber se meu PCL está nesse endereço? E se estiver, como posso alterar para que isso não aconteça?
Acredito que seja isso mesmopois até certo ponto funciona. A partir do momento que a tensão de entrada ultrapassa certo valor, o display não responde mais e o PIC trava. Aí o WDT estoura e reseta, mas continua travado, até que eu desça a tensão novamente.
Desculpe pela insistência, mas é que isso já se tornou um desafio, e não vou descansar enquanto não encontrar o erro.
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor Adauto sampaio » 02 Fev 2007 12:34

Ufa, acho que agora vai.... Descobri onde estava a caca. Eu simplesmente coloquei as rotinas de chamada (call) para depois da rotina principal (MAIN). Como ainda não tenho as manhas de acertar os bits do pclath, foi a solução que encontrei para o problema. Obrigado aos amigos Fabim, Proex, Renie e ao Ricardo Eletroinf, que me deram uma força (o Ricardo só encontrei no MSN através do site do Renie, mas deu uma baita força).
É tudo uma questão de sorte; pergunte a qualquer perdedor
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