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
Parabéns pelo artigo na net tem pouco conteúdo sobre este pic em português e bem comentado!!
ResponderExcluirParabéns pelo artigo na net tem pouco conteúdo sobre este pic em português e bem comentado!!
ResponderExcluirqual compilador vc esta usando acaso seria ccs ?
ResponderExcluir