اطلاعیه

Collapse
No announcement yet.

ایجاد یک وقفه با for در زبان c

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ایجاد یک وقفه با for در زبان c

    با سلام
    در متن برنامه ی من یک قسمت هست که لازم دارم برای لحظه ی وقفه داشته باشم ولی در این زمان اگر سیگنالی از portc.7 رسید ,از این وقفه خارج بشه. این قسمتو نوشتم ولی نمیدونم چرا کار نمیکنه..!!

    for (j=0;j<40;j++)
    { for (f=0;f<250;f++)
    {
    for (k=0;k<80;k++)
    {
    if (PINC.7==1);
    { j=0;
    k=0;
    f=0;
    goto GETNUM;}
    }
    }
    }

    میکرو من atmega 32 هست.
    ممنون از شما :nerd:

    #2
    پاسخ : ایجاد یک وقفه با for در زبان c

    منظورتون از وقفه حلقه for هستش؟؟؟
    اگه میخواید که وقتی یه پین 1 شد از حلقه خارج بشه 2 تا کار میشه کرد:
    1- استفاده از دستور break
    2- برید توی روتین وقفه خارجی و اونجا مقدار متغیر حلقه for رو برابر آخرین حد اون بذارید. یعنی f=250 , j=40 ,k=80
    www.gam-co.blogsky.com

    دیدگاه


      #3
      پاسخ : ایجاد یک وقفه با for در زبان c

      ممنون از جوابتون
      میبخشید منظورم را بد گفتم. منظور من از وقفه , INTRUPT نیست. منظورم اینه که برای مدتی میکرو وقت تلف کند مگر اینکه پین C.7 یک شود که در آن موقع دیگر نیازی به زمان بیشتر برای اتلاف نیست. پین های مربوط به اینتراپت خارجی من مشغول هستند وتنها راهی که به ذهن من رسید ایجاد سه حلقه ی FOR برای داشتن اتلاف زمان قابل کنترل با پین C.7 است.

      دیدگاه


        #4
        پاسخ : ایجاد یک وقفه با for در زبان c

        اگر با یک شدن pinc.7 قصد دارید که از حلقه ها خارج شوید پس چرا متغیرها رو صفر میکنید؟
        با این کار تاخیر از اول شروع میشه
        همون راه حل دوم که در پست قبل اشاره شد جواب میده
        بعداز if به جای اینکه متغیرها رو صفر کنید برابر با حداکثرش (یا مقدار بیشتر) کنید

        دیدگاه


          #5
          پاسخ : ایجاد یک وقفه با for در زبان c

          ممنون از شما
          اینکه گفتید اعداد متغیر ها رو حداکثر بدم ,انجام دادم ولی باز درست نشد.خواستم اگر c7 یک شد به GETNUM جامپ بکنم , پس دیگه نگران تکرار حلقه نبودم.
          چون مدارشم بورد کردم فقط پورتای c6 c7 آزاد دارم به همین دلیل باید با نرم افزار این پورتارو دائم چک کنم.
          الان هر وقت دستگاه و ران میکنم چه c7 یک باشه چه صفر این سه حلقه تاخیرو کامل انجام میده. انگار اصلا c7 چک نمیشه..!
          لطفا اگر این روش کار نمیکند, در مورد روش دوم کمی بیشتر توضیح میدهید؟
          ممنون

          دیدگاه


            #6
            پاسخ : ایجاد یک وقفه با for در زبان c

            آره حق باشماست
            اگر شرط عمل کنه به getnum میپره و نیازی به حداکثر کردن متغیرها نیست
            حرف من درست نبود و عذرخواهی میکنم
            کدتون بهم ریخته و کاش تو پنجره مخصوصش میذاشتید
            اون سمیکالن پشت if برای چیه؟

            دیدگاه


              #7
              پاسخ : ایجاد یک وقفه با for در زبان c

              ممنون از لطفتون. خواهش میکنم
              این کدمه. البته وقتی گرفتم که متغیر ها رو حداکثر کرده بودم

              [code=cpp]for (j=0;j<400;j++)
              { for (f=0;f<250;f++)

              {
              for (k=0;k<20;k++)
              {
              if (PORTC.7==1);
              { j=400;
              k=20;
              f=250;
              goto GETNUM;}
              }
              }
              } [/code]

              با تشکر

              دیدگاه


                #8
                پاسخ : ایجاد یک وقفه با for در زبان c

                این کار کاملا اشتباهه !
                ایجاد تاخیر با انجام کارهای زیاد نباید ایجاد کرد !
                اولین اشکالش اینه که شما در زمانی که میخاهید تاخیری ایجاد شود دارید از cpu به شکل 100% کار میکشید
                دومین اشکالش اینه که این زمان تاخیر به سرعت cpu کاملا بستگی داره و هرچه سرعت بالاتر باشه کمتر طول میکشه
                سومین اشکالش اینه که در زمانی که این تاخیر در حال انجام هست کار دیگری به درستی انجام نمیشه چون cpu درگیره , کار دیگه مثل تایمرهائی که در ترد های دیگری در حال انجامند و نباید در انجام کارهاشون خللی ایجاد کرد
                اصلا اینکار کلا غیرمنطقیه

                دیدگاه


                  #9
                  پاسخ : ایجاد یک وقفه با for در زبان c

                  بله حق با شماست راه خوبی برای ایجاد تاخیر نیست ولی راستش چاره ی دیگری ندارم. چون روی برد زدم و الان میخواهم تغییر در سیستم ایجاد کنم وفقط دو پورت c6 c7 دراختیار دارم. از طرفی در مدت تاخیر کار دیگری از میکرو جز چک کردن همین پایه ها , نمی خواهم.از طرفی تاخیر با دقت خیلی زیاد هم نمیخواهم. به همین دلیل این راه به نظرم رسید. که البته کار هم نکرد..!! :cry: :redface:

                  دیدگاه


                    #10
                    پاسخ : ایجاد یک وقفه با for در زبان c

                    از حلقه while استفاده کنید.
                    کد:
                    while(PORTC.7==0){};
                    goto GETNUM;
                    و یا
                    کد:
                    while(1){
                    if(PORTC.7==1)
                    break;
                    }
                    goto GETNUM;
                    www.gam-co.blogsky.com

                    دیدگاه


                      #11
                      پاسخ : ایجاد یک وقفه با for در زبان c

                      while هم مثل for همون اشکالاتی که بالا گفتم داره و هیچ فرق نمیکنه که نوع دستور حلقتونو تغییر بدید
                      برای ایجاد تاخیر به شکل صحیح یک دستور وجود داره که اجرای ترد جاریو تا مدت زمان لازم متوقف میکنه , در هر زبانی که مینویسید سرچ کنید تا دستور مربوط به آن زبان پیدا کنید

                      دیدگاه


                        #12
                        پاسخ : ایجاد یک وقفه با for در زبان c

                        اگر در بین تاخیر نیاز دارید چیزی چک شه و در صورت true بودنش از تاخیر خارج شید باید یک تایمر در تردی دیگر ایجاد کنید , به شکلی که آقا وحید هم گفتند میتونید استفاده کنید اما توجه داشته باشید در ترد جاری انجام میشه و مشکلاتی داره

                        دیدگاه


                          #13
                          پاسخ : ایجاد یک وقفه با for در زبان c

                          بله دوست عزیز. من فقط اینو نوشتم که کار دوستمون راه بیفته همین.
                          cpu همیشه کلا توی حلقه وایل داره کار میکنه و ربطی به عملکرد تایمر ها و وقفه ها نداره.
                          منظورتون از این جمله رو هم نفهمیدم:
                          برای ایجاد تاخیر به شکل صحیح یک دستور وجود داره که اجرای ترد جاریو تا مدت زمان لازم متوقف میکنه , در هر زبانی که مینویسید سرچ کنید تا دستور مربوط به آن زبان پیدا کنید
                          اگه منظورتون تابع delay هستش که خود delay هم در واقع یه حلقه for هستش که با توجه به مقداری که بهش میدیم و همینطور کلاک میکرو میزان تاخیر رو تنظیم میکنه. یعنی این هم در واقع یه حلقس.
                          اگه که منظورتون delay نیس پس منظورتون چیه؟ توی زبان c چه دستوری چنین کاری انجام میده؟ وقفه تایمر؟
                          مرسی
                          www.gam-co.blogsky.com

                          دیدگاه


                            #14
                            پاسخ : ایجاد یک وقفه با for در زبان c

                            بله منظورم delay هست اما delay یک for که cpu به کار بگیره نیست شما اینو طبق چی می فرمائید؟ delay باید بر طبق چیزی که گفتم طراحی شده باشه در غیر اینصورت غیر علمی است , اگر واقعا اینطور باشه که شما می فرمائید در کدویژن اینطور ساخته شده و این بخاطر محدودیت هاست و در زبان هائی مثل c# توسط thread ها و متوقف کردن آنها اینکار انجام میشه و در لحظه توقف پردازش به شدت کم است برعکس اینکار که پردازش به شدت بالاست
                            اون دستور while هم که در main برنامه می گید ایجاد تاخیر نمیکنه یعنی cpu bound نیست به همین دلیل مشکلی در عملکرد چیزی ایجاد نمیکنه
                            اگر توسط حلقه بخاهید cpu bound ایجاد کنید که از این طریق بخاد تاخیر ایجاد شه اینکار خیلی غیر فنی است و در آن لحظات تاخیر cpu با نهایت قدرتش داره کار میکنه و ترد جاریو درگیر میکنه
                            thread بحثش مفصله , در کل اینجور تصور کنید که اشتباه در درک صحیح ترد ها میتونه به همچین چیزی منجر شه که مثلا در ویندوز یک دکمه در برنامه بزنید و دیگر برنامه تا پایان کار آن دکمه فریز شه

                            دیدگاه


                              #15
                              پاسخ : ایجاد یک وقفه با for در زبان c

                              نکاتی که دوستان در مورد نحوه اعمال تاخیرمطرح می کنند بجاست
                              ولی از اونا که بگذریم علت کار نکردن کد شما چیز دیگس- دوتا اشکال در کدش هست
                              اولا برای چک کردن ورودی چرا از رجیستر PORT استفاده می کنید؟
                              دوما چرا بعد از if سمیکالن میذارید؟ با گذاشتن سمیکالن، چه شرط درست باشه و چه نباشه کاری انجام نمیده
                              کد:
                                for (j=0;j<400;j++)
                                            { for (f=0;f<250;f++) 
                                 
                                            { 
                                             for (k=0;k<20;k++)
                                             {  
                                              //if (PORTC.7==1);//??!!
                                              (if PINC.7==1)
                                              { j=400;
                                              k=20;
                                              f=250;
                                              goto GETNUM;}
                                             }
                                            } 
                                            }

                              دیدگاه

                              لطفا صبر کنید...
                              X