السلام عليكم
يوجد طريقه أفضل ويمكن ان تجعل البيك ينفذ الاوامر بغض النظر عن زمن تاخير
اولا دعني اقول لك ان if لن توخر مايكرو مشكله وحيده في تاخير مايكرو هو delay
لذلك أخي يوجد طريقه لتخلص من ديلي عن طريق انتربت بأستخدام التايمرات يعني أشلون
مثال لنفترض انك عندك ليدات عدد 2 ولكل ليد له سويج معين اريد ان ضغط على سويج ليد بشتغل 3 ثواني وينطفي وكذلك الحل لليد الثاني
هنا انت ستقول اذا ضغط على سويج الاول راح يشتغل ليد ولكن كيف اتخلص من 3 ثواني لكي استطيع تشغيل ليد الثاني
الحل نستخدم تايمر0 او تايمر1 او اي تايمر
طبعا لاتتعب نفسك في توليد الكود لان مايكروشيب وضعت برنامج يولد الكود كامل انت عليك تختار عائله البيك وتايمر وتردد وكم زمن انتربت وهو يولد لك الكود
قم بتحميل البرنامج الذي اسمه timer-calculator من موقع الرسمي
http://www.mikroe.com/timer-calculator/
فكره بسيطه لكل سويج سنفرض له متغيرين الاول نسميه مثلا flag اي sw1_flag وهذا مهمته يعبر عن حاله سويج هل وهو 1 او 0
ومتغير اخر هو time اي sw1_time وهذا مهمته بيحسب زمن الي ينفذ اوامر سويج
اي بأختصار أخي لكل امر تنفيذ يحتاج الى هذين متغيرين
طبعا flag من نوع char اما time يكون اما من نوع char او int يعني حسب قيمه
هذا مثال عملي لكي يتم ايصال الفكره
أكرر العمليه ربما طويله نوعا ما ولكنها سهله وتجعل البيك ينفذ جميع اوامر بدون اي أعاقه او تأخير
كود:
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;
char sw1_flag=0, sw2_flag=0 ;
char led1_off_flag=0, led2_off_flag=0 ;
unsigned char sw1_time=0, sw2_time=0 , led1_off_time=0,led2_off_time=0 ;
//Timer0
//Prescaler 1:256; TMR0 Preload = 61; Actual Interrupt Time : 49.92 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x87;
TMR0 = 61;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 61;
//Enter your code here
if(sw1_flag==1)sw1_time++;
if(sw2_flag==1)sw2_time++;
if(led1_off_flag==1)led1_off_time++;
if(led2_off_flag==1)led2_off_time++;
}
}
void main()
{
cmcon=7;
sw1_dir=1;
sw2_dir=1;
led1_dir=0;
led2_dir=0;
led1=0;
led2=0;
InitTimer0();
while(1)
{
if(sw1==0)sw1_flag=1;
if(sw2==0)sw2_flag=1;
if(sw1_flag==1 && sw1_time>=5)// mean sw1_time>=250ms
{
sw1_flag=0;// clear flag
sw1_time=0;// clear time
led1=1;
led1_off_flag=1;
}
if(sw2_flag==1 && sw2_time>=5)// mean sw2_time>=250ms
{
sw2_flag=0;// clear flag
sw2_time=0;// clear time
led2=1;
led2_off_flag=1;
}
if(led1_off_flag==1 && led1_off_time>=60)// mean led1_off_time>=3000ms
{
led1_off_flag=0;// clear flag
led1_off_time=0;// clear time
led1=0;// off
}
if(led2_off_flag==1 && led2_off_time>=60)// mean led2_off_time>=3000ms
{
led2_off_flag=0;// clear flag
led2_off_time=0;// clear time
led2=0;// off
}
}
}
تحياتي