Ir ao conteúdo
  • Cadastre-se

Qual a diferença entre:TIMER0,TIMER1,TIMER2,TIMER3,TIMER4?


avinicius

Posts recomendados

Eai pessoal beleza?

Ja fiz aplicações utilizando só o timer0,mas alguém ja utilizou esses outros?

Quais são as diferênças de um para outro?aplicações.

Mais uma pergunta, o preload de um timer serve para pré setar ele com um valor???

obrigado desde ja , continuo pesquisando aqui , obrigado.

Link para o comentário
Compartilhar em outros sites

Cada Timer é um circuito dentro do microcontrolador que funciona de forma independente.

As diferenças entre eles são em relação ao número de bits, opções de prescaler e postcaler e quais periféricos são por eles comandados.

O prescaler não é para setar um determinado valor, mas, sim, para fazer com que o timer seja incrementado a partir de múltiplos do sinal de clock.

Você seta um determinado valor no próprio timer.

O postcaler serve para que o efeito produzido pelo estouro do timer ocorra somente depois de determinado número de estouros.

Link para o comentário
Compartilhar em outros sites

Exato, mas preste atenção a um detalhe.

No exemplo que você postou, imagine que o PIC esteja utilizando um cristal de 4Mhz. Então nesse caso, o clock interno (RTCC_Internal) será o Clock/4, ou seja: 1 Mhz.

No entanto você está usando o RTCC dividido por 64. Dessa forma o TIMER0 irá rodar a 1Mhz/64=15625hz. Isso nos dá um período de 1/15625=64uS (micro-segundos).

Vamos lá:

O TIMER0 é um timer de 8bits, ou seja, ele conta de 0 a 255. Dessa forma ele leva 256*64uS=16.38mS para estourar usando o divisor por 64. E toda vez q ele "estourar", gera uma interrupção q pode ser usada p fazer alguma coisa.

No caso do preload, sim você tem razão. Talvez para a aplicação que você esteja interessado, você não precisa que o TIMER conte todos os valores até estourar. Então, você seta ele com um valor inicial. Para isso, você precisa fazer umas continhas, mas não é nada do outro mundo.

Dúvidas, pergunte!

Falou

Link para o comentário
Compartilhar em outros sites

No exemplo que você postou, imagine que o PIC esteja utilizando um cristal de 4Mhz. Então nesse caso, o clock interno (RTCC_Internal) será o Clock/4, ou seja: 1 Mhz.

Eai Matheus beleza?

Sim entendi este primeiro trecho.Onde,se no momento utilizo um XTAL a 4mhz o clock interno dele é em nível de máquina , onde dividimos por 4 ,sendo assim acharemos sua frequência interna,como você disse é :

(RTCC_Internal)

Ou seja,para acharmos o valor RTCC_Internal,"frequência interna",é: valor XTAL/4=Fi

Onde:XTAL=cristal,valor dado em HZ

4=constante

Fi=frequência interna

Então nesse exemplo acima será:

4000000/4=1000000hz ou 1MHZ.

Se utilizamos então (RTCC_DIV_32);

então: para acharmos a frequência do timer0 será:

Ft0=frequência do timer0

Fi=frequência interna,ciclo de máquina

RTCC_DIV_X

então teremos o seguinte:

Ft0=Fi/RTCC_DIV_X

Ft0=1000000/32

Ft0=31250hz

Agora,eu não entendi esse negócio de período direito,deu para confundir bem com o estouro....?

mas até ai deu para ter uma lógica,mas e quando eu faço isso:

set_timer0(500);

porque que em alguns programas,eles carregam o timer com esse valores?

500,3036.........?

valeu

Link para o comentário
Compartilhar em outros sites

  • 5 meses depois...

Oi pessoal, li o tópico aqui e não sei se assimilei direito (talvez seja o sono, são 00:23) Mas gostaria de fazer uma pergunta:

Posso usar o timer0 ou timer1 pra fazer contagens de tempo maiores tipo 10 segundos?

porque não uso o timer e o programa sempre fica empacado naquela delay... por isso quero aprender a usar os TIMERs

Por exemplo, se eu tenho um cristal de 20MHz

como seria a configuração pra 1 segundo? e pra 2 segundos? 3 segundos.......

Link para o comentário
Compartilhar em outros sites

[OFF-TOPIC]: Aeeeeeeee POST DE NÚMERO 1000!!!!!!![/OFF-TOPIC]

Bem, vamos lá:

Seguinte, seguindo o mesmo raciocínio ali de cima:

você usa um cristal de 20Mhz. Então o PIC trabalha internamente a 5Mhz.

Imaginando que vamos utilizar o TIMER1 com prescaler de 8, então fica:

