Página 1 de 1

Problema com leitura de CCP

MensagemEnviado: 26 Jan 2012 16:01
por sami2
PIC16f877
compilador CCS

Quando leio um sinal que quero determinar a frequência, ele lê certinho
Porem, se injeto frequência menor do que 6 Hz ele fica louco, dá valores altos...

Parece que ele estoura o timer1

Alguem sabe como resolver isso para conseguir ler frequencias a partir de 1 Hz ?

Re: Problema com leitura de CCP

MensagemEnviado: 26 Jan 2012 20:45
por andre_luis
sami2,


Os módulos de Captura e Timer em hardware dos microcontroladores têm o objetivo de evitar que o core fique sobrecarregado com processamento.

Quando a frequencia do sinal a ser lido é alta, o acesso ao módulo ocorre em intervalos bem dimensionados pelo programador, e isso libera o programa para fazer outras coisas.

Entretanto, em se tratando de taxas mais baixas, não vejo muito sentido em usar o CCP, e o mais recomendável na minha opinião, seria voce usar a interrupção de I/O, fazendo o cálculo baseado em Time Slot, ou seja, em ciclos pré-programados.


+++

MensagemEnviado: 27 Jan 2012 15:45
por Mersin
Sami2,

O problema é exatamente o que vc apontou - ou seja - o TMR1 está estourando. Isto porque ele tem o tamanho de 16bits, então como vc precisa medir frequências mais baixas, trabalhe com uma variável de 32 bits. Como fazer?

É simples: crie uma variável de 32 bits que guardará toda leitura do CCP (16bits) que será a parte baixa dessa variável, e mais 16 bits que farão a parte alta dessa variável;

Habilite a Interrupção por estouro de contagem do TMR1, e na rotina de Interrupção de estouro do TMR1 você incremente essa variável em 0x00010000, dessa forma, toda vez que o TMR1 estourar quando passa de 0xffff para 0x0000 ele irá para a rotina de interrupção TMR1 e acrescentará à sua variável de 32bits o número 0x00010000 indicando que houve mais um estouro do TMR1.

Quando terminar de ler o seu sinal CCP, você some o valor do CCP lido à variável de 32 bits (que já conterá a parte alta da leitura);

Não se esqueça de Zerar novamente a variável para novas leituras.

Espero ter ajudado.

MensagemEnviado: 27 Jan 2012 23:06
por sami2
Eu não posso usar a interrupção externa porque eu leio 2 sinais ao mesmo tempo um no CCP 1 o o outro no 2

e mesmo porque, ela ja esta sendo utilizada para outro recurso

Mas então, resolvi o problema mudando a ideia..

usando o CCP mesmo, ao inver de medir o tempo entre dois pulsos, passei a contalos

com o timer0 crio uma janela de 250 ms e vejo quantos pulsos deu, dai calculo a frequência

Tá tudo certo já


Mas obrigado por essa ideia do 32 bits, nem tinha pensado
No proximo projeto , que vai ser mais incorporado que esse, vou usar isso

Obrigado