Página 1 de 1
monitorando o timer 0.

Enviado:
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.

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

Enviado:
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 ; /

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

Enviado:
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

Enviado:
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.

Enviado:
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.

Enviado:
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....

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

Enviado:
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

Enviado:
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í.

Enviado:
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.

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