O TIMER1 irá correr a 5Mhz/8=625000hz

Temos a frequência, para ter o período, calculamos o inverso da mesma, sendo 1/625000.

Isso nos dá o valor de 1.6uS (micro-segundos).

Ou seja, esse tempo é o gasto para cada incremento do TIMER1.

Sabemos que o TIMER 1 é um contador de 16bits, ou seja, ele conta de 0 até 65535 e volta para o 0 (65536 incrementos). Dessa forma, vamos calcular qual o tempo máximo que o TIMER1 gera com clock de 20Mhz.

Temos a seguinte regra de três:

1 incremento----------------->1.6uS ou 0.0000016 segundos

65536 incrementos-----------> X

Isolando o X, temos que X=65536 * 0.0000016

Portanto, o TIMER1 consegue gerar um tempo máximo de 0.104 segundos.

Mas e se eu quiser 1 segundo? Simples, veja:

Como o TIMER 1 está gerando um tempo "quebrado", vamos calcular quantos incrementos ele leva para gerar 0.1 segundos. Fica:

1 incremento ----------------> 0.0000016 segundos

X incrementos---------------> 0.1 segundos

Isolando o X, temos que X = 62500 incrementos.

Ou seja, o PIC precisa incrementar o TIMER 1 62500 vezes para gerar 0.1 segundos.

Como o TIMER 1 vai até 65536, subtraímos o valor anterior desse, assim:

Timer 1 começa a contar em 65536-62500, ou em 3036!

Esse valor é o preload.

Certo, já fizemos as contas para gerar 0.1 segundos. Ora, se ele gera 0.1 segundos, para gerar 1 segundo, apenas deve gerar 0.1 segundos 10 vezes!!!!! Ou seja, 10*0.1=1! Uau!!!!

Mas como tudo isso fica no PIC?

Fiz um exemplo:

Circuito:

teste_timer_1.png

Código:

#include <16F877A.h>            //O PIC utilizado, obrigatório!

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES HS //Crystal de oscilação > QUE 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=20000000) // Definição do clock utilizado. Obrigatório!

int16 q=0; //Variável que incrementa a cada 0.1s dentro da interupção do timer1.

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
if (q==10)
{
q=0;
output_toggle (PIN_B0);
}
set_timer1 (3036); //Preload do Timer1
}

void main()
{
output_low (PIN_B0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE);
}

O led deve piscar em intervalos de 1 segundo.

Fica como exercício descobrir como fazer o atraso de 2 e 3 segundos!

Falou

Link para o comentário
Compartilhar em outros sites

[OFF-TOPIC]: Aeeeeeeee POST DE NÚMERO 1000!!!!!!![/OFF-TOPIC]

MatheusLPS, parabéns! pelo Tópico 1000 !!! :D com certeza foram 1000 ajudas para iniciantes como eu....

Com certeza esse post n° 1000 foi especial, rsrs é quase um tutorial completo de TIMER... rsrs

Vou estudar direitinho aqui e fazer o exercício... rs

Brigadão ai

Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...
[OFF-TOPIC]: Aeeeeeeee POST DE NÚMERO 1000!!!!!!![/OFF-TOPIC]

Bem, vamos lá:

Seguinte, seguindo o mesmo raciocínio ali de cima...^_^

Boa noite Matheus, programo em assembly pelo menos o básico, não conhecia absolutamente nada em linguagem C, recententemente li muitos tópicos em que você tira dúvidas de outras pessoas, desta maneira eu fui aprendendo a programar em C, estou utilizando o CCS PCW que você também utiliza para facilitar, já realizei até alguns projetos em C, e já utilizei muitos projetos que você postou para a galera aqui e fico bastante agradecido, enfim rsrsrs...

No caso acima você detalha o funcionamento e cálculos referentes ao TIMER 1, porém o que eu gostaria de saber é a respeito do TIMER 2, porque na maioria dos projetos que vejo na net o timer 2 é utilizado para auxiliar o PWM e não o TIMER 0 e/ou TIMER 1?

O TIMER 2 seria de 8 bits ou 16 Bits?

E os cálculos do TIMER 2 são baseados nos mesmos padrão do TIMER 0 (8 Bits, conforme você citou) e TIMER 1 (16 Bits, conforme você citou)?

Fico muito agradecido com a ajuda Matheus, se possível!

Link para o comentário
Compartilhar em outros sites

O Timer 2 é um timer de 8 bits. E o Timer 0 também é de 8 bits.

O processo de cálculo é semelhante ao do Timer1, só que em vez de você usar o numero 65536 ( 16 bits ) use o numero 256 ( 8 bits ).

Aproveitando :

Matheus, esse seu post 1000 realmente foi 10 cara, parabéns pela elucidação !

