Página 1 de 1

Problema com PIC16F877A

MensagemEnviado: 02 Jun 2010 10:55
por rflbeck
Olá para todos!

Sou novo no desenvolvimento de aplicações com PIC.
Estou tentando fazer funcionar um PIC16F877A com um cristal externo de 12MHz.

Eu pretendo fazer o PIC ler a informação de alguns sensores e mostrar em um LCD 16x2, mas por enquanto fiz um código pisca pisca de LED para testar o PIC. O projeto com o LCD eu ja tenho e simulando no proteus funciona direitinho.

Meu problema é que nada funciona quando ligo tudo na protoboard.

O circuito que eu fiz para testar esta da seguinte forma (Ligado em uma Protoboard):
Pinos 12 e 31 no terra, pinos 11 e 32 em +5V
O Cristal de 12Mhz esta ligado nas portas 13 e 14 do PIC, em cada saída do cristal há um capacitor de 22pF e o LED ligado na porta RA0 (pino 2)

Quando ligo o circuito, o LED pisca uma vez e apaga, depois disso não acontece mais nada.

Uma coisa curiosa é que se eu coloco o dedo no fio que liga o cristal ao PIC, o LED acende (algum fenômeno de eletronica que eu não faço idéia do que seja, pois meu conhecimento de eletronica é limitado).

Simulando isto no proteus novamente tudo acontece direitinho (logo o código deve estar certo).

Um teste que eu fiz foi usar um PIC16F628A com oscilador interno e funcionou tanto no proteus quanto na protoboard, então acredito que meu gravador também esteja funcionando.

Alguem tem idéia do que eu posso estar fazendo de errado?

GRato.

MensagemEnviado: 02 Jun 2010 11:02
por rafael.wachter
configuration bits: colocou como HS_OSC?
MCLR: colocou um botão? ligou direto no VCC?

MensagemEnviado: 02 Jun 2010 11:16
por rflbeck
Hmmm

Não estou com o código aqui, mas vou verificar.

Se não me engano eu coloquei XT_OSC e MCLR_OFF no configuration bits.

Vou confirmar...

MensagemEnviado: 02 Jun 2010 12:43
por tmarchesi2
Ja passei por situações semelhantes:

- Tente colocar um capacitor de 100nf o mais próximo possível do pino de alimentação. Parace besteira mas faz diferença.

- Tente trocar o cristal por um outro de mesmo valor, ja tive problemas com cristal sendo novo fazendo papel de antena.

- Se você possuir um limpa contato, tente passar nesta região do protoboard (não confunda com WD40).

Abraço; Se funcionar posta pra gente o problema !

MensagemEnviado: 02 Jun 2010 13:13
por rafael.wachter
no 628A funcionou com oscilador interno.. blz com MCLR off... blz

mas no 877A, ele não tem oscilador interno e tbm não tem como tu desabilitar o MCLR, ou seja, se tu tah usando um cristal de 12MHz coloca HS_OSC (ateh 4MHz eh XT_OSC e acima de 4MHz eh HS_OSC) e o pino MCLR coloca ligado direto no VCC ou coloca um botão e um resistor de pull-up

MensagemEnviado: 02 Jun 2010 18:22
por Cleber
Cara pelo que andei olhando não tem como desligar o MCLR do 877, outra coisa coloca o cristal o mais proximo possivel dos pinos do pic.

MensagemEnviado: 03 Jun 2010 12:37
por Andre_Cruz
rflbeck,

Enfentei um problema parecido essa semana, os capacitores de 22pF estavem com pau !
Retire os capacitores do cristal da protobord, e teste !

Abraço

André Cruz

MensagemEnviado: 03 Jun 2010 13:30
por renatokodaira
As vezes o circuito oscilador a cristal nao funciona no protoboard (principalmente os mais porcarias) por causa de capacitancias parasitas entre os contatos. Esse parece ser o seu caso, pois funciona colocando o dedo. Jah nao eh a primeira vez que alguem reporta esse problema. O jeito eh montar em circuito impresso ou usar um clock externo (daqueles osciladores retangulares de 4 pinos de metal).

