#include <xc.h>
#define _XTAL_FREQ 4000000
void init_micro (void);
void init_timer (void);
void init_adc (void);
void init_pwm (void);
void read_adc(void);
void pwm_dr (unsigned int dr);
void status (void);
int abval (int);
static int dr = 0, counter_a = 0, counter_b = 0, counter_c = 0, counter_d = 0, adc = 0, flag_c = 0, buzzer_flag = 0;
//static signed long sample_fresh = 0, sample_previous = 0, filtered_previous = 0, filtered_fresh = 0, temp_sample = 0, temp_filtered = 0;
#define SBIT_LED_CHARGING GP4
#define SBIT_LED_CHARGED GP5
#define SBIT_BUZZER GP2
#define TRUE 1
#define FALSE 1
//#define PB_SWITCH GP0
#define PB_SWITCH GP3
#define POWER_GOOD GP0
void main (void)
{
init_micro();
init_adc();
init_timer();
// init_pwm();
do
{
}
while(TRUE);
}
void init_micro (void)
{
OSCCON = 0b01100111;
TRISIO = 0b00001010;
CMCON0 = CMCON0 | 0b00000100;
ANSEL = 0b01010010;
GPIO = 0b00000000;
POWER_GOOD = TRUE;
__delay_ms(100);
}
void interrupt team_isr()
{
if(TMR1IF)
{
counter_b++;
if(adc >= 820)
counter_c++;
if(counter_b >= 300)
{
if(counter_c >= 299)
flag_c = 1;
else if(counter_c < 299)
flag_c = 0;
counter_b = 0;
counter_c = 0;
}
counter_a++;
if(!PB_SWITCH)
{
SBIT_BUZZER = 0;
if(adc >= 820)
{
SBIT_BUZZER = 0;
if(flag_c)
{
SBIT_LED_CHARGED = 1;
SBIT_LED_CHARGING = 0;
if(counter_a >= 10)
{
counter_a = 0;
}
}
else if(!flag_c)
{
SBIT_LED_CHARGED = 0;
if(counter_a >= 10)
{
SBIT_LED_CHARGING ^= 1;
counter_a = 0;
}
}
}
else if(adc < 820)
{
if(counter_a >= 10)
{
SBIT_LED_CHARGING ^= 1;
counter_a = 0;
}
SBIT_BUZZER = 0;
SBIT_LED_CHARGED = 0;
}
}
else if(PB_SWITCH)
{
if(adc >= 820)
{
if(flag_c)
{
if(counter_a >= 10)
{
SBIT_BUZZER ^= 1;
counter_a = 0;
}
SBIT_LED_CHARGED = 1;
SBIT_LED_CHARGING = 0;
}
else if(!flag_c)
{
SBIT_LED_CHARGED = 0;
SBIT_BUZZER = 0;
if(counter_a >= 10)
{
SBIT_LED_CHARGING ^= 1;
counter_a = 0;
}
}
}
else if(adc < 820)
{
if(counter_a >= 10)
{
SBIT_LED_CHARGING ^= 1;
counter_a = 0;
}
SBIT_BUZZER = 0;
SBIT_LED_CHARGED = 0;
}
}
TMR1IF = 0;
TMR1H = 0xCF;
TMR1L = 0x2C;
TMR1IE = 1;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
}
if(ADIF)
{
read_adc();
ADIF = 0;
ADON = 1;
ADIE = 1;
PEIE = 1;
GIE = 1;
// __delay_us(4);
GO_nDONE = 1;
}
}
void init_timer (void)
{
T1CON = 0b00110100;
TMR1H = 0xCF;
TMR1L = 0x2C;
TMR1IE = 1;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
TMR1IF = 0;
}
void init_pwm (void)
{
PR2 = 255;
// if(filtered_fresh < 4)
// if(adc < 4)
// pwm_dr((adc + 94));
// pwm_dr((filtered_fresh + 4));
// pwm_dr((adc + 4));
// else
// pwm_dr(adc);
// pwm_dr(filtered_fresh);
// pwm_dr(adc);
pwm_dr(4);
TRISIO = 0b00001011;
CCP1CON = 0b00001100;
T2CON = 0b00000101;
}
void init_adc (void)
{
ADCON0 = 0b10000100;
ADON = 1;
ADIF = 0;
ADIE = 1;
PEIE = 1;
GIE = 1;
// __delay_us(4);
GO_nDONE = 1;
}
void pwm_dr (unsigned int dr)
{
CCPR1L = (dr >> 2);
CCP1CON = ((CCP1CON & 0x3F) + ((dr << 4) & 0x30));
}
void read_adc (void)
{
adc = (((unsigned)ADRESH << 8) | ADRESL);
/* filtered_previous = filtered_fresh;
temp_filtered = 255 * filtered_previous;
temp_filtered = temp_filtered >> 8;
sample_previous = sample_fresh;
sample_fresh = adc;
temp_sample = 255 * abval((sample_fresh - sample_previous));
temp_sample = temp_sample >> 8;
filtered_fresh = temp_filtered + temp_sample; */
// run_pwm();
// status();
}
void status (void)
{
if(adc < 820)
SBIT_LED_CHARGING = 0;
else
SBIT_LED_CHARGED = 1;
}
int abval (int val)
{
return (val<0 ? (-val) : val);
}