Paulo

Link para o comentário
Compartilhar em outros sites

O Timer 2 é um timer de 8 bits. E o Timer 0 também é de 8 bits.

O processo de cálculo é semelhante ao do Timer1, só que em vez de você usar o numero 65536 ( 16 bits ) use o numero 256 ( 8 bits ).

Paulo

Boa noite Paulo, muito obrigado pelas informações, foi de grande utilidade, inclusive baixei sua apostila para aprender a programar AVR, muito obrigado ^_^

Lipextreme, veja a resposta do colega Aphawk.

Apenas 1 detalhe. No caso específico do PWM, o cálculo é bem diferente.

Se você estiver com dúvidas nesse aspecto, veja esse tópico:

http://forum.clubedohardware.com.br/motor-pwm-pic/857314

Falou

Matheus o tópico é sensacional, sanou muitas dúvidas minhas, só para finalizar gostaria de fazer uma última pergunta, no tópico que você passou durante a discussão a uma frase onde diz-se que o PWM configurado com o TIMER 2 varia a frequencia de 0 a 100% (0 a 255)! Se eu configura-se o PWM com o TIMER 1 eu conseguiria variar de 0 a 100% (0 a 65535) ou seja em uma resolução maior?

Link para o comentário
Compartilhar em outros sites

Opa Lipextreme, legal, espero que se divirta com ela e passe a ser um feliz usuário desses fantásticos microcontroladores !

Quanto à sua dúvida, você mesmo advinhou ! ( corrigindo : 10 bits apenas pro PWM no Timer1 )

A resolução do PWM passa a ser de 10 bits no Timer1, assim o step fica menor e você consegue gerar pulsos mais precisos.

Aliás, só como comentário, os timers dos Pic e dos Avrs são muito parecidos, assim como os conversores AD, geração de PWM, interrupts, e logo você vai perceber que os dois processadores diferem muito pouco em termos funcionais. ( nos Atmega todos os timers geram 2 canais de PWM independente, totalizando 4 de 8 bits e 2 de 16 bits ).

Se você dominar o hardware interno de um, nem vai perceber a mudança para outro.

Paulo

Link para o comentário
Compartilhar em outros sites

Opa Lipextreme, legal, espero que se divirta com ela e passe a ser um feliz usuário desses fantásticos microcontroladores !

Quanto à sua dúvida, você mesmo advinhou !

A resolução do PWM passa a ser de 16 bits no Timer1, assim o step fica muito menor e você consegue gerar pulsos muito precisos.

Aliás, só como comentário, os timers dos Pic e dos Avrs são muito parecidos, assim como os conversores AD, geração de PWM, interrupts, e logo você vai perceber que os dois processadores diferem muito pouco em termos funcionais.

Se você dominar o hardware interno de um, nem vai perceber a mudança para outro.

Paulo

Muito obrigado Paulo, consegui entender legal o conceito desses timers agora, poxa interessante quanto aos Avrs serem tão parecidos com o pic, já vou começar a aprender a linguagem Basic que você utiliza nos Avrs o mais rápido possível, pois achei ela menos complexa e mais vantajosa do que as demais, novamente muito obrigado pelas informações e também pelo belo trabalho com os Avrs no tutorial que criou.

Problema Resolvido.

Link para o comentário
Compartilhar em outros sites

Bem lembrado, Matheus, eu passei batido , já não uso os Pics fazem uns dois anos e acabei engolindo esse sapo....

Mais um ponto positivo para os Atmega ( AVR ) : cada Timer pode gerar 2 canais de PWM independentes, totalizando 6 canais de PWM por hardware, sendo dois deles de 16 bits de resolução.

Paulo

Link para o comentário
Compartilhar em outros sites

Detalhe: PWM via hardware só aceita o timer2 e 10 bits de resolução, ou seja, 1024 steps.

Alguns pics mais novos aceitam o timer3.

Usando o timer1, até onde sei, somente via software.

Falou

Importantíssima essa informação para mim, novamente fico muito agradecido com a ajuda Matheus, vou tentar realizar o teste então utilizando 10 bits, pelo menos a resolução já é um pouco maior do que a de 8 bits né!

Agora que conheço um pouco mais sobre os timers do pic, depois da explicação de você e do Paulo, vou pesquisar um pouco mais sobre esse timer 3 utilizado em alguns pics, muito obrigado Matheus!

Link para o comentário
Compartilhar em outros sites

Seguinte, seguindo o mesmo raciocínio ali de cima:

você usa um cristal de 20Mhz. Então o PIC trabalha internamente a 5Mhz.

Imaginando que vamos utilizar o TIMER1 com prescaler de 8, então fica:

