MOR_AL escreveu:Silvio51 escreveu:MorAl...não é possível LER o valor do prescaler diretamente
Não entendo o por quê de alguém querer ler o "prescaler" do timer... se não somos nós que configuramos ele ? nós que o programamos... para que ler o prescaler ?
Será que está confundindo com o registro de período/contagem ?
Não sei se o VALOR do prescaler do TIMER0 pode ser lido nos PICs18F. Nos 16F o VALOR que ele adquire com a entrada de pulsos (não é o valor programado do divisor 1:, 1:2, 1:4, ...) não pode ser lido.
Ex.:
Digamos que você deseja conhecer a frequência de um trem de pulsos (ou o número de pulsos de um evento).
Você decide usar o TIMER0. Para isso você programa o prescaler para dividir os pulsos que entram (1:256).
Zera o TIMER0, que além de fazer TMR0 = 0, faz também prescaler = 0 (o valor programado "divide por 256" se mantém).
Após um período estipulado por você (e programado no firmware), você quer interromper a contagem do TIMER0 para obter os valores armazenados no prescaler e em TMR0.
Nos PICs16F não dá para interromper a contagem do TIMER0. Você usa um artifício. Coloca um pino conectado a RA4. Para habilitar a contagem, você faz esse outro pino ser ENTRADA. Para desabilitar a contagem, você faz esse outro pino virar SAÍDA (em '1' ou '0'). Para não queimar esse pino tem que haver um resistor entre o sinal de entrada e este pino.
Agora que você interrompeu a contagem, precisa conhecer o valor de prescaler e o de TMR0.
O do TMR0 é só ler diretamente, mas o valor contido em prescaler não está disponível para leitura.
Para conhecer este valor você aplica pulsos de entrada via este outro pino, configurado como saída, que está conectado ao pino RA4. Para cada pulso aplicado você incrementa um registro de propósito geral (GPR) e monitora o valor do TMR0. Quando o valor do TMR0 se altera, significa que o valor do prescaler atingiu 256 ou zero, o valor do registro GPR vai conter o complemento (a 256) do valor original desejado, do prescaler.
O TIMER0 virou um contador de dois bytes, porque você usou o registro prescaler como um dos bytes.
Aí você diz:
"Pô! eu poderia usar outro timer para isso e nem precisaria do segundo pino para interromper a contagem!"
Correto, mas a entrada via RA4 consegue ler pulsos com uma taxa de até uns 40 ou 50MHz.
MOR_AL
//*************************************************************************************************************************************************************************************************
Agora eu entendi o que você quis dizer... Eu não consigo ler o valor que está entre a entrada do prescaler e a saída dele... quantos pulsos falta ainda para ele dar um incremento na saida... mas isso não é problema no meu caso. Pois eu configuro a divisão como 1:1... pois o Timer0 na família 18F pode ser de 16 bits, então em 1ms eu consigo registrar a quantidade de pulsos na minha entrada, que dá lá os 20.000.... E na 16F eu não sei, mas ná 18, eu consigo por software desabilitar a contagem do Timer... basta desabilitar o timer, que por si só não é o suficiente, pois ele vai continuar incrementando com os pulsos externos, mas quando eu mudo a fonte de clock dele, para incrementar com os ciclos de máquina, e o timer está desabilitado, ele para de incrementar.... então eu consigo fazer o incremento do timer somente quando eu quero sem usar outro pino...
E eu levantei a questão do prescaler, porque eu pensei que em voo talvez a configuração do prescaler tivesse mudando, deixando em 1:2, 1:4 talvez... por isso que eu fiz meu software testar a configuração da divisão... o que estava certo.....