timer com PIC

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

timer com PIC

Mensagempor edybahia » 24 Jan 2012 12:48

Pessoal estou aqui tentando enteder como funciona os timer com PIC, preciso enteder como setar um código para que por exemplo durante 1 segunda acenda o led e logo após apague este led

alguem pode me dar ajuda, caso tenham exemplo fico agradecido
::: EDY
edybahia
Bit
 
Mensagens: 15
Registrado em: 23 Abr 2009 09:25

Mensagempor edybahia » 24 Jan 2012 13:36

pessoal estou utilizando o pic 16f628a, com o compilador ccs c
::: EDY
edybahia
Bit
 
Mensagens: 15
Registrado em: 23 Abr 2009 09:25

Mensagempor fabim » 24 Jan 2012 14:04

maninho quando eu estava aprendendo sobre timer's do pic eu sofri, por não entender os conceitos de funcionamento de um relógio digital comum.

Como você deve saber, o tempo é algo contável de alguma forma, seja por engrenagens, luz do dia e noite, água areia. Mas tudo tem algo em comum !!! Números..

1 segundo é igual ao quê em sua concepção ?
1 segundo pode ser uma fração de algum tempo, ou um valor elevado E10+9 por exemplo.

Más então no mundo digital o que é o tempo ?
R- O tempo é apenas números... Ao inverso de um numero de vezes que algo acontece dentro de 1..

Por exemplo. Tu sabe que um cristal ressoa a 32767-X por segundo. Algum fabricante tem uma base de tempo de 1 segundo muito preciso e contou dentro disto 32767 oscilações do cristal.

Ou seja. para nosso um segundo o nosso numero é de 32767 + 1."+1 não vou explicar se vira".

Bom excluindo detalhes sórdidos.

Veja, qual o numero de bits necessários, para acomodar o valor 32768 ?
R-15 bits
Como você sabe, o pic tem um contador de 16 bits, isso quer dizer que ele conta até o dobro de 32678, ou seja 65536+1.

Bom, se sabemos que, nosso valor numérico para um segundo é de 32768, e temos um contador que conta o dobro disso, quantos segundos nós temos ??
R-2 segundos.

Lembrando que: No pic podemos gerar um sinal dizendo ao programa que o timer estourou e voltou a zero. Este sinal pode ser usado de inúmeras formas possíveis.
Por exemplo por interrupção.

Seguindo a linha de raciocínio.
Bom, sei que tenho algo que comporta 65537 e está para 2, e tenho 32768 que esta para 1.
Como posso utilizar meu numero para gerar uma interrupção a cada 1 segundo ao invés de 2 segundos ?
Fácil !!
O timer é acessível para escrita e leitura. CORRETO !!
E se, nós manualmente colocarmos dentro do timer o valor 32768 ? eim eim ?
Entenda.
Você demora 2 minutos para encher um recipiente de 2L usando 1 de um litro!!
Você coloca 1 litro no recipiente de 2 litros, dispara o contador e coloca só mais um litro. Quando tempo demorou ?
R- 1 minuto !!!

Chamamos de reload!!

Quando acontece a interrupção, você coloca um valor tal no contador de tempo, que a diferença deste valor colocado, até o máximo valor que o contador alcança gere a interrupção pela seu valor matemático de tempo!!

EX:

Quero que meu contador de 16 bits, gere uma interrupção a cada 500mS, meu valor matemático para o tempo de 1 segundo é de 32768.
1 segundo está para 32768.
1/2 segundo esta para 32768/2.

65536 fundo - 16384 nosso valor matemático para 1/2 segundo = 49152.

Quando interromper, você carrega o timer com o valor do resultado. O resultado do calculo acima mais 16384 que esta para meio segundo, é igual a 65536, que irá gerar outra interrupção.

Resumindo, tempo de meio segundo.

Agora como encontrar nosso valor matemático para 1 segundo ?

1 = frequência do cristal do pic / 4.

EX: 4mhz / 4 = 1 mhz!!

Fabim, nossa, 1mhz ?
Não cabe dentro de 65536 vai estourar um monte de vezes por segundo!!!

Para isto existe um divisor antes do timer, chamado preescaler !!
Ele pega este 1mhz, e divide por 2,4,8,16,128 por exemplo.

Seu valor matemático para um segundo é 1.000.000, se usar o preescaler dividindo por 16 por exemplo.
Seu valor matemático novo que é a base de um segundo fica.
1000000/16 = 62500 !!!!

Bom, já deu para você entender né ?
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!!!?

Mensagempor xultz » 24 Jan 2012 14:34

