por ze » 05 Mar 2008 16:22
1 sugestão:
-timer1 = clock interno
-desligue o timer1 TMR1ON=0;
-zere o timer1 TMR1H=TMR1L=0;
-aguarde a mudança de 0 pra 1 do pino a ser medido a largura. while(RBX);while(!RBX)
-ligue o timer1 TMR1ON=1;
-aguarde o pino ir pra 0. while(RBX);
-desligue o timer1 TMR1ON=0;
-pegue seu valor proporcional à largura em 1 em TMR1H e TMR1L.
Períodos mui longos, use o prescaler do timer1
Solução meia burra (não poderia ser diferente) pois trava se não houver sinal. Implemente um timeout. Ou use a cabeça e tente fazer com o capture mode.
(16F648)
Capture Mode
In Capture mode, CCPR1H:CCPR1L captures the
16-bit value of the TMR1 register when an event occurs
on pin RB3/CCP1. An event is defined as:
• Every falling edge
• Every rising edge
• Every 4th rising edge
• Every 16th rising edge
Não vai querer que eu faça isso pra você tbém, né?
abrç