sexta-feira, 1 de março de 2013

capturando eventos externos usando pic - Mplab XC8

     Um exemplo simples  pra demonstrar como usar a interrupção de ccp (muito útil pra calcular frequências), aqui basicamente quando se pressiona o botão o led acende ou apaga,basta pausa a simulação é verá que a variável ler já tem o valor do CCP.


O código fonte:

/*
 *                                usando o modo CCP no MPlab XC8
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 16F628A
 * Autor: aguivone
 * Versão: 1
 * Data :  01 de março de 2013
 */
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 20000000    // cristal de 20 Mhz
#include <xc.h>
 
#define delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) 
#define delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))


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



#define power_led RB0
#define led RB4

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/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      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

////////////////////////////////////////////////variaveis globais///////////////////////////////////////////////////////////
long ler = 0;
int  interru=0;
///////////////////////////////////////////////////interrupção//////////////////////////////////////////////////////////////
void interrupt CCP1(void)
{
                              led = ~led;
                             ler = CCPR1;//apesar de não ser usado aqui deixei esta variavel para demonstrar
                             CCP1IF = 0;//limpa flag de interrupção               
 }
//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////

void main(void) {
    TRISB = 0X08;//configura portB  B3 (ccp1) como entrada
    PORTB = 0;  // limpar as portas que estão configuradas como saidas
    CCP1CON  = 0X05;//habilita captura de pulso na borda de subida (prescaler sem divisão)
    CCP1IE = 1;//habilita modo de captura de pulsos*/
    PEIE = 1;
    GIE = 1; //GIE: Global Interrupt Enable bit
    led = 0;//desliga led
    for(;;)
    {
                                power_led = 1;
                                delay_ms(1);
                                power_led = 0;
                                delay_ms(1);
                             
                                
    }//loop infinito

}

Um comentário :

  1. copiei e colei o codigo mas nao funciona no pic c compiler !!

    ResponderExcluir

olá,digite aqui seu comentário!