Página 1 de 1
Problema com leitura de CCP

Enviado:
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

Enviado:
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.
+++

Enviado:
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.

Enviado:
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