Problema com CCP e Timer0

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problema com CCP e Timer0

Mensagempor silvio_at » 24 Jun 2007 19:16

Olá a todos.

Estou tendo um problema com o módulo CCP e Timer0 num 16F877. Eu estou achando isso estranho e gostaria de ajuda para exclarecer o que esta acontecendo.

O CCP1 esta configurado no modo de captura, o Timer1 com prescaler de 1:8 e o clock é de 4MHz (cristal).
Uso a interrupção do CCP1 para obter o valor do periodo.
Também habilitei a interrupção do timer0 e quando ela ocorre eu preciso alterar o valor dele para 130.
Quando deixo a linha: set_timer0(130); da o maior pau com o módulo CCP1.
Se eu tirar a linha, tudo ok.

Depois de algum tempo pensando, resolvi analisar o bit CCP1IF e vi que após a linha set_timer0(130); ele estava setado. Limpando este bit antes de sair da interrupção do Timer0 tudo voltou ao normal, aparentemente.

Alguem conseguiria me explicar o porque isso está ocorrendo?
Uso o CCS e estou simulando no Proteus 6.7.

Obrigado, abraço.
silvio_at
 
Mensagens: 4
Registrado em: 19 Abr 2007 23:22

Mensagempor leoabubauru » 25 Jun 2007 14:53

Silvio:
Compilei algumas linhas de teste usando o que você descreveu. No disassembly listing gerado aqui, após set_timer0(130) aparece um "bcf" limpando o flag de estouro do TIMER0 (e não do CCP1 como você encontrou no seu). Isso é default no CCS, pois trata do reconhecimento de um evento de overflow. Ele faz isso com todas as interrupções, limpando o flag ao final da rotina de tratamento.

Se seu CCS está gerando um "bsf" no lugar de "bcf", sugiro que atualize a sua versão. Pois se isso acontecer no CCP1, assim que você habilitar a interrupção acontecerá uma falsa interrupção provocando erros indesejados.

Ceritfique-se que o código gerado seja esse mesmo...
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor silvio_at » 25 Jun 2007 19:56

Obrigado leoabubauru pela resposta.

O CCPIF está setado após a linha set_timer0(130); e isso é dentro da interrupção do timer0 e não do módulo CCP. Ta, isso realmente poderia acontecer, mas o fato é que tirando a linha set_timer0(130); o problema não aparece.

Bom, estou simulando no Proteus e ele sempre funcionou muito bem aqui. Espero que não seja ele o causador do problema.

Se alguem tiver algum hardware e puder simular algo semelhante, ficarei grato.
O programa captura o periodo de pulsos no CCP1 e tem a interrupção do timer0 habilitada. Clock 4MHz, PIC16F877, prescaller de 1:8 no timer1 e 1:8 no timer0.

Abraço.
silvio_at
 
Mensagens: 4
Registrado em: 19 Abr 2007 23:22


Voltar para PIC

Quem está online

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

x