set_timer0(131+get_timer0())

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

set_timer0(131+get_timer0())

Mensagempor fernandor » 09 Set 2009 15:13

pessoal...alguem poderia explicar como funciona esta instrucao?

sobre o timer funcionando como contador de tempo ja consegui entender. Nao estou entendendo esta instrucao

Obrigado

Fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Mensagempor tcpipchip » 09 Set 2009 16:52

Seta o tiver atual com o TICK mais aquele valor...

Algo do tipo 255-131 para inicializar o timer para triggar uma INTERRUPT, por exemplo...
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

timer0

Mensagempor fernandor » 09 Set 2009 18:45

tcpi...seria como uma especie de ajuste fino para minha interrupcao. Tipo escolho um valor entre 0 e 255 para iniciar o timer0 e depois uso uma variavel para incrementar a cada overflow, ex.: cont++ e depois comparo com um valor por exemplo cont==234. seria isso mais ou menos?
Tenho visto alguns programas que ao inves de usarem esta funcao usam simplesmente set_timer0(0). Qual a diferenca???

obrigado
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Re: timer0

Mensagempor Renie » 09 Set 2009 23:40

Olá Fernando,

Esta instrução serve para manter a frequência correta da interrupção
pois sua rotina que irá atender a interrupção também consome tempo,
e nisso, o timer continua contando após o overflow , é usada para
aumentar a precisão da interrupção, principalmente em circuitos de
relógios.

[]'s
Renie
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

timer0

Mensagempor fernandor » 10 Set 2009 13:45

Muito obrigado Rennie pelo esclarecimento.
Qual a diferenca de usar somente set_timer0(131) e set_timer0(131+get_timer0())



Valeu

Fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Re: timer0

Mensagempor fabim » 10 Set 2009 14:43

fernandor escreveu:Muito obrigado Rennie pelo esclarecimento.
Qual a diferenca de usar somente set_timer0(131) e set_timer0(131+get_timer0())



Valeu

Fernando


set_timer0(131)// escreve 131 no TMR0

set_timer0(131+get_timer0())
// pega o valor atual do timer0, soma 131 e escreva no timer0 novamente.

Como timer0, dependendo do uC é de 8 bit´s

Suponha que leu 168, e somou 131
(168 + 131)- 256 = novo valor a ser escrito no TMR0.

Pode parecer sem nexo, mais como o tio renie disse, dependendo do que esta sendo feito, tem N utilizades.

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

timer0

Mensagempor fernandor » 10 Set 2009 14:57

supondo que timer0 leu 256 e somou 131. O que vai acontecer? pois como timer0 é de 8 bits so vai ate 256.

obrigado

fernando
fernandor
Bit
 
Mensagens: 29
Registrado em: 12 Mar 2009 15:01

Mensagempor xultz » 10 Set 2009 15:38

Fernandor, o timer 0 estoura quando ultrapassar de 255, ele volta para zero.
E se a int estiver setada, ele gera uma interrupção e desvia para a ISR.

A questão é a seguinte, suponha que você queira que ele gera uma interrupção exatamente a cada período de tempo (por exemplo, a cada 1ms exatamente) porque você quer fazer um relógio (ou seja, a cada 1000 vezes que entrar na ISR se passou exatamente 1 segundo).
Suponha que para o clock do teu PIC, você configura um prescaler e chega À conclusão que o timer 0 vai contar 125 vezes. Assim, se você setar o timer 0 com o valor 131, ele vai contar 125 vezes até estourar o valor (ou seja, passar de 255 para 0, já que 256-125=131).
Daí você liga o timer zero, seta ele com 131 e espera. Ele vai contar, e quando passar de 255 para 0 vai para a ISR, e se passou exatamente 1ms. O problema é que agora ele só vai estourar de novo após contar 256 vezes, o que dará pouco mais de 2ms. Então, a primeira coisa que você vai fazer na ISR é setar ele com 131, assim ele vai contar mais 125 vezes até cair na ISR de novo.
Assim, teoricamente ele vai cair na ISR a cada 1ms.
Porém, entre ele entrar na ISR e você setar ele com 131 vai ter passado um tempo, afinal desviar para a ISR toma dois ciclos de clock, salvar o contexto mais alguns, e assim por diante. Daí, em vez de levar 1ms ele vai levar 1ms e mais um tiquinho a cada interrupção, e teu relógio já não tem mais a precisão de um Big Ben. Então, o macete é ler quanto o timer0 contou desde que entrou na ISR até você decidir setar o valor dele, e somar este valor com os 131 que você quer. Note que quanto mais você adiciona aos 131, menos tempo o timer 0 leva para gerar interrupção. Se você ler quanto ele contou e somar aos 131 vai descontar exatamente o tempo gasto para tratar a ISR.
Me fiz entender?
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: timer0

Mensagempor fabim » 10 Set 2009 16:19

fernandor escreveu:supondo que timer0 leu 256 e somou 131. O que vai acontecer? pois como timer0 é de 8 bits so vai ate 256.

obrigado

fernando


assim ó.
unsigned 1byte meu_byte

o valor máximo que cabe dentro de um byte é 255...
só que o 0 tambem é um valor, por isso diz-se 256...
0,1,2,3,255 = 256 possiveis valores.

Suponha que, isso to falando de compilador idiota ou em ASM.

meu_byte = 255 + 131
Meu_byte = 131...

255+ 131 = 386. só que dentro de um byte cabe apenas o peso 255, então o valor resultante é a diferença de 255 para o valor montante.

assim como o xultz lhe explicou, existem mais N utilizades.

Cada caso, é uma sentença..

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para PIC

Quem está online

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

x