monitorando o timer 0.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

monitorando o timer 0.

Mensagempor jmarcelopn » 04 Fev 2010 18:32

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.
jmarcelopn
Bit
 
Mensagens: 44
Registrado em: 27 Out 2006 12:54

Mensagempor Alesandro F Zagui » 04 Fev 2010 20:14

Como voce fez o calculo? Qual a frenquencia de Clock?
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor jmarcelopn » 05 Fev 2010 10:34

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 ; /
jmarcelopn
Bit
 
Mensagens: 44
Registrado em: 27 Out 2006 12:54

Mensagempor Alesandro F Zagui » 05 Fev 2010 12:01

Realmente o calculo esta certo. Tente simular o codigo linha a linha.
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor tcpipchip » 05 Fev 2010 13:42

Teu exemplo só controla um estouro de TMR0

Em um unico estouro voce nao consegue 1ms pausa

T+

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor RobL » 05 Fev 2010 13:52

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor jmarcelopn » 05 Fev 2010 16:25

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.
jmarcelopn
Bit
 
Mensagens: 44
Registrado em: 27 Out 2006 12:54

Mensagempor jmarcelopn » 05 Fev 2010 17:47

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....
jmarcelopn
Bit
 
Mensagens: 44
Registrado em: 27 Out 2006 12:54

Mensagempor tcpipchip » 05 Fev 2010 22:25

Que valor voce colocou para cont ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor tcpipchip » 06 Fev 2010 07:05

cara...o TIMER partindo de 44 até chegar 255 (3Mhz, e pressecaler 16)...nao leva 1 ms :(

Poe 100 na tua variavel cont...

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor RobL » 06 Fev 2010 12:31

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í.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 06 Fev 2010 12:40

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 07 Fev 2010 11:58

Estou interessado em saber como foi solucionado este problema.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x