Página 1 de 1

set_timer0(131+get_timer0())

MensagemEnviado: 09 Set 2009 15:13
por fernandor
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

MensagemEnviado: 09 Set 2009 16:52
por tcpipchip
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...

timer0

MensagemEnviado: 09 Set 2009 18:45
por fernandor
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

Re: timer0

MensagemEnviado: 09 Set 2009 23:40
por Renie
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

timer0

MensagemEnviado: 10 Set 2009 13:45
por fernandor
Muito obrigado Rennie pelo esclarecimento.
Qual a diferenca de usar somente set_timer0(131) e set_timer0(131+get_timer0())



Valeu

Fernando

Re: timer0

MensagemEnviado: 10 Set 2009 14:43
por fabim
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

timer0

MensagemEnviado: 10 Set 2009 14:57
por fernandor
supondo que timer0 leu 256 e somou 131. O que vai acontecer? pois como timer0 é de 8 bits so vai ate 256.

obrigado

fernando

MensagemEnviado: 10 Set 2009 15:38
por xultz
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?

Re: timer0

MensagemEnviado: 10 Set 2009 16:19
por fabim
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