Más então no mundo digital o que é o tempo ?
R- O tempo é apenas números... Ao inverso de um numero de vezes que algo acontece dentro de 1..

Ô Fabim, me dá um pouco disso que você tá usando, porque deve se do bom!!!
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

Mensagempor edybahia » 24 Jan 2012 14:55

fabim escreveu:maninho quando eu estava aprendendo sobre timer's do pic eu sofri, por não entender os conceitos de funcionamento de um relógio digital comum.

Como você deve saber, o tempo é algo contável de alguma forma, seja por engrenagens, luz do dia e noite, água areia. Mas tudo tem algo em comum !!! Números..

1 segundo é igual ao quê em sua concepção ?
1 segundo pode ser uma fração de algum tempo, ou um valor elevado E10+9 por exemplo.

Más então no mundo digital o que é o tempo ?
R- O tempo é apenas números... Ao inverso de um numero de vezes que algo acontece dentro de 1..

Por exemplo. Tu sabe que um cristal ressoa a 32767-X por segundo. Algum fabricante tem uma base de tempo de 1 segundo muito preciso e contou dentro disto 32767 oscilações do cristal.

Ou seja. para nosso um segundo o nosso numero é de 32767 + 1."+1 não vou explicar se vira".

Bom excluindo detalhes sórdidos.

Veja, qual o numero de bits necessários, para acomodar o valor 32768 ?
R-15 bits
Como você sabe, o pic tem um contador de 16 bits, isso quer dizer que ele conta até o dobro de 32678, ou seja 65536+1.

Bom, se sabemos que, nosso valor numérico para um segundo é de 32768, e temos um contador que conta o dobro disso, quantos segundos nós temos ??
R-2 segundos.

Lembrando que: No pic podemos gerar um sinal dizendo ao programa que o timer estourou e voltou a zero. Este sinal pode ser usado de inúmeras formas possíveis.
Por exemplo por interrupção.

Seguindo a linha de raciocínio.
Bom, sei que tenho algo que comporta 65537 e está para 2, e tenho 32768 que esta para 1.
Como posso utilizar meu numero para gerar uma interrupção a cada 1 segundo ao invés de 2 segundos ?
Fácil !!
O timer é acessível para escrita e leitura. CORRETO !!
E se, nós manualmente colocarmos dentro do timer o valor 32768 ? eim eim ?
Entenda.
Você demora 2 minutos para encher um recipiente de 2L usando 1 de um litro!!
Você coloca 1 litro no recipiente de 2 litros, dispara o contador e coloca só mais um litro. Quando tempo demorou ?
R- 1 minuto !!!

Chamamos de reload!!

Quando acontece a interrupção, você coloca um valor tal no contador de tempo, que a diferença deste valor colocado, até o máximo valor que o contador alcança gere a interrupção pela seu valor matemático de tempo!!

EX:

Quero que meu contador de 16 bits, gere uma interrupção a cada 500mS, meu valor matemático para o tempo de 1 segundo é de 32768.
1 segundo está para 32768.
1/2 segundo esta para 32768/2.

65536 fundo - 16384 nosso valor matemático para 1/2 segundo = 49152.

Quando interromper, você carrega o timer com o valor do resultado. O resultado do calculo acima mais 16384 que esta para meio segundo, é igual a 65536, que irá gerar outra interrupção.

Resumindo, tempo de meio segundo.

Agora como encontrar nosso valor matemático para 1 segundo ?

1 = frequência do cristal do pic / 4.

EX: 4mhz / 4 = 1 mhz!!

Fabim, nossa, 1mhz ?
Não cabe dentro de 65536 vai estourar um monte de vezes por segundo!!!

Para isto existe um divisor antes do timer, chamado preescaler !!
Ele pega este 1mhz, e divide por 2,4,8,16,128 por exemplo.

Seu valor matemático para um segundo é 1.000.000, se usar o preescaler dividindo por 16 por exemplo.
Seu valor matemático novo que é a base de um segundo fica.
1000000/16 = 62500 !!!!

Bom, já deu para você entender né ?



Muitooo boa a explicação rsrsrsrs
Parabens...

Já tinha utilizado o timer no microcontrolador 8051 em ASM, pelo visto a forma de tempo é a mesma, oq eu não conseguia intender era esse danado do prescale rsrsrsrs, mais agora ta massa...

caso vc possa postar exeplos simples de configuração de tempo iria ajudar muito...
::: EDY
edybahia
Bit
 
Mensagens: 15
Registrado em: 23 Abr 2009 09:25

Mensagempor fabim » 24 Jan 2012 18:15

xultz escreveu:
Más então no mundo digital o que é o tempo ?
R- O tempo é apenas números... Ao inverso de um numero de vezes que algo acontece dentro de 1..

Ô Fabim, me dá um pouco disso que você tá usando, porque deve se do bom!!!

Se eu fumasse o mesmo que o samsonite ai c ia ver só !!!!

Eu ia falar igualzim ele. Tempo não existe, é algo infinito !!!

Mas de qualquer forma, eu ainda trato o tempo digitalmente, através de numeros. Faz tanto tempo que não mexo com pic, que deve ter mudado algo !!!
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!!!?

Re: timer com PIC

Mensagempor andre_luis » 24 Jan 2012 18:34

edybahia escreveu:...preciso enteder como setar um código para que por exemplo durante 1 segunda acenda o led e logo após apague este led...


Você está usando que compilador ?
C ou ASM ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor xultz » 24 Jan 2012 18:39

Ele jamais diria isso, ele diria que o tempo pode ser dividido até chegar a 1.10^-457 s e que menos que isso o tempo dá uns pulos. Ou coisa parecida.

Sobre o timer do PIC, vou dar um micro exemplo. Estou neste momento infelizmente e não por vontade própria, eu podia estar matando, roubando, mas estou mexendo num firmware com PIC18F4520, e precisava de uma base de tempo precisa de 1s. Estou programando no CCS, não por vontade própria, eu podia estar matando, roubando... acho que já disse isso.

Então assim:
O PIC está rodando em cima de um cristal de 20MHz. Ele deveria estar com um cristal de 10MHz, e com PLL rodando a 40MHz, mas eu também podia estar matando... você entendeu.
O clock das instruções vem do cristal, porém dividido por 4. Ou seja, o clock das instruções é de 5MHz, ou 200ns.
Aí eu configurei o timer 2 assim:
setup_timer_2(T2_DIV_BY_16,249,10);
O que isso quer dizer:
Primeiro ele tem um prescaler de 16. Isso quer dizer que antes de entrar no timer, o clock é dividido por 16. O que era 5MHz, passou a ser 312,5kHz, ou 3,2us.
O timer tem um contador, que no caso do timer 2, começa em zero e vai aumentando a cada clock, no meu caso, a cada 3,2us. E ele também tem um comparador, que quando é igual, ele gera um trigger. Eu configurei o comparador para 249. Como ele começa em zero, ele precisa de 250 clocks para ficar igual a 249. Ao chegar neste valor, ele zera o contador e gera um trigger e reinicia a contagem.
Dessa forma, eu gero um trigger a cada 800us.
E o timer 2 também tem um postscale, que no meu caso eu configurei para 10. Ou seja, quando ele receber 10 triggers, ele gera uma interrupção. O que no meu caso quer dizer que o timer 2 recebe uma interrupção a cada 8ms.
Minha ISR do timer 2 ficou assim:

Código: Selecionar todos
#int_TIMER2
void  TIMER2_isr(void)
{
    contador_8ms++;
    if(contador_8ms == 125)
    {
        contador_8ms = 0;
        segundos++;
    }
}

Ou seja, na ISR eu faço um contador até 125, isso quer dizer que ele chega a 125 em 8ms*125 = exatamente 1s.

Para a ISR ser chamada, logo depois de configurar o timer 0 precisa habilitar as interrupções:
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);

Note que isto serve para o timer2 do 4520, eu não lembro mais (graças a Deus) como são os timers do 628, mas espero que isto tenha ajudado de alguma forma.
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

Mensagempor edybahia » 24 Jan 2012 18:50

xultz escreveu:Ele jamais diria isso, ele diria que o tempo pode ser dividido at� chegar a 1.10^-457 s e que menos que isso o tempo d� uns pulos. Ou coisa parecida.

Sobre o timer do PIC, vou dar um micro exemplo. Estou neste momento infelizmente e n�o por vontade pr�pria, eu podia estar matando, roubando, mas estou mexendo num firmware com PIC18F4520, e precisava de uma base de tempo precisa de 1s. Estou programando no CCS, n�o por vontade pr�pria, eu podia estar matando, roubando... acho que j� disse isso.

Ent�o assim:
O PIC est� rodando em cima de um cristal de 20MHz. Ele deveria estar com um cristal de 10MHz, e com PLL rodando a 40MHz, mas eu tamb�m podia estar matando... voc� entendeu.
O clock das instru��es vem do cristal, por�m dividido por 4. Ou seja, o clock das instru��es � de 5MHz, ou 200ns.
A� eu configurei o timer 2 assim:
setup_timer_2(T2_DIV_BY_16,249,10);
O que isso quer dizer:
Primeiro ele tem um prescaler de 16. Isso quer dizer que antes de entrar no timer, o clock � dividido por 16. O que era 5MHz, passou a ser 312,5kHz, ou 3,2us.
O timer tem um contador, que no caso do timer 2, come�a em zero e vai aumentando a cada clock, no meu caso, a cada 3,2us. E ele tamb�m tem um comparador, que quando � igual, ele gera um trigger. Eu configurei o comparador para 249. Como ele come�a em zero, ele precisa de 250 clocks para ficar igual a 249. Ao chegar neste valor, ele zera o contador e gera um trigger e reinicia a contagem.
Dessa forma, eu gero um trigger a cada 800us.
E o timer 2 tamb�m tem um postscale, que no meu caso eu configurei para 10. Ou seja, quando ele receber 10 triggers, ele gera uma interrup��o. O que no meu caso quer dizer que o timer 2 recebe uma interrup��o a cada 8ms.
Minha ISR do timer 2 ficou assim:

Código: Selecionar todos
#int_TIMER2
void  TIMER2_isr(void)
{
    contador_8ms++;
    if(contador_8ms == 125)
    {
        contador_8ms = 0;
        segundos++;
    }
}

Ou seja, na ISR eu fa�o um contador at� 125, isso quer dizer que ele chega a 125 em 8ms*125 = exatamente 1s.

Para a ISR ser chamada, logo depois de configurar o timer 0 precisa habilitar as interrup��es:
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);

Note que isto serve para o timer2 do 4520, eu n�o lembro mais (gra�as a Deus) como s�o os timers do 628, mas espero que isto tenha ajudado de alguma forma.



Blzz pessoal, obrigado pela contribuição de vocÊs hehehehe...

No caso pessoal, a rotina de comando por exemplo quero que o led seja acionado qdo tiver 1 segundo por exemplo, ela deve esta no programa principal ?? sendo "testada" com um flag de estouro do timer

ou deve estar na rotina de interrupção do timer ??
::: EDY
edybahia
Bit
 
Mensagens: 15
Registrado em: 23 Abr 2009 09:25

Mensagempor andre_luis » 24 Jan 2012 18:55

edybahia escreveu:...a rotina de comando por exemplo quero que o led seja acionado qdo tiver 1 segundo por exemplo, ela deve esta no programa principal ?? sendo "testada" com um flag de estouro do timer ou deve estar na rotina de interrupção do timer ??


Fica á seu critério.
Ambas funcionam : Interrupção ou pesquiza.

Porém, para voce começar a aprender a mexer com o microcontrolador, será mais fácil por pesquiza, mas num passo seguinte, voce deve aprimorar o programa para trabalhar com interrupção.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor edybahia » 24 Jan 2012 18:58

andre_teprom escreveu:
edybahia escreveu:...a rotina de comando por exemplo quero que o led seja acionado qdo tiver 1 segundo por exemplo, ela deve esta no programa principal ?? sendo "testada" com um flag de estouro do timer ou deve estar na rotina de interrupção do timer ??


Fica � seu crit�rio.
Ambas funcionam : Interrup��o ou pesquiza.

Por�m, para voce come�ar a aprender a mexer com o microcontrolador, ser� mais f�cil por pesquiza, mas num passo seguinte, voce deve aprimorar o programa para trabalhar com interrup��o.


+++


Olá Brother...

Ja usei interrupção com o PIC, pelo que aprendi não e dificil

não entendi qdo vc falou por pesquisa??
::: EDY
edybahia
Bit
 
Mensagens: 15
Registrado em: 23 Abr 2009 09:25

Mensagempor RobL » 24 Jan 2012 21:17

pesquisa <=> varredura (polling) ou testar um evento, um flag constantemente.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor fabim » 24 Jan 2012 22:13

Cara por eu ser evangélico, devia parar que querer fazer mal as pessoas.

Dando força pro cara aprender a mexer com pic, e o xuxu disse que ta usando pic com ccs. F***
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!!!?

Mensagempor andre_luis » 25 Jan 2012 04:48

Pra quem ta começando á mexer com PIC, o CCS pode ser uma das ferramentas apropriadas, dado á quantidade de APIs prontas.
Mas se formos defender opinião e polemizar, corre-se o risco do debate se transformar num boteco.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Mersin » 26 Jan 2012 09:05

Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Próximo

Voltar para PIC

Quem está online

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

cron

x