Página 1 de 1

Ao ligar o timer0 o PIC não funciona bem.

MensagemEnviado: 03 Fev 2009 13:06
por fabio_pic
Senhores,

Eu tenho um código escrito em C e funciona bem até o momento em que eu incluo as linhas que habilitam a interrupção timer0.
Estou usando o 16F877A e é a segunda vez que lido com esse tipo de problema.
Alguém passou por algo semelhante?

Abraços,
Fábio.

MensagemEnviado: 03 Fev 2009 13:26
por ffcprog
quais as sintomáticas do "não funciona bem".

ffcprog

MensagemEnviado: 03 Fev 2009 13:57
por fabio_pic
ffcprog,

Vou tentar explicar. O código capta as leituras do AD, os coloca em memória (62256), endereça essa memória através de shift registers, entre outras coisas.
Bem, numa rotina inicial o PIC coloca "zeros" em todas as posições da memória para assim iniciar o programa em si.
A placa possui um led para cada pino do shift register. Desta forma consigo ver o que está acontecendo durante o funcionamento.
O "não funciona bem" ocorre já na rotina de início (colocar zeros na posição da memória). o endereçamento da memória não ocorre sequencialmente conforme o programado, ou seja, posição 1, 2, 3, 4, 5, 6, ........ . Isso somente ocorre ao colocar as linhas para habilitar o timer0:
enable_interrupts(int_timer0);
setup_timer_0(rtcc_internal|rtcc_div_2);
set_timer0(0);

Vale lembrar que a interrupção serial está funcionando normalmente.

Abraços,
Fábio.

MensagemEnviado: 03 Fev 2009 14:10
por ffcprog
não seria problema no "hitec, CCS ou afins ?"...

não sei como explicar, mais uma vez eu estava me descabelando com um erro ediondo no meu projeto, foi quando eu descobri que a interrupção ficava fodendo a lógica.
Pois uma lenda diz o seguinte.

"quando há uma int, a ULA executa a linha em que está trabalhando, guarda o endereço da proxima execução na pilha, e vai para o vetor de interrupção...

Mais por algum motivo, ele não esta executando a linha a ser executada, ele simplesmente parava de fazer e ia para o vetor.."

PIC16F873....

Utilizei outros dois, e de na mesma. Depois eu fiz alguns testes com o 16f876/877, e o mesmo não aconteceu, ou seja o problema acabou.

Experimente o seguinte, experimente zerar o flag primeiro da int_tmr0, desligar o flag de liga int, preencher as posições com 0, após isto ligue o flag de enble tmr0 int.



ffcprog

MensagemEnviado: 03 Fev 2009 14:24
por fabio_pic
ffcprog
Quando você fala em “zerar o flag primeiro da int_tmr0, desligar o flag de liga int, preencher as posições com 0, após isto ligue o flag de enble tmr0 int. “ quer dizer que devo desabilitar a interrupção e depois ligá-la novamente?

disable_interrupts(int_timer0);
“preencher as posições com 0”
enable_interrupts(int_timer0);

Dessa forma?

Vou testar.
Obrigado.

MensagemEnviado: 03 Fev 2009 15:04
por ffcprog
isso isso

MensagemEnviado: 03 Fev 2009 15:22
por fabio_pic
OK...

Só não entendi o que pode estar errado na estrutura do código. A princípio deveria funcionar.

Abraços,
Fábio.