segunda-feira, 29 de setembro de 2014

Como usar o timer e o comparador de tensão no PIC 12F675

Simples exemplo de interrupções no PIC12F675 a seguir o código fonte:

/*
 *       Exemplo de uso do timer0 e comparador analogico
 * 
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 12F675
 * Autor: aguivone
 * Versão: 1
 * Data :  29/09/2014
 */
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000

#define PISCA GP2
#define LED GP5
/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////
// CONFIG
#pragma config FOSC = INTRCIO
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF     // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

long largura_pulso=0;
long quantida_de_passos=0;
long tempo_pisca=0;

void interrupt interrupcoes(void)//vetor de interrupção
 {
    if(T0IF)
    {   //então: temos que 250khz / 25 incrementos = 10khz
        //então o valor do tmr0 será 256-25=231        
        tempo_pisca++;
        if(tempo_pisca > 10000)//aprox 1 segundo
        {
            PISCA = ~PISCA;
            tempo_pisca=0;
        } 
        T0IF = 0;//  limpa flag de interrupção do timer0
        TMR0 = 231;//zera timer zero
    }
    if(CMIF)
    { //tensão esta acima do esperado
         LED = COUT;
         CMIF =0;//limpa flag de interrupção
    }
 }



//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////
void main(void) {
    CMCON = 2;//habilita comparador para modo isolado
    ANSEL = 0X03;//usa AN0 e AN1 como entrada analogica
    WPU = 0X00;//desabilita pull ups
    TMR0 = 0;
    OSCCAL = 0XFF;//configura o oscilador interno para frequencia maxima(4mhz)
    OPTION_REG = 0X81;//pull up desabilitado/preescaler ligado ao timer0(dividido por 4)
    INTCON = 0XE0;//habilita interrupção do timer 0 e interrupção global e de perifericos
    CMIE = 1;//habilita interrupção do comparador
    TRISIO = 0X03;//configura gp0 e gp1 como entrada
    //logo a frequencia de interrupção é 250khz
    for(;;)
    {}//loop infinito

}


   O circuito fica o tempo todo comparando 2 tensões assim que o nível de tensão na entrada 1(GP0) fica igual ou maior que a entrada 2(GP1) a saída do comparador muda de estado, a simulação no proteus ficou assim:




    Para quem quiser se manter informado sobre as postagem aqui no blog basta curtir a fan page no facebook: https://www.facebook.com/pages/Microcontroladores-C/576463872371829

quinta-feira, 25 de setembro de 2014

Timer0 com PIC12F675


Neste exemplo vou demonstrar como utilizar e configurar o timer0 do PIC 12F675 no compilador MPlab XC8.

A simulação no proteus:




O Código fonte:

/*
 *                                              Exemplo de uso do timer0 
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 12F675
 * Autor: aguivone
 * Versão: 1
 * Data :  25/09/2014
 */
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000

#define LED GP1
/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF         // Data Code Protection bit (Data memory code protection is enabled)

long tempo_pisca=0;

void interrupt interrupcoes(void)//vetor de interrupção
 {
        LED = ~LED;
        //então: temos que 250khz / 250 incrementos = 1khz
        //então o valor do tmr0 será 256-250=6
        T0IF = 0;//  limpa flag de interrupção do timer0
        TMR0 = 6;//zera timer zero
 }


//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////
void main(void) {
    TRISIO = 0X01;//configura gp0 como entrada
    CMCON = 7;//desabilita comparadores
    ANSEL = 0;//habilita as portas para funcionar de forma digital
    WPU = 0X00;//desabilita pull ups
    TMR0 = 0;
    OSCCAL = 0XFF;//configura o oscilador interno para frequencia maxima(4mhz)
    OPTION_REG = 0X81;//pull up desabilitado/preescaler ligado ao timer0(dividido por 4)
    INTCON = 0XE0;//habilita interrupção do timer 0 e interrupção global e de perifericos
    //logo a frequencia de interrupção é 250khz
    for(;;)
    {
     //faz nada
    }//loop infinito

}