terça-feira, 5 de março de 2013

Timer 0 com 16F877A - Mplab XC8


*
 *                       usando timer no MPlab XC8
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 16F877A
 * Autor: aguivone
 * Versão: 1
 * Data :  05 de março de 2013
 */
#include <stdio.h>
#include <string.h> //para usar funçoes de string deve se adicionar este header
#include <stdlib.h>
#define _XTAL_FREQ 4000000    // cristal de 4 Mhz
#include <xc.h>

/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)



///////////////////////////////////////////////////interrupção//////////////////////////////////////////////////////////////
void interrupt interrupcao(void)//vetor de interrupção
 {
    if(T0IF)
    {//interrupção do timer0 - estoura quando atinge 255(0XFF)
        PORTB = ~PORTB;//alterna port B
        TMR0 = 61;//reinicia timer com o valor calculado
        T0IF = 0;
    }
 }

void inicializa_timer0()
{
    OPTION_REG = 0X07;//timer0 com prescaler dividido por 256
    T0IE = 1;//habilita interrupção do timer0
  /*
 para calcular faça F = (Fosc/4)/prescaler
 * logo F = (4.000.000/4)/256
 * então:F = 3906,25 hz  (aproximadamente) o que dá 256 us cada incremento
 * vamos fazer o portB inverter o estado logico a cada 50ms
 * então temos que :
 * numero de incrementos = 0,050/0,000256 = 195(aproximadamente)
 * para gerar uma interrupção a cada 50ms será preciso = 256(numero maximo de incrementos) - 195 = 61.
 */
    TMR0 = 61;//zera registrador de contagem
}
//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////

void main(void)
{
    TRISB = 0;   //configura como saida
    PORTB = 0;  // limpar as portas que estão configuradas como saidas
     inicializa_timer0();
    PEIE = 1;//habilita interrupção de perifericos do pic
    GIE = 1; //GIE: Global Interrupt Enable bit
    for(;;)
    {
      //faz nada
    }//loop infinito

}
Faça uma visita na página do face, basta procurar por microcontroladores-C,e dê um "curtir" assim vc fica por dentro das novidades do blog!  

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!