Página 1 de 1

monitorando o timer 0.

MensagemEnviado: 04 Fev 2010 18:32
por jmarcelopn
Boa noite. Estou fazendo uma rotina para contar um certo tempo utilizando o timer 0 no PIC12F675. sem gerar interrupção.

a minha função em MikroC ficou assim:

void delay(unsigned int cont)
{
do
{

INTCON.T0IF = 0; // Zera flag de overflow.

OPTION_REG.T0CS = 0; // Escolhe clock interno.
OPTION_REG.PSA = 0; // habilita preescaler para o Timer0.
OPTION_REG.PS2 = 0; // 011 divide por 16.
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;

TMR0 = 0x44; // Valor carregado para contagem de 1ms.
while (!T0IF); // Espera finalizar a contagem.
cont = cont -1;
}
while (cont > 0);
}


A duvida é o seguinte. Fiz os calculos desse timer para 1ms. Mas o que vejo no osciloscopio é a contagem de 10us. Alguem sabe porque?

Sera que eu errei na conta?

OBrigado.

MensagemEnviado: 04 Fev 2010 20:14
por Alesandro F Zagui
Como voce fez o calculo? Qual a frenquencia de Clock?

MensagemEnviado: 05 Fev 2010 10:34
por jmarcelopn
ola Alesandro,

Fiz da seguinte forma

O clock é um cristal de 12 Mhz. (Cristal externo).


TMR0 = 256 - ( 1ms / ( 1 / ( fosc /4 ) ) / DIV. )

DIV => PS2 = 0 ; ps1= 1; ps0 = 1 => 16.
fosc = 12Mhz.


TMR0 = 256 - (1ms / (1/ (12M/4) ) /16 )

TMR0 = 256 - 187,5

TMR0 = 256 -187 = 68

TMR0 = 0x44 .


Ainda usei o PicMultiCalc pra conferir :

http://www.picbasic.co.uk/forum/attachm ... 1162909841

Fiz a configuracao para o TIMER1 tbm. E na contagem habilitei a interrupção. Ficou certinho.

muito

Estranho ; /

MensagemEnviado: 05 Fev 2010 12:01
por Alesandro F Zagui
Realmente o calculo esta certo. Tente simular o codigo linha a linha.

MensagemEnviado: 05 Fev 2010 13:42
por tcpipchip
Teu exemplo só controla um estouro de TMR0

Em um unico estouro voce nao consegue 1ms pausa

T+

TCPIPCHIP

MensagemEnviado: 05 Fev 2010 13:52
por RobL
Seu erro não pode ser de 100X, desde que o tmr0 esteja setado dividindo por 16 e carregando com 0x44.
Veja se não há algo setado errado no seu scope, ou se enganou com a escala.
Não pegou o cristal errado ? Verifique o valor do cristal.

Ahhhh! Você colocou para cada estouro, porta baixa, no outro porta alta?
Se não, você deve estar lendo algum glitch a cada estouro.
Se a cada estouro tiver L e no outro H, você vai ver um ciclo com 2ms.

MensagemEnviado: 05 Fev 2010 16:25
por jmarcelopn
tcpipchip

Nao entendi o que você disse. Em um unico estouro? Como assim ?
Acha que dentro de uma contagem eu não consigo atingir o valor de 1ms? mas entao meus calculos deveriam estar errados não?

RobL

Eu realmente medi 10us. Medi na saidas dos pinos como você disse. e na minha medida contei 20us. 10us em nivel alto e 10us em nivel baixo.


Vou fazer um teste. Vou habilitar a interrupção do timer0 pra verificar se ele conta corretamente.

Obrigado.

MensagemEnviado: 05 Fev 2010 17:47
por jmarcelopn
Shit..... coloquei para ativar interrupção. e nada

A resposta continua fixa em 10us.

Mudei o tempo para contar 10ms. ao invez de 1...

Continua 10us.


Troquei o PIC e nada...

Continua 10us.

Eu não sei o que eu to fazendo de errado com esse timer...

Sera que eu mudo o pino de saida? O duro é que eu fiz a mesma coisa com o Timer1 ("setando" para contar no valor que eu queria) e funcionou.

Que droga....

MensagemEnviado: 05 Fev 2010 22:25
por tcpipchip
Que valor voce colocou para cont ?

MensagemEnviado: 06 Fev 2010 07:05
por tcpipchip
cara...o TIMER partindo de 44 até chegar 255 (3Mhz, e pressecaler 16)...nao leva 1 ms :(

Poe 100 na tua variavel cont...

TCPIPCHIP

MensagemEnviado: 06 Fev 2010 12:31
por RobL
Tem como medir a forma de onda do oscilador ?
Se estiver quadrada (saturada) o oscilador está setado errado e pode estar dando subharmônicas no cristal. Neste caso mude o oscilador para menor ganho, ou terá que colocar resistores esternos no circuito do cristal.

Experimente usar XT em vez de HS para o oscilador e teste. Se partir, deve dar certo, se não partir, verifique a forma de onda, deve ser senoidal. Ajuste somente com R esterno.
No sufoco, troque o cristal e teste.

Bom. Isto se nada estiver setado errado (penso que não).

Se não estou errado supondo 3Mhz bombeando o timer temos :
P = 3,33us (período)
estouro contegem = 16 x 256 x 3,33us= 1,36ms (ordem de grandeza esperada).
Partindo de 0x44 chega praticamente a 1ms.
Não vejo erro aí.

MensagemEnviado: 06 Fev 2010 12:40
por RobL
Lembrei de outra história:
Há um tal bug do silício na linha microchip na qual há um "work around" nos manuais:
Não me recordo mais. O Timer terá que ser recarregado dentro de x cilclos de máquina, imediatamente após o estouro, se não ...

O mais recomendado para recarga é usar o Timer 2. Pois ele faz isto automaticamente dentro do tempo previsto, mesmo com interrupção. Carrega por hardware. Dá um tempo mais exato.

MensagemEnviado: 07 Fev 2010 11:58
por RobL
Estou interessado em saber como foi solucionado este problema.