Moderadores: andre_luis, 51, guest2003, Renie
Mixicus escreveu:...A contagem teria que ser de 10us em 10us.
Exemplo:
Nivel 0 = 2,50ms
Nivel 1 = 10 ms
Assim que a onda entrar em nivel 1, terei que pegar o tempo em que ela ficou em nivel 0 e mandar pro LCD.
#define pino RB0 //ex.
uint captura();
{
...
TMR0IF=TMR1H=TMR1L=0;
TMR1ON=1;
While(pino && !TMR0IF); //timer 0 pra timeout e não travar aqui na ausência de sinal ...ops... nível 0 então !pino.
TMR1ON=0;
return TMR1H*256 + TMR1L; // o 'tempo' está em TMR1H e TMR1L.
}
lpagano escreveu:Mixicus,
Primeiramente seja benvindo ao nosso fórum.
Quanto à sua dúvida essa idéia do timer é boa mas como ele conta ciclos de máquina dividido pelo seu prescaler você teria que pegar o valor do timer ao final do nível 0, tirar do valor inicial (diferença entre início e fim do timer) e multiplicar por um fator que dê o tempo em ms. Aí você quarda esse valor numa variável e o joga no LCD.
O MikroC tem bibliotecas prontas e bem eficientes para trabalhar com LCD
É uma resumo simples mas espero ter ajudado.
Valeu!
RobL escreveu:Quando você altera o valor do OPTION_REG de 5 para 3, está alterando um monte de bits que atuam no prescaler e dependendo do valor do OPTION_REG modifica outras bits em diferentes áreas.
Os 3 primeiros bits tem relação com o prescaler <2,0> <PS2,PS1,PS0>.
Quando o valor está em 5 (0x5) somente o bit zero e o bit 2 estão setados , dando um certo tempo de estouro no seu TMR0. Quando com 3 somente PS0 e PS1 estão setados gerando outro tempo no seu TMR0, bem menor que com 5 (1/16 e 1/64 veja no manual).
Não verifiquei se esta é a causa do problema na sua rotina. Verifique se com 1/16 dá algum problema em sua rotina.
RobL escreveu:Veja lá em cima que eu estava editando quando você escreveu.
Veja se tem relação com pullup.
Na sua rotina você ligou o pullup bit 7.
void interrupt() // Início da rotina de interrupção
{
if(T0IF) // Verifica se a interrupção foi do Timer0
{
T0IF=0; // Se foi, limpa o flag de indicação
if(TMR0==0) // Quando o TIMER0 estourar sua contagem...
{ // ...terá passado 64us x 125 = 8ms
if(TMR0==0) use (TMR0>=0)
RobL escreveu:Como lhe disse, não lí o seu programa, nem notei que esta fazendo a contagem direto pelo tmr0 e o pullup não vai interferir.void interrupt() // Início da rotina de interrupção
{
if(T0IF) // Verifica se a interrupção foi do Timer0
{
T0IF=0; // Se foi, limpa o flag de indicação
if(TMR0==0) // Quando o TIMER0 estourar sua contagem...
{ // ...terá passado 64us x 125 = 8ms
Experimente colocar no lugar de :
- Código: Selecionar todos
if(TMR0==0) use (TMR0>=0)
Deve funcionar. Neste caso o que ocorre é que com o prescaler menor (maior divisão do clock) se passam mais ciclos até o TMR0 sair do zero para 1. Para ficar claro, suponha o prescaler com valor de 1/1. A cada ciclo, após a interrupção, haverá um incremento do TMR0 e até chegar nesta linha na qual o valor do TMR0 é avaliado (se = 0) seu valor já não é zero.
Com uma divisão maior, pelo prescaler, ao testar essa linha, o valor do TMR0 ainda se encontra em zero, quando testado (if TMR0 == 0 ).
Acrescento, não há necessidade desse teste visto que a interrupção já tem esse teste embutido.
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante