Página 1 de 2

Limite da Frequência de Incremento no TMR0

MensagemEnviado: 12 Jul 2013 16:37
por Moreto
Olá Pessoal...
Estou tendo um problema no projeto que estou trabalhando...
Estou usando o Pic 18F1320, e quero usar o TMR0 para contar pulsos externos com ele.
A frequência desses pulsos é de 20Mhz +-, e conto esses pulsos por 1 ms.
Quando uso o TMR1 da certo, mas com o TMR0 não... Tem algum tipo de limite na frequência??
Eu já chequei o prescaler, está de 1:1, o timer está configurado para operar em 16bits...
Se alguém tiver algo a acrescentar eu agradeço...

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 13 Jul 2013 11:45
por MOR_AL
Nos PICs 16F...
Em termos de frequência, o TIMER0 pode medir até cerca de 40Mc/s. Vai depender da frequência do Xtal e da tensão de alimentação do uC.
Outro detalhe é que não conheço um modo de parar a contagem por programação do TMR0 (e do prescaler). Um modo é colocar um pino conectado ao T0CKI e fazê-lo ora como entrada (deixa passar os pulsos), ora como saída em '1' ou '0', para interromper a contagem. Neste caso tem que haver um resistor (geralmente de 470 ohms) para limitar a corrente no pino.
Outro detalhe é que o valor do prescaler não pode ser lido diretamente. Você tem que aplicar pulsos, por meio deste pino extra, e ir contando até que o registro TMR0 se altere. O valor contado é o complemento do valor existente no prescaler.
Não sei se a coisa (TIMER0) muda com os 18F.
MOR_AL

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 13 Jul 2013 14:27
por vtrx
Quando uso o TMR1 da certo, mas com o TMR0 não... Tem algum tipo de limite na frequência??

Oque voce quer dizer com "não da certo",não conta direito ou não ativa nada?

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 15 Jul 2013 09:08
por Moreto
vtrx escreveu:
Quando uso o TMR1 da certo, mas com o TMR0 não... Tem algum tipo de limite na frequência??

Oque voce quer dizer com "não da certo",não conta direito ou não ativa nada?


Então... ele conta... no proteus ele funciona corretamente, conta os pulsos normalmente... Mas quando eu gravo o Pic, e testo no projeto, eu coloquei um gerador de sinal, e ele mediu corretamente até 700KHz.. depois parece que ele se perde de alguma forma, começa a decrementar o valor de frequência... e eu chequei os registros no Proteus, chequei os estados dos registros na placa, acionando pinos que tão sobrando...

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 15 Jul 2013 09:14
por Moreto
MOR_AL escreveu:Nos PICs 16F...
Em termos de frequência, o TIMER0 pode medir até cerca de 40Mc/s. Vai depender da frequência do Xtal e da tensão de alimentação do uC.
Outro detalhe é que não conheço um modo de parar a contagem por programação do TMR0 (e do prescaler). Um modo é colocar um pino conectado ao T0CKI e fazê-lo ora como entrada (deixa passar os pulsos), ora como saída em '1' ou '0', para interromper a contagem. Neste caso tem que haver um resistor (geralmente de 470 ohms) para limitar a corrente no pino.
Outro detalhe é que o valor do prescaler não pode ser lido diretamente. Você tem que aplicar pulsos, por meio deste pino extra, e ir contando até que o registro TMR0 se altere. O valor contado é o complemento do valor existente no prescaler.
Não sei se a coisa (TIMER0) muda com os 18F.
MOR_AL




Que unidade de medida é essa? "40Mc/s" ... ciclos de máquina por segundo?
Então, nos registros do timer0, tem como um jeito de configurar ele para ora contar os pulsos externos e ora não... se deixar configurado para incremento externo, ele vai contar sempre, mesmo que o timer esteja desabilitado, então a solução é deixar configurado para incremento interno, e o timer desabilitado. Ai quando eu quero contar os pulsos externos, eu habilito o timer e mudo a fonte de clock... da certinho...

E o valor do prescaler, eu fiz um teste no programa, no bit que registra a configuração do prescaler, e dependendo do resultado eu acionava um pino extra, assim deu pra saber em voo se a configuração estava correta...

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 15 Jul 2013 12:35
por MOR_AL
Moreto escreveu:
MOR_AL escreveu:Nos PICs 16F...
Em termos de frequência, o TIMER0 pode medir até cerca de 40Mc/s. Vai depender da frequência do Xtal e da tensão de alimentação do uC.
Outro detalhe é que não conheço um modo de parar a contagem por programação do TMR0 (e do prescaler). Um modo é colocar um pino conectado ao T0CKI e fazê-lo ora como entrada (deixa passar os pulsos), ora como saída em '1' ou '0', para interromper a contagem. Neste caso tem que haver um resistor (geralmente de 470 ohms) para limitar a corrente no pino.
Outro detalhe é que o valor do prescaler não pode ser lido diretamente. Você tem que aplicar pulsos, por meio deste pino extra, e ir contando até que o registro TMR0 se altere. O valor contado é o complemento do valor existente no prescaler.
Não sei se a coisa (TIMER0) muda com os 18F.
MOR_AL




Que unidade de medida é essa? "40Mc/s" ... ciclos de máquina por segundo? M = Milhões; c/s = Ciclos por segundo. Diferente de Hz, que refere-se a apenas uma frequência senoidal, c/s refere-se a um sinal periódico (cíclico) podendo até ser senoidal, mas não necessariamente.
Então, nos registros do timer0, tem como um jeito de configurar ele para ora contar os pulsos externos e ora não Sim!... se deixar configurado para incremento externo, ele vai contar sempre, mesmo que o timer esteja desabilitado Como você deixaria ele desabilitado?, então a solução é deixar configurado para incremento interno, e o timer desabilitado. Ai quando eu quero contar os pulsos externos, eu habilito o timer e mudo a fonte de clock... da certinho...
Não! Releia minha postagem anterior.

E o valor do prescaler, eu fiz um teste no programa, no bit que registra a configuração do prescaler, e dependendo do resultado eu acionava um pino extra, assim deu pra saber em voo se a configuração estava correta...
Não entendi sua colocação!

Com o prescaler e TMR0 só dá para contar até 65.535 e não é possível LER o valor do prescaler diretamente .
Para contar mais que 65.535 pulsos é necessário incluir mais registros de propósito geral.
Monitore cada transbordo de TMR0 e incremente o registro, ou registros de mais alta ordem.
MOR_AL

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 15 Jul 2013 13:21
por RobL
Que unidade de medida é essa? "40Mc/s" ... ciclos de máquina por segundo? M = Milhões; c/s = Ciclos por segundo. Diferente de Hz, que refere-se a apenas uma frequência senoidal, c/s refere-se a um sinal periódico (cíclico) podendo até ser senoidal, mas não necessariamente.


Epa, confundiu.
Hertz é o mesmo que Ciclos por Segundos, para qualquer fenômeno periódico (não somente senoidal, Hz).
A questão está somente no sistema de unidades eleito. No Sistema Internacional de medidas, homenageiam Hertz, para a unidade de medida, ciclos por segundos.

Quanto a contagem, ou sua entrada está com capacitância alta formando um filtro passa baixa ou é o que o Mor_All colocou, quanto aos registros mais altos (vai um). Se sua entrada for ST se cair um pouco abaixo de 4V já era, se for CMOS a falta dos pulsos só vai ocorrer abaixo de 2,5V para Vdd = 5V.
Se tiver um scope, veja a forma de onda, acima de 700KHz, na entrada do pic.

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 15 Jul 2013 18:10
por MOR_AL
Tens razão RobL!
Vou passar a usar Hz, então.
Grato pela correção.
MOR_AL

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 16 Jul 2013 09:07
por Moreto
RobL escreveu:
Que unidade de medida é essa? "40Mc/s" ... ciclos de máquina por segundo? M = Milhões; c/s = Ciclos por segundo. Diferente de Hz, que refere-se a apenas uma frequência senoidal, c/s refere-se a um sinal periódico (cíclico) podendo até ser senoidal, mas não necessariamente.


Epa, confundiu.
Hertz é o mesmo que Ciclos por Segundos, para qualquer fenômeno periódico (não somente senoidal, Hz).
A questão está somente no sistema de unidades eleito. No Sistema Internacional de medidas, homenageiam Hertz, para a unidade de medida, ciclos por segundos.

Quanto a contagem, ou sua entrada está com capacitância alta formando um filtro passa baixa ou é o que o Mor_All colocou, quanto aos registros mais altos (vai um). Se sua entrada for ST se cair um pouco abaixo de 4V já era, se for CMOS a falta dos pulsos só vai ocorrer abaixo de 2,5V para Vdd = 5V.
Se tiver um scope, veja a forma de onda, acima de 700KHz, na entrada do pic.



