Temperature Meter & Cutoff project

Temperature meter & cutoff project လေးတင်ပေးလိုက်ပါတယ်………
ဒါလေးက….အလွယ်ဆုံးဖြစ်အောင်ရေးထားတာပါ…..
ဒါကတော့..initial ပါ..port တွေ…AD converter အတွက်..set up လုပ်တာပါ
void Init_ADC()
{
ADFM=1;
setup_adc(adc_clock_internal);
set_adc_channel(WATER_TEMP);
}
void read_temp_task()
{
set_adc_channel(WATER_TEMP);
Temp=read_adc();
Temp=Temp/LM35_DIV;
conv_adc_ready=1;
}
ဒါက program တစ်ခုလုံးရဲ့ system timer ပါ….function တွေကို တလှည့်စီအလုပ်လုပ်ဖို့အတွက်…timer နဲ့ flag တွေကို on ပေးပါတယ်
interrupt နဲ့ CCP ကို special event trigger ကိုသုံးထားပါတယ်

#int_CCP1
void CCP1_isr(void)
{
sys_tick=1;
if(++display_period==display_time)
{display_period=0;display_flag=1;}
if(++sound_gen_period==sound_gen_time)
{sound_gen_period=0;sound_gen_flag=1;}
if(++read_adc_period==read_adc_time)
{read_adc_period=0;read_adc_flag=1;}
if(++sound_gen_period==sound_gen_time)
{sound_gen_period=0;sound_gen_flag=1;}
}
ဒါကတော့…binary to BCD decode ပါ….
void convbcd(long Temp)
{
digit[3]=0;
while(Temp>=1000)
{
Temp -=1000 ;
digit[3]++;
}
digit[2]=0;
while(Temp>=100)
{
Temp -=100 ;
digit[2]++;
}
digit[1]=0;
while(Temp>=10)
{
Temp -=10;
digit[1]++;
}
digit[0]=Temp;
}
ဒီ task က decode လုပ်ပြီသား..BCD ကို 7segment မှာ ဖော်ပြပေးတဲ့ display task ဖြစ်ပါတယ်
void display_temp_task()
{
static char state=0;
switch(state)
{
case 0:
DISPLAY_OUTPUT=0;
Digit0=1;Digit1=1;Digit2=1;Digit3=1;
DISPLAY_OUTPUT=DEGREE_C;
Digit0=0;Digit1=1;Digit2=1;Digit3=1;
state++;
break;
case 1:
DISPLAY_OUTPUT=0;
Digit0=1;Digit1=1;Digit2=1;Digit3=1;
DISPLAY_OUTPUT=segment[digit[0]];
Digit0=1;Digit1=0;Digit2=1;Digit3=1;
state++;
break;
case 2:
DISPLAY_OUTPUT=0;
Digit0=1;Digit1=1;Digit2=1;Digit3=1;
DISPLAY_OUTPUT=segment[digit[1]];
Digit0=1;Digit1=1;Digit2=0;Digit3=1;
state++;
break;
case 3:
DISPLAY_OUTPUT=0;
Digit0=1;Digit1=1;Digit2=1;Digit3=1;
DISPLAY_OUTPUT=segment[digit[2]];
Digit0=1;Digit1=1;Digit2=1;Digit3=0;
state=0;
break;
default:
state=0;
break;
}
}
ဒါကတော့..alarm သံဖြစ်ပါတယ်…one bit modulation ကိုသုံးထားပါတယ်…သူ function ထဲမှာ..loop မပါတ်ပါဘူး…multitasking သုံးပြီးရေးထားပါတယ်…while loop ထဲမှာ..ထည့်ထားပါတယ်..
void error_output_beep()
{
if(error_alarm_flag)
{
TRISC=0;
if(++error_alarm_period==error_alarm_control_reg)
{
error_alarm_period=0;
if(BEEP_OUTPUT)
{ BEEP_OUTPUT=0;}
else BEEP_OUTPUT=1;
if(sound_effect_flag)
{
if(–error_alarm_control_reg==5)
{ error_alarm_control_reg=30;}
sound_effect_flag=0;
}
}
} // ERROR ALARM FLAG is 1
else TRISC=0b00000010;
}
ဒါကတော့ main fame ပါ….task တစ်ခုချင်းကို system timer နဲ့ ခေါ်ထည့်သွားတာပါ….
void main (void)
{
static char time=0;
Init_PIC();
Init_ADC();
Init_sys_tick();
while(1)
{
if(sys_tick)
{
if(display_flag)
{
display_temp_task();
display_flag=0;
}
if(sound_gen_flag)
{
sound_effect_flag=1;
sound_gen_flag=0;
}
if(read_adc_flag)
{
read_temp_task();
read_adc_flag=0;
}
}// system tick
if(conv_adc_ready)
{ convbcd(Temp);conv_adc_ready=0; }
error_output_beep();
over_temp_task();
}//while1
}//main

စမ်းကြည့်လိုက်ပါ……..
Post by MKT

Leave a Reply

Your email address will not be published. Required fields are marked *