مثال يوضح كيفيه أستفاده من تايمر داخلي حيث ان هذا تايمر يعمل بشكل مستقل عن عمل مايكرو وبتالي لن يعيق عمله
في مثال التالي يوضح سويجين مربوطين على RA0_bit و RA1_bit ولمبات leds مربوطه على RB0_bit و RB1_bit
اذا اضغطت على sw1 ومربوط عند RA0_bit يعمل led1 ومربوط عند RB0_bit وبعد 1 ثانيه ينطفئ
اذا اضغطت على sw2 ومربوط عند RA1_bit يعمل led2 ومربوط عند RB1_bit وبعد 2 ثانيه ينطفئ
كود:
sbit sw1 at RA0_bit;
sbit sw1_dir at TRISA0_bit;
sbit sw2 at RA1_bit;
sbit sw2_dir at TRISA1_bit;
sbit led1 at RB0_bit;
sbit led1_dir at TRISB0_bit;
sbit led2 at RB1_bit;
sbit led2_dir at TRISB1_bit;
unsigned char flag_sw1=0,flag_sw2=0;
unsigned int time_sw1=0,time_sw2=0;
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x11;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
//Enter your code here
if(flag_sw1==1)time_sw1++;
if(flag_sw2==1)time_sw2++;
}
}
void main()
{
cmcon=7;
sw1_dir=1;
sw2_dir=1;
led1=0;
led2=0;
led1_dir=0;
led2_dir=0;
InitTimer1();
while(1)
{
if(sw1 ==0)flag_sw1=1;
if(sw2 ==0)flag_sw2=1;
if(flag_sw1==1 && led1==0)led1=1;
if(flag_sw2==1 && led2==0)led2=1;
if(flag_sw1==1 && time_sw1>20) //1sec ==> 1000ms/50=20
{
flag_sw1=0;
time_sw1=0;
led1=0;
}
if(flag_sw2==1 && time_sw2>40)// 2sec ==> 2000ms/50=40
{
flag_sw2=0;
time_sw2=0;
led2=0;
}
}
}
كيف نولد الزمن
لاحظ هذا الكود
كود:
if(sw1 ==0)flag_sw1=1;
يعني اذا ضغطت على سويج خلي متغير سميته flag_sw1=1
لو نرجع الى كود انتربت سوف تلاحظ ان كل 50ms راح يزداد متغير أخر سميته time_sw1 وهذا مهمته أحتساب زمن لهذا السويج فقط
انا كتبت التالي
كود:
if(flag_sw1==1 && led1==0)led1=1;
يعني انا اريد عندما اضغط على سويج يعمل led
اذن أختبر متغير الخاص بحاله سويج flag_sw1 هل يساوي 1 وهل led طافي عندها شغل led وضع الشرط هل ليد طافئ لكي لا أريد يتنفذ الشرط تشغيل ليد عده مرات اريده يتنفذ مره واحده فقط
بعد 1 ثانيه من ضغطه السويج مفروض يطفئ ليد وايضا يجب اعاده متغيرات خاصه بحاله سويج وبعداد تايمر لهذا السويج الى 0
كود:
if(flag_sw1==1 && time_sw1>20) //1sec ==> 1000ms/50=20
{
flag_sw1=0;
time_sw1=0;
led1=0;
}
أذن بأختصار كل سويج او اي شيئ تريد أحتساب له زمن معين يحتاج الى متغير اخر لتعبير عن حالته يعني دائما سميه قريب من أسمه مثلا سميت flag_sw1 اي وضعت فقط كلمه flag_ امام سويج او اي متغير لغرض انك تعرف لمن تابع هذا متغير
هو طبعا يمكنك وضع اي اسم ولكن دائما خلي متغيرات قريبه من شيئ الذي تنفذه او الذي تعبر عنه لتسهيل لك فهمه فيما بعد
وفي داله الانتربت تختبر الشروط لديك اذا تحققت أخبره قم بزياده متغير اخر خاص بزمن
الشروط يعني مثلا اذا ضغطت على سويج اوكي خليت flag_sw1=1 اذن تحقق الشرط راح يزيد متغير time_sw1
احيانا لا الشرط فيه عده حالات لكي يتم زياده time_sw1 مثلا اريد اذا سويج sw1 تم ضغطه وسويج sw2 لم يتم ضغطه
اذن هنا الشرط يختلف لانك راح تختبر هل flag_sw1==1 و flag_sw2==0 عندها قم بزياده time_sw1 كل 50ms
ملاحظه// بالنسبه لاستدعاء انتربت بالحقيقه هو البرنامج يقوم بعمل أنتربت كل 50 ms ويتفحص الشروط الموجوده في داله الانتربت ثم يعود لاكتمال عمل البرنامج
طبعا 50ms تخص هذا المثال فقط
تلاحظ ان خليت زمن انتربت عالي ولم أضعه 1ms لاني اريده فقط توليد أزمنه أساسا هي كبيره اذن لست بحاجه الى أرهاق مايكرو بكثره أنتربت