Acho que é exatamente isso... o pino do Timer0 deve estar com uma capacitância, formando um filtro.... engraçado, que o Timer1 não acontece isso...
Vou fazer as análises com o Osc e depois relato aqui os resultados...

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 16 Jul 2013 09:14
por Moreto
MOR_AL escreveu:
Moreto escreveu:
MOR_AL escreveu:Nos PICs 16F...
Em termos de frequência, o TIMER0 pode medir até cerca de 40Mc/s. Vai depender da frequência do Xtal e da tensão de alimentação do uC.
Outro detalhe é que não conheço um modo de parar a contagem por programação do TMR0 (e do prescaler). Um modo é colocar um pino conectado ao T0CKI e fazê-lo ora como entrada (deixa passar os pulsos), ora como saída em '1' ou '0', para interromper a contagem. Neste caso tem que haver um resistor (geralmente de 470 ohms) para limitar a corrente no pino.
Outro detalhe é que o valor do prescaler não pode ser lido diretamente. Você tem que aplicar pulsos, por meio deste pino extra, e ir contando até que o registro TMR0 se altere. O valor contado é o complemento do valor existente no prescaler.
Não sei se a coisa (TIMER0) muda com os 18F.
MOR_AL




Que unidade de medida é essa? "40Mc/s" ... ciclos de máquina por segundo? M = Milhões; c/s = Ciclos por segundo. Diferente de Hz, que refere-se a apenas uma frequência senoidal, c/s refere-se a um sinal periódico (cíclico) podendo até ser senoidal, mas não necessariamente.
Então, nos registros do timer0, tem como um jeito de configurar ele para ora contar os pulsos externos e ora não Sim!... se deixar configurado para incremento externo, ele vai contar sempre, mesmo que o timer esteja desabilitado Como você deixaria ele desabilitado?, então a solução é deixar configurado para incremento interno, e o timer desabilitado. Ai quando eu quero contar os pulsos externos, eu habilito o timer e mudo a fonte de clock... da certinho...
Não! Releia minha postagem anterior.

E o valor do prescaler, eu fiz um teste no programa, no bit que registra a configuração do prescaler, e dependendo do resultado eu acionava um pino extra, assim deu pra saber em voo se a configuração estava correta...
Não entendi sua colocação!

Com o prescaler e TMR0 só dá para contar até 65.535 e não é possível LER o valor do prescaler diretamente .
Para contar mais que 65.535 pulsos é necessário incluir mais registros de propósito geral.
Monitore cada transbordo de TMR0 e incremente o registro, ou registros de mais alta ordem.
MOR_AL



Eu entendi o que você disse.... e eu não preciso contar mais que 25.000 pulsos... porque a minha contagem só dura 1ms... e numa frequência média de 20 MHz, não via passar de 25.000 pulsos...
O que eu fiz para checar o prescaler foi o seguinte: eu testei os registros de configuração do prescaler do TIMER0: "T0CON:PSA" que habilita ou desabilita o prescaler do timer... ai dependendo do resultado eu levantava um pino que estava sobrando, ai com o multimetro dava pra saber se o prescaler estava habilitado ou não....
Mas acho que o que está acontecendo é o que o nosso colega comentou.... o Timer 0 deve estar com uma capacitância no pino de incremento, isso ta criando um filtro..

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 17 Jul 2013 17:03
por RobL
Funciona no Timer1, provavelmente tem entrada TTL . Neste caso o sinal vai ser cortado próximo de 2V.
Já o Timer0 deve ser ST e logo que o sinal cair um pouco abaixo de 4V, já é nível zero (para Vdd = 5V).
Lembre que o problema não está no pino do PIC mas no caminho do seu oscilador (gerador) até o pino. O seu gerador pode estar caindo a amplitude em função da frequência.

Para teste, se o sinal tiver amplitude ajustável, através de um R de 10K, para o pino de entrada do Timer0, quando o sinal for cortado, aumente um pouco a amplitude que deve voltar a contar, para um F mais alta. Pare por ai (em torno de 6V se o Vcc for de 5V), para não danificar a porta. Neste caso é o filtro indesejado que se formou no caminho até o pino, ou comprove com um scope a redução do nível na entrada.

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 17 Jul 2013 20:15
por Silvio51
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 ?

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 18 Jul 2013 09:33
por MOR_AL
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

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 18 Jul 2013 09:48
por RobL
Ler o prescaler, de forma indireta, é um artifício para melhorar a precisão de uma medida no timer. Isto é mais para PiCs sem recursos. Não é necessário em outros chips mais sofisticados.
Por exemplo:
Ocorreu um evento, faz-se a leitura do timer, mas quanto falta para n+1 do timer ?
Suponha o prescaler com 128, quantos clocks faltam para n+1 do timer? Poderia o prescaler (o divisor) esta com metade dos pulsos para n+1. Então temos n + 0,5 ou (n,5).
Pode criar uma rotina de ir clocando o timer e contando até ocorrer n+1 ou o estouro. É como se fosse a parte decimal dos inteiros do timer.
Melhor é ter um timer com os recursos e a precisão necessária para tal tarefa, mas é um recurso para PICs.

Re: Limite da Frequência de Incremento no TMR0

MensagemEnviado: 18 Jul 2013 09:51
por RobL
Caraca! Escrevemos quase ao mesmo tempo!
Já estava respondido pelo Mor_Al