Pisca led com o PIC18F4520

Este post mostra como implementar um simples pisca led utilizando o PIC18F4520 em linguagem C e utilizando a interrupção do timer 0. Ele servirá de base para outros projetos envolvendo temporização.

Utilizamos o MPLAB, compilador C18 e o Proteus VSM para a simulação.

A base de tempo do nosso projeto será de 1 segundo e vamos configurar o timer 0 para gerar uma interrupção por segundo.

Partindo de um clock de 4MHz e utilizando o timer 0 em modo de 16 bits, podemos calcular que será necessário configurar o prescaler para fazer a divisão por 32 do sinal de clock (Fosc/4 ou 1MHz), resultando em uma frequencia de entrada de 31250Hz. Se inicializarmos o timer 0 com o valor 34286 (65536-31250), após 31250 pulsos (ou 1 segundo) o timer 0 irá gerar uma interrupção.

Observe que dentro da ISR do timer 0 é necessário recarregar o contador do timer 0 (registradores TMR0L e TMR0H) com o valor 34286 (0x85EE em hexadecimal), para que cada período de interrupção tenha a duração de 1 segundo.

#include <p18f4520.h>
#include <stdio.h>
#pragma config OSC = XT, WDT = OFF, MCLRE = OFF
#pragma config DEBUG = OFF, LVP = OFF, PWRT = ON
#define LED LATBbits.LATB7
#pragma code isr = 0x000008
#pragma interrupt ISR
void ISR(void)
{
  unsigned char temp;
  INTCONbits.TMR0IF = 0; // apaga o flag de interrupção
  temp = TMR0L;
  TMR0H = 0x85;
  TMR0L = temp + 0xEE;
  LED = !LED;  // inverte o estado do led
}
#pragma code
void init(void)
{
  ADCON1 = 0x0F;  // desliga entradas analógicas
  TRISBbits.TRISB7 = 0;  // RB7 como saída
  TMR0H = 0x85;
  TMR0L = 0xEE;
  T0CON = 0x84;   // configura o timer 0 (prescaler = 32)
  INTCON = 0xA0;  // habilita GIE e TMR0IE
}
void main(void)
{
  init();
  while(1); // aguarda uma interrupção
}

O programa acima pode ser baixado aqui e o esquemático do circuito pode ser visto na figura a seguir.

 

Leave a Reply