Problema com leitura de CCP

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problema com leitura de CCP

Mensagempor sami2 » 26 Jan 2012 16:01

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 ?
sami2
Bit
 
Mensagens: 5
Registrado em: 19 Mai 2011 23:17

Re: Problema com leitura de CCP

Mensagempor andre_luis » 26 Jan 2012 20:45

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Mersin » 27 Jan 2012 15:45

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.
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor sami2 » 27 Jan 2012 23:06

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
sami2
Bit
 
Mensagens: 5
Registrado em: 19 Mai 2011 23:17


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x