O TIMER1 irá correr a 5Mhz/8=625000hz

Temos a frequência, para ter o período, calculamos o inverso da mesma, sendo 1/625000.

Isso nos dá o valor de 1.6uS (micro-segundos).

Ou seja, esse tempo é o gasto para cada incremento do TIMER1.

Sabemos que o TIMER 1 é um contador de 16bits, ou seja, ele conta de 0 até 65536. Dessa forma, vamos calcular qual o tempo máximo que o TIMER1 gera com clock de 20Mhz.

Temos a seguinte regra de três:

1 incremento----------------->1.6uS ou 0.0000016 segundos

65536 incrementos-----------> X

Isolando o X, temos que X=65536 * 0.0000016

Portanto, o TIMER1 consegue gerar um tempo máximo de 0.104 segundos.

Mas e se eu quiser 1 segundo? Simples, veja:

Como o TIMER 1 está gerando um tempo "quebrado", vamos calcular quantos incrementos ele leva para gerar 0.1 segundos. Fica:

1 incremento ----------------> 0.0000016 segundos

X incrementos---------------> 0.1 segundos

Isolando o X, temos que X = 62500 incrementos.

Ou seja, o PIC precisa incrementar o TIMER 1 62500 vezes para gerar 0.1 segundos.

Como o TIMER 1 vai até 65536, subtraímos o valor anterior desse, assim:

Timer 1 começa a contar em 65536-62500, ou em 3036!

Esse valor é o preload.

Certo, já fizemos as contas para gerar 0.1 segundos. Ora, se ele gera 0.1 segundos, para gerar 1 segundo, apenas deve gerar 0.1 segundos 10 vezes!!!!! Ou seja, 10*0.1=1! Uau!!!!

so não entendi essa conta aqui,

1 incremento ----------------> 0.0000016 segundos

X incrementos---------------> 0.1 segundos

alguem poderia me explicar de uma forma mais clara!! a de 1 segundo

Link para o comentário
Compartilhar em outros sites

so não entendi essa conta aqui,

1 incremento ----------------> 0.0000016 segundos

X incrementos---------------> 0.1 segundos

alguem poderia me explicar de uma forma mais clara!! a de 1 segundo

Multiplique o X pelo 0,0000016, ou seja :0,0000016X

Depois multiplique 1 pelo 0,1 ou seja: 0,1

Logo, divida 0,1 por 0,0000016

e terá: 62500

Uma forma de explicar a geração de 1 segundo é a seguinte, sabemos que para gerar 0,1s temos que realizar 62500 incrementos, certo?

Com isso iniciamos a contagem a partir do incremento 3036, ou seja (65536 - 62500), para que ele conte exatos 62500 incrementos, ao final teremos exatamente 0,1s!

Por fim você multiplica 0,1s X 10 (Contando 10x no programa) e assim teremos 1s!

Basicamente eu falei tudo o que o Matheus já havia explicado anteriormente!

Espero ter ajudado merlin ^_^!

Link para o comentário
Compartilhar em outros sites

????????????????????

MatheusLPS, sinceramente, não entendí sua colocação!?!?!?

Agricio

Agrício, desculpe a demora na resposta. Bom, o Timer2 é usado como base de tempo para geração de PWM via hardware do PIC. Nesse caso, o valor máximo que conseguimos colocar como duty-cicle é de 1024. Nesse caso, temos de 0 a 1024 passos de incremento do duty-cicle. Sendo que 2 elevado a 10 é 1024, por isso disse que é 10 bits.

Caso você deseje obter mais passos para o duty cicle, terá que realizar o PWM via código, usando interrupção. Se a frequencia for muito alta, a quantidade de passos diminui. Aí tem que encontrar um meio termo que satisfaça alguma aplicação específica.

@merlin: O colega lipextreme já explicou.

Falou

Link para o comentário
Compartilhar em outros sites

você usa um cristal de 20Mhz. Então o PIC trabalha internamente a 5Mhz.

Imaginando que vamos utilizar o TIMER1 com prescaler de 8, então fica:

O TIMER1 irá correr a 5Mhz/8=625000hz

Não é assim que se calcula o ciclo de máquina!

De uma olhada no link:

- Calculo correto do cilco de máquina do PIC

Link para o comentário
Compartilhar em outros sites

No datasheet do PIC teremos a informações,por exemplo,na página 47 do datasheet do 16F628,podemos ler que o registrador do TIMER é incrementado a cada Cilco de máquina,assim calculando corretamente podemos saber exatamente a temporização.

O TIMER é alterado a cada cilco de máquina independentemente de quantos forem, o tempo será calculado pelo ciclo.

Um PIC com 20MHZ tem um cilco de máquina de 200ns(0.2µs).

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...