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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor fabio_pic » 03 Fev 2009 13:06

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.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro

Mensagempor ffcprog » 03 Fev 2009 13:26

quais as sintomáticas do "não funciona bem".

ffcprog
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fabio_pic » 03 Fev 2009 13:57

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.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro

Mensagempor ffcprog » 03 Fev 2009 14:10

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
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fabio_pic » 03 Fev 2009 14:24

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.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro

Mensagempor ffcprog » 03 Fev 2009 15:04

isso isso
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor fabio_pic » 03 Fev 2009 15:22

OK...

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

Abraços,
Fábio.
fabio_pic
Nibble
 
Mensagens: 81
Registrado em: 03 Set 2007 09:04
Localização: Rio de Janeiro


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x