MensagemEnviado: 08 Jun 2010 00:38
por rflbeck
rafael.wachter escreveu:no 628A funcionou com oscilador interno.. blz com MCLR off... blz

mas no 877A, ele não tem oscilador interno e tbm não tem como tu desabilitar o MCLR, ou seja, se tu tah usando um cristal de 12MHz coloca HS_OSC (ateh 4MHz eh XT_OSC e acima de 4MHz eh HS_OSC) e o pino MCLR coloca ligado direto no VCC ou coloca um botão e um resistor de pull-up


Boa noite para todos!

Bem, agradeço muito a ajuda de vocês e também peço desculpas pela demora da resposta, porém estes ultimos dias faltou tempo para eu dedicar-me ao meu projeto. Mas acabou de funcionar e eu ja vim postar aqui.

Enfim funcionou, eu alterei de XT_OSC para HS_OSC conforme a dica do nosso amigo e deu certo. Claro que não foi de primeira, tive que eliminar alguns fios com mal contato, trocar capacitores, fazer uma oração, etc...

E pra ajudar no meio do processo acabei queimando o PIC, ainda sim foi bom pois achei uma loja que vende mais barato.

Para encerrar, como eu havia dito sou iniciante, o que consegui ate agora foi piscar alguns LEDs, agora vou continuar com o projeto mesmo.

Obrigado a todos que ajudaram e espero contar com voces se aparecer mais algum problema.

MensagemEnviado: 08 Jun 2010 09:03
por rafael.wachter
estamos ae pra isso, ajudar :lol:

Continuando...

MensagemEnviado: 08 Jun 2010 16:20
por rflbeck
E ai galera!!

Bom, ja consegui bastante coisa, liguei meu LCD 16x2 no PIC, consegui fazer funcionar certinho, só tem uma coisa que ainda não esta certo.

Eu estou alternando o texto do display, seria para acontecer o seguinte, a cada segundo ele deveria trocar a mensagem "Texto1" e "Texto2", eu uso entre as trocas a função Delay_ms(1000); que seria para dar o tempo de 1 segundo, mas troca muito rápido, não chega a dar meio segundo.

O que eu devo fazer para ajustar isso?

Estou usando um Crystal de 12MHz, programando em MikroC, o clock que fica definido no mikroC influencia nisso? tenho que colocar o mesmo valor do crystal?

Há algum cálculo que preciso fazer?

MensagemEnviado: 08 Jun 2010 17:03
por Rodrigo.rb3s
rflbeck,

Aumenta o valor que vc está jogando em W antes de chamar a rotina delay se vc já estiver uzando 255 entao vai ter que criar uma outra rotina de atraso de tempo com uma variavel a mais, mas pode ser usada a mesma rotina de delay que o display de lcd usa pra ser inicializado, que funciona...
que linguagem voçe está usando assembly ou c?

MensagemEnviado: 09 Jun 2010 09:03
por rflbeck
Rodrigo.rb3s escreveu:rflbeck,

Aumenta o valor que vc está jogando em W antes de chamar a rotina delay se vc já estiver uzando 255 entao vai ter que criar uma outra rotina de atraso de tempo com uma variavel a mais, mas pode ser usada a mesma rotina de delay que o display de lcd usa pra ser inicializado, que funciona...
que linguagem voçe está usando assembly ou c?


Estou programando em C.
Não sei o que quer dizer este "W" :mrgreen:

MensagemEnviado: 09 Jun 2010 09:38
por Sergio38br
Qual o valor do clk que vc colocou nas definições do projeto no mikroC, este usa o valor declarado para calcular os delays.

[ ]'s
Sergio

MensagemEnviado: 09 Jun 2010 09:44
por rflbeck
Sergio38br escreveu:Qual o valor do clk que vc colocou nas definições do projeto no mikroC, este usa o valor declarado para calcular os delays.

[ ]'s
Sergio


Opa!

Acho que resolveu, antes eu havia colocado 8MHz, agora eu coloquei 12MHz (o mesmo valor do Crystal), agora acho que esta funcionando.