Usando Timer1 PIC877A

Os temporizadores são as partes mais complicadas de um microcontrolador.
Alem de envolver o projetista com uma programação precisa, requer conhecimento do funcionamento de alguns componentes eletrnônicos como osciladores (Cristais), ressonadores, circuitos RC e estrutura interna do PIC.

Internamente, um temporizador nada mais é do que um registrador. Podendo ser de 8 ou 16 bits a depender do microcontrolador. É importante saber qual TIMER será utilizado Isso vai influenciar nos cálculos. Cálculos? É! A engenharia é linda!

Pra colocar o TIMER do 877a pra rodar é simples! Basta saber algumas coisas. São elas:
Tipo do oscilador bem como o valor da frequência, prescaler, e o TIMER a utilizar. Sendo que existem o TIMER0, TIMER1 e TIMER2.

O TIMER é zerado toda vez que "estoura". Ou seja, se for um de 8 bits (255) cada vez que ele contabiliza 256 em seu registrador ele zera. E o flag de estouro do TIMER é setado.

Bom, então vai a pergunta: Como colocar um LED pra piscar na frequência de 1Hz utilizando um cristal de 8MHz como oscilador?
Calma! É fácil! Só vamos fazer umas continhas de padeiro. Nada contra padeiro!
Então pegue logo sua HP Calculator, lápis e papel e lá vamos nós ...

Qualquer PIC utiliza apenas 1/4 do clock externo para processar suas instruções. Isso porque ele divide o sinal de um clock para fazer a busca, registro, direcionamento e processamento em si da instrução. Ou seja, basta dividir os 8MHz por 4 e temos um clock de processamento de 2Mhz. O que nos diz que o microcontrolador realiza 2 milhões de instruções por segundo. Ou 1 instrução a cada 0,5 us.

Para cada pulso do clock, o TIMER incrementa 1 no seu registrador. Para diminuir a ocorrencia do estoudo do TIMER usa-se o prescaler. Que é nada mais do que um divisor de contagem. Um prescaler de 8 por exemplo indica que para cada 8 pulsos do clock incrementa -se 1 no TIMER. Já o prescaler 16, para cada 16 pulsos do clock incrementa-se 1 no TIMER.

Para o nosso exemplo vamos utilizar um prescaler de 8. Utilizaremos o TIMER1 do 877a pois ele é de 16 bits e pode contar até até 65536.

Cext / 4 / Pes / Vt = Frequencia mínima (Fórmula básica)

Cext = Clock Externo, Pes = Prescaler, Vt = Variável do contador.

A menor frequência de estouro do TMR1 que podemos obter com um clock de 8MHz é: 8MHz / 4 / 8 / 65536 = 3,81 Hz. Ou seja, se o TMR1 iniciar sua contagem do zero, ocorrerá 3,81 estouros em 1 segundo. Como 3,81 não é um número inteiro, o mais próximo seria 4 Hz. Logo, o TMR1 terá que iniciar sua contagem a partir de 3036 e não do zero. Veja os cálculos.

Vt = Cext / 4 / Pes / f. Mínima

Vt = 8MHz/4/8/4Hz = 62500

Logo o contador deverá contar 62500 vezes e depois estourar. Basta então começar a contagem de (65536 - 62500 ) = 3036.

Como a frequência é de 4Hz, devemos inserir na programação um contador pra contabilizar os estouros. 2 estouros correpondem a 0,5 segundos, 4 estouros a 1s, e assim por diante.

Na linha de programação, utilizou-se a imterrupção por TMR1


//NERDS ROBÓTICA
#include <16f877a.h>
#use delay(clock=8000000) //Usando cristal de 8MHz
#fuses xt, put, nowdt, nolvp, noprotect, nobrownout

#define pled PIN_E2 // Pino do LED

#int_timer1 // Função DEBUGER com utilização do TIMER1
void timer1(void)
{
static boolean sled; // sled = Estado do LED
static int cont;

set_timer1(3036 + get_timer1()); //
cont++;

if (cont == 4) // Se estourou 4 vezes = 1 s se passou
{
cont = 0;
sled = !sled; // Se led ligado, desliga, ou se estiver desligado liga
output_bit(pled, sled);
}
}


void main(void)
{
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
while(true);
}


Qualquer dúvida é so postar!

NERDS!











2 comentários:

Filipe Oliveira disse...

Olá, estou desenvolvendo um projeto utilizando exatamente esse PIC porém com om oscilador externo. Estou a procura de códigos que utilizem os osciladores externos para poder utilizar no meu programa, quero que tenha a mesma função (relógio).

Att, Filipe Hegaja.

Unknown disse...

Bom dia, estou desenvolvendo um projeto usando um timer1 e precisava incrementar e decrementar o tempo do timer1 por dois botões. Alguém poderia me ajudar?

Postar um comentário

Faça seu comentário aqui:

Campanha Social NERDS!