Lei de Murphy ou Coisa do Alééémmm?

Para "abobrinhas" use o " Boteco"

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor vtrx » 21 Ago 2012 12:26

Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor enigmabox » 21 Ago 2012 12:56

Nunca tinha usado esse PIC. Só o comprei porque estava muito barato.


MOR_AL,

Tá vendo, o barato sai caro! heheehheh
Ainda bem que descobriu o problema, outra forma seria começar um novo projeto do zero.
:D
enigmabox
 

Mensagempor pbernardi » 21 Ago 2012 13:26

Beleza que resolveu o problem MOR_AL.

Malditos PICs... :D Mas todo uC/uP dá problemas de configuração, o datasheet sempre temque ser lido e relido pra pegar essas obscuriedades.
But to us there is but one God, plus or minus one - Corinthians 8:6±2. (xkcd.com)
pbernardi
Word
 
Mensagens: 707
Registrado em: 12 Out 2006 19:01
Localização: Curitiba-PR

Mensagempor MOR_AL » 22 Ago 2012 16:51

... E a saga continua... :cry:
Gravei (ICPROG) dois PIC16F873A com o mesmo firmware. Os dois tiveram comportamento diferentes no circuito.

Num o LCD só mostra os quadradinhos da primeira linha, indicando que não aceitou programação. Desconfiei do chip. Foi o que consumiu a tal sobrecorrente. Joguei fora.
No outro aparece a palavra "Frequencia", mas logo em seguida desaparece e reaparece novamente. Fica assim oscilando.

Depois gravei, com o mesmo firmware, este segundo e um terceiro, agora com o programador PICFLASH.
A palavra "Frequencia" aparece e desaparece, como se o LCD fosse limpo e reescrito. Tudo numa taxa de uns 2 segundos. Assim que termina de escrever (leva 1 segundo), apaga (1 segundo). Os caracteres são escritos lentamente. Já vefifiquei os tempos usados na configuração do LCD e na escrita dos caracteres diversas vezes e estão ok.
Peguei o osciloscópio (50MHz) e comecei a monitorar os pinos. Todos estavam se comportando como o esperado, até o oscilador, com uma senóide bonita e firme no cristal (20MHz).
Mas houve uma excessão!!!
O pino RC7, que fornece o sinal RS apresenta uma onda quadrada constante, na mesma taxa que a palavra "Frequencia" aparece e desaparece.
O mais estranho é que mando escrever APENAS uma vez no LCD e depois o programa fica em loop (End).
O pino RC7 compartilha com uma função da USART, que já fica resetada, logo após o reset inicial, mesmo assim eu desabilito o registro RCSTA.

Agora vou colocar um resistor em série (função RS), entre o pino do PIC e do LCD, para ver se o PIC está enviando para o LCD ou é o contrário. No momento é mais fácil interromper um filete e colocar o resistor, que trocar de LCD. O LCD está soldado na PCI. Acho que são 11 pinos soldados. Não posso, ainda, culpar o PIC, pois tanto ele como o LCD estão sendo usados pela primeira vez.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor enigmabox » 23 Ago 2012 15:19

MOR_AL,

Recentemente eu fiz um projeto similar ao seu com um MC68hc908 e um LCD 2 linhas x 16 caracteres , cor azul.
O mcu está alimentado por modulo cristal de 32mhz. E tem como uma das funções contar pulsos de um encoder incremental e apresentar o valor no LCD. Digo que não tive nenhum problema de instabilidades.
Acho que você está tendo problemas com a ferramenta de gravação do PIC.
Dificil o LCD mandar dado pra fora se o mesmo esta com o pino W aterrado.
Já passei por algo similiar com um Atmega16, quando uma má configuração de microfusiveis interna do MCU, deixava o mcu instavel ou dava problemas quando era ligado.
Dá uma analisada na ferramenta de gravação, como você mudou de PIC, pode ter havido mudança de endereçamento de Ram e Flash ou use um outro tipo de PIC como teste.
Outra coisa, desligou o watchdog?, se possuir no seu PIC, ele pode gerar Resets aleatorios.
enigmabox
 

Mensagempor MOR_AL » 23 Ago 2012 15:57

enigmabox escreveu:MOR_AL,

Recentemente eu fiz um projeto similar ao seu com um MC68hc908 e um LCD 2 linhas x 16 caracteres , cor azul.
O mcu está alimentado por modulo cristal de 32mhz. E tem como uma das funções contar pulsos de um encoder incremental e apresentar o valor no LCD. Digo que não tive nenhum problema de instabilidades.
Acho que você está tendo problemas com a ferramenta de gravação do PIC.

Como postei, fiz a mesma gravação em dois PICF873A. Tanto com o ICPROG, como com o PICFLASH, totalizando 4 gravações. Devido aos comportamentos diferentes dos PICs, joguei um fora. Aquele que tinha consumido corrente em excesso.

Dificil o LCD mandar dado pra fora se o mesmo esta com o pino W aterrado.

Também acho, mas quando já se tentou de tudo, não custa nada verificar!

Já passei por algo similiar com um Atmega16, quando uma má configuração de microfusiveis interna do MCU, deixava o mcu instavel ou dava problemas quando era ligado.
Dá uma analisada na ferramenta de gravação, como você mudou de PIC (mudei de componente, mas com a mesma especificação PIC16F873A), pode ter havido mudança de endereçamento de Ram e Flash ou use um outro tipo de PIC como teste.
Outra coisa, desligou o watchdog? (Sim!), se possuir no seu PIC, ele pode gerar Resets aleatorios. (Sim, mas não a cada 2 segundos. Como disse antes, todos os pinos respondiam como o esperado, com excessão do pino RS para o LCD, que oscilava)


Bom!
Não me pergunte porquê eu fiz, mas o problema da oscilação de onda quadrada com 2 segundos parou. Fiz o seguinte:
Como o pino RS oscilava sem controle, então coloquei um loop ao final do programa. RS = 0!!! A oscilação parou!
Óbviamente essa não era uma opção válida no programa principal. Então eu tirei o loop e troquei por 5 instruções RS = 0.
Funcionou também!
Depois tirei as 5 instruções e coloquei uma na saída da rotina de escrita no LCD, o que seria desnecessário; também funcionou! Deixei então assim.

Agora só ficou um problema.
Preciso apagar o conteúdo escrito no LCD, cada vez que tenho que atualizar os dados.
1 - Limpo o LCD, por meio do comando (RS = 0) e dado = 0x01.
2 - Escrevo FREQUENCIA na linha 1 do LCD.
3 - Escrevo o valor na linha 2 do LCD.

Se eu deixar assim, a palavra FREQUENCIA some e aparece ENCIA na linha 1
Se eu tirar o item 1 (limpar o LCD), tudo aparece normal.
Já usei umas n_zentas vezes essa instrução e não dava problema. Tentei de tudo. Resolvi contornar o problema.
Escrevo os itens 2 e 3, inclusive os caracteres apagados (espaço).
Conclusão:
Agora está funcionando, mas não sei porque o item 1 alterava a palavra escrita na linha 1.
Já escrevo o valor da frequência, mas descobri um erro no meu fluxograma nessa parte. Vou trabalhar nisso agora.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor enigmabox » 23 Ago 2012 16:27

Mor_Al

Dá medo trabalhar com PICs! :shock:

Quanto aos dados no LCD:
1) Quando envia o comando para apagar o LCD, este leva mais tempo para liberar o LCD para o MCU, assim, encavala a escrita freq. Ai tem que incrementar um delay maior, quando usa este comando.
2)Normalmente eu nao apago o LCD inteiro, para atualizar informações, uso o comando linha e coluna e reescrevo acima dos caracteres que me interessam atualizar.
Normalmente o campo numerico da frequencia no seu LCD deve ter X caracteres posicionados na segunda linha do LCD. Entao é mais facil usar o comando L,C e reescrever por cima os numeros. Fica mais rapido. Imagine um LCD com 4 linhas 32 caracteres, apagando a tela inteira e reescrevendo tudo! Fica uma coisa maluca!
Outra coisa, recomendo enviar atualização de dados para o LCD a cada 01 segundo pra nao ficar oscilando o campo numerico devido a velocidade de atualização do mcu.
enigmabox
 

Mensagempor vtrx » 23 Ago 2012 19:47

Acho que sua rotina não esta setando os endereços corretos correspondente a linha um,dois etc.
Código: Selecionar todos
LCD_LINE1_ADD      EQU      0X80      ; ENDEREÇO DDRAM DA 1º COLUNA DA 1º LINHA DO DISPLAY
LCD_LINE2_ADD      EQU      0XC0      ; ENDEREÇO DDRAM DA 1º COLUNA DA 2º LINHA DO DISPLAY
LCD_LINE3_ADD      EQU      0X90      ; ENDEREÇO DDRAM DA 1º COLUNA DA 3º LINHA DO DISPLAY
LCD_LINE4_ADD      EQU      0XD0      ; ENDEREÇO DDRAM DA 1º COLUNA DA 4º LINHA DO DISPLAY
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor MOR_AL » 23 Ago 2012 22:36

enigmabox escreveu:Mor_Al

Dá medo trabalhar com PICs! :shock:

Estou concluindo que o problema não é o PIC. Até hoje não encontrei um caso que não tenha sido eu o causador :oops:
É fácil atribuir o problema ao PIC, mas difícil é reconhecer os próprios erros. Adiante eu reconheço mais um deles.


Quanto aos dados no LCD:
1) Quando envia o comando para apagar o LCD, este leva mais tempo para liberar o LCD para o MCU, assim, encavala a escrita freq. Ai tem que incrementar um delay maior, quando usa este comando.

Acho que você matou a charada!!!
Isso explicaria porque aparece apenas a parte final da palavra "FREQUENCIA". O LCD estava ocupado durante "FREQU" e aceitou "ENCIA".
Consultei diversas fontes sobre o tempo:
1 - 82us a 4,1ms - Um site que não tenho mais o endereço.
2 - 82us a 1,64ms - Idem.
3 - 1,53ms @ [E.T. (Fosc = 270kHz)] - Do manual.

Estou usando 50us, o que é pouco mesmo. Amanhã vou fazer a alteração para 5ms e ver se funciona. Depois eu conto o que ocorreu.


2)Normalmente eu nao apago o LCD inteiro, para atualizar informações, uso o comando linha e coluna e reescrevo acima dos caracteres que me interessam atualizar.

Eu não sigo essa técnica, porque considero o caso de algum ruído ou problema, que altere um caractere, daqueles que não devem ser alterados. É o caso da palavra "FREQUENCIA". Se reescrever cada vez que tenho que atualizar os dados, o erro nunca ficará por mais que um pequeno tempo.

Normalmente o campo numerico da frequencia no seu LCD deve ter X caracteres posicionados na segunda linha do LCD. Entao é mais facil usar o comando L,C e reescrever por cima os numeros. Fica mais rapido. Imagine um LCD com 4 linhas 32 caracteres, apagando a tela inteira e reescrevendo tudo! Fica uma coisa maluca!

Nesse caso, você tem razão! Quando reescrever tudo leva um tempo impeditivo, temos que alterar apenas o necessário, mesmo correndo o risco de mudar algum caractere fixo.

Outra coisa, recomendo enviar atualização de dados para o LCD a cada 01 segundo pra nao ficar oscilando o campo numerico devido a velocidade de atualização do mcu.

Para que eu tenha o maior número de dígitos corretos, coloquei uma janela de aquisição dos pulsos de 1,000000 segundo (ou 5.000.000 de clocks em 20MHz de cristal). Isso também facilita, pois o valor medido é o da frequência.
Valeu pela dica do tempo de apagar o LCD
MOR_AL



"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor MOR_AL » 23 Ago 2012 22:46

vtrx escreveu:Acho que sua rotina não esta setando os endereços corretos correspondente a linha um,dois etc.
Código: Selecionar todos
LCD_LINE1_ADD      EQU      0X80      ; ENDEREÇO DDRAM DA 1º COLUNA DA 1º LINHA DO DISPLAY
LCD_LINE2_ADD      EQU      0XC0      ; ENDEREÇO DDRAM DA 1º COLUNA DA 2º LINHA DO DISPLAY
LCD_LINE3_ADD      EQU      0X90      ; ENDEREÇO DDRAM DA 1º COLUNA DA 3º LINHA DO DISPLAY
LCD_LINE4_ADD      EQU      0XD0      ; ENDEREÇO DDRAM DA 1º COLUNA DA 4º LINHA DO DISPLAY


Olá vtrx!
Valeu pela contribuição!
Eu fiz as minhas rotinas do LCD. ConfiguraLCD, EnviaNibbles, EnviaByte e EscreveCaracterEmYX.
Lí o manual e alguns sites e fiz elas. Das que encontrei prontas, nenhuma permitia usar qualquer pino de I/O como pinos para o LCD. Com as minhas isso pode ser feito. Lembrando que estão em assembler.
Poderiam conter erros sim, mas os projetos anteriores descartaram essa hipótese.
Acho que a solução do problema foi mostrado pelo enigmabox.
Quando implementar a sugestão eu posto aqui o resultado.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor jorgeluiz » 24 Ago 2012 01:38

já trabalhei com esse pic, 4 k de memoria, e me deu uma canseira por causa das interrupçoes, eu esqueci de salvar o pc lath das paginas, as vezes nao retornava a pagina corretamente....feito isso, tudo funcionou.
Avatar do usuário
jorgeluiz
Byte
 
Mensagens: 448
Registrado em: 26 Mar 2007 02:26

Mensagempor MOR_AL » 24 Ago 2012 08:12

Olá Jorge!
Ainda não usei as interrupções desse PIC, mas quando o fizer, vou me lembrar deste detalhe.

Bom.
A dica do enigmabox foi correta.
Era o tempo de espera após o comando de apagar o LCD e levar o cursor para a posição linha 1, coluna 1.
Aumentei o tempo para 5ms e apareceram mais letras da palavra FREQUENCIA (apareceu REQUENCIA na primeira linha, primeira coluna).
Segundo o manual, seriam necessários até 4,1ms, mas tive que colocar dois períodos de 5ms (10ms). Aí todas as letras apareceram corretamente e em seu local próprio.
Valeu.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor MOR_AL » 30 Ago 2012 15:54

Finalmente coloquei o frequencímetro para funcionar corretamente, porém tenho algumas observações:
1 - O PIC16F873A não causou nenhum dos problemas.
2 - Os problemas foram causados por mim, com os seguintes atenuantes:

a) O ICPROG eventualmente informava que o processo de gravação dera proglema. Às vezes essa informação era falsa, às vezes verdadeira.
b) O processo de gravação via ICPROG é irritantemente lento. Passei a usar a gravação via PICFLASH. É surpreendentemente bem mais rápida. E é via USB.
c) O único inconveniente do PIC16F873A é que no reset, ao ligar, os pinos que concorrem ao CAD estão configurados como entradas analógicas. Deveriam estar desligados e configurados para I/O digital. Isso me causou mais uns dois dias de cabeça quente e certamente mais alguns fios de cabelos brancos. Hehe.

3 - Agora falta maquear o circuito:

a) Retirar alguns circuitos que coloquei para melhor acompanhar o desenvolvimento do programa (alguns pisca LED).
b) Retirar a parte do programa que confirma que a janela de leitura dos pulsos de entrada possui 5.000.000 de clocks @ XTAL = 20MHz.
c) Inserir os créditos.

4 - Por melhorar:
O frequencímetro, via PIC, está amarrado ao TIMER0, porque ele é o único que permite que a frequência máxima supere os 40Mc/s.
Isso implica em ser obrigatório um outro pino conectado à entrada RA4, ora como entrada (High Z) para deixar os pulsos entrarem no pino RA4, ora como saída em zero, para impedir que os pulsos continuem a entrar fora do período de contagem.
Quando esse outro pino estiver na condição de saída em '0', isso poderia curto-circuitar a entrada do gerador da frequência ou do ponto elétrico que desejamos monitorar a frequência. Para evitar-se esse inconveniente, se coloca um resistor entre a fonte de sinal e os pinos do PIC. O valor desse resistor é problemático. Se for muito grande, juntamente com a capacitância dos dois pinos do PIC, forma um filtro passa-baixas, integrando os pulsos nos pinos, falseando as medições.
Se esse resistor for muito pequeno, causa uma carga pequena ao ponto elétrico que está sendo medido. O valor de praxe é 470 ohms.
Liguei o frequencímetro na saída TTL do gerador que eu fiz com o XR2206. Ele mediu corretamente, pois também medi com um frequencímetro comercial e com o osciloscópio (esse com menor precisão).
Bom. O que ocorreu foi que durante o período em que um dos pinos do PIC fica em modo de saída '0', a saída do gerador sofreu atenuação. Dava para ver no osciloscópio, que o sinal na saída do gerador atenuava.
Então o próximo passo é colocar um pequeno circuito entre o PIC e o ponto elétrico que desejamos medir a frequência. Esse circuito tem que apresentar uma impedância alta para o ponto elétrico que desejamos medir a frequência e ao mesmo tempo deixar passar os 40Mc/s (esta é a frequência máxima que o AD9850 fornece). Lembrando que a utilização do frequencímetro foi uma diretriz para a implementação do gerador com o AD9850.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor enigmabox » 30 Ago 2012 21:33

Então o próximo passo é colocar um pequeno circuito entre o PIC e o ponto elétrico que desejamos medir a frequência. Esse circuito tem que apresentar uma impedância alta para o ponto elétrico que desejamos medir a frequência e ao mesmo tempo deixar passar os 40Mc/s (esta é a frequência máxima que o AD9850 fornece). Lembrando que a utilização do frequencímetro foi uma diretriz para a implementação do gerador com o AD9850.
MOR_AL

Ha algumas decadas atras....hehehehe, eu tinha construido um frequencimetro com componentes TTL e lembro de ter utilizado como buffer na entrada do circuito contador TTL, um circuito amplificador com um transistor em classe A.
Se nao me engano foi um BF254 ou BF494.
Se quiser , te mando o circuito do frequencimetro, pra tu se basear.
:wink:
enigmabox
 

Mensagempor MOR_AL » 30 Ago 2012 22:40

enigmabox escreveu:...
Ha algumas decadas atras....hehehehe, eu tinha construido um frequencimetro com componentes TTL e lembro de ter utilizado como buffer na entrada do circuito contador TTL, um circuito amplificador com um transistor em classe A.
Se nao me engano foi um BF254 ou BF494.
Se quiser , te mando o circuito do frequencimetro, pra tu se basear.
:wink:


Mande apenas do buffer sim!
Se puder coloque aqui para todos nos beneficiarmos.
Aproveito e faço uma simulação da resposta em frequências dele.

Na verdade, inicialmente pensei em usar transistor. O primeiro estágio seria um coletor comum (entrada pela base e saída pelo emissor). Isso dá uma resistência de entrada de:

Rin = RB//[(hfe+1)*Re], onde:

Rin é a resistência de entrada.
RB são os dois resistores de polarização de base em //.
hfe é aprox. 50
Re é o resistor de emissor ao terra.

Por causa da frequência envolvida, não podemos aumentar muito essa resistência, uma vez que a capacitância de entrada do transistor forma um filtro passa-baixas e isso limita a resposta em frequência.
Suponho que algo próximo a 4k7 seria bom. Ainda não sei pois teria que testar. Aliás vou simular antes e ver qual é a resposta em frequência, que isso dá.
Pensei em um resistor de 6k8 do terra à base e outro da base ao +5V. Algo como 56k. O suficiente para que a corrente no transistor fique em 0,1mA. O resistor de emissor seria de 1K ou 1k2.
Ainda não pensei no segundo estágio, nem se seria necessário.
Outra opção seria colocar um fet na entrada, mas ainda não pensei no assunto. Como disse tenho que retirar um led e mexer no firmware para terminar.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

AnteriorPróximo

Voltar para Assuntos Gerais

Quem está online

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

x