اطلاعیه

Collapse
No announcement yet.

نکته ای در کدنویسی

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

    نکته ای در کدنویسی

    مدتی است که به خاطر مشغله بسیار زیاد فرصت مراجعه و مشارکت در بحث ها چندان برایم فراهم نبوده است (البته افت شدید علمی این انجمن و تا حدی دور شدن ماهیت آن از یک انجمن علمی هم در عدم وجود انگیزه برای اختصاص وقت بی تاثیر نیست).
    امروز که بعد از مدتی فرصتی فراهم شد، به نظرم رسید برای دوستان فعال و باهوشی که کمابیش در انجمن حضور دارند صورت مسئله ای را مطرح کنم تا شاید یکی از صدها نکته و به اصطلاح فوت و فن کوزه گری در برنامه نویسی در قالب این سوال مطرح و روشن شود. در صورت بازخورد مثبت شاید این نوع صورت مسئله ها ادامه یابد.

    فرض کنیم در برنامه ای لازم باشد تاخیر هایی را با مقادیر گوناگون از طریق متغیری تعریف کنیم و در هرجایی از تابع main که لازم باشد، به آن متغیر مقدار بدهیم و منتظر صفر شدن آن بمانیم. این متغیر در ابتدا به صورت عمومی تعریف می شود:
    [code=c]volatile unsigned int delay;[/code]
    این متغیر در روتین وقفه یک تایمر (مثلا با فاصله زمانی 1ms)به شکل زیر کاهش می یابد:
    [code=c]if(delay) delay--;[/code]
    بنابراین برای ایجاد تاخیر، در تابع main در هرجایی که لازم باشد به این متغیر مقدار دهی را انجام می دهیم و برای صفر شدن آن منتظر می مانیم:
    [code=c]delay=DELAY_VALUE;
    while(delay);[/code]
    اگر فرض کنیم که هیچ وقفه دیگری به جز وقفه تایمر وجود نداشته باشد، اتفاقی که در عمل پیش می آید این است که تاخیر مورد نظر ممکن است درست عمل کند و ممکن است با خطای زیادی همراه باشد و شرط حلقه while در زمان درست عمل نکند.
    سوال چالشی در این پست این است که دلیل ایجاد این خطای زیاد که جنبه random هم دارد چیست و با چه تمهیداتی می توان این مشکل را برطرف نمود؟
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    #2
    پاسخ : نکته ای در کدنویسی

    سلام
    ممنون مهندس بابت همه راهنماییهایی که به من و دیگران میکنید
    والا دقیقا نمیدونم دلیل همین میتونه باشه یا نه
    ولی منم تقریبا از این روش تو برنامه نویسی هام استفاده میکنم و مشکل مشابهی برای پیش می آمد
    تا جایی که فهمیدم نباید شرط ها رو بدون مقدار بذارم و این کارو کردم مشکل برطرف شد
    مثلا بجای :

    [code=c] if(delay) delay--;[/code]

    نوشتم

    [code=c] if( delay > 0) delay--; [/code]

    یا برای While

    [code=c]delay=DELAY_VALUE;
    while(delay >= 1);
    [/code]

    امیدوارم درست منظورتونو متوجه شده باشم
    درایور شبکه و nRF24L01
    کاتالوگ محصولات
    کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
    شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
    فروش اسيلوسکوپ GWinstek GOS-630FC

    دیدگاه


      #3
      پاسخ : نکته ای در کدنویسی

      با سلام.
      من دقیق سوال رو متوجه نشدم اما به زعم خودم و طبق فهم خودم از مساله نظرم رو میگم:
      حرف شما کاملا درسته اگر من فقط یک وقفه داشته باشم و در اون وقفه متغیر تاخیر رو کم کنم این مساله درست عمل می کنه اما در عمل این چنین چیزی وجود نداره و ممکنه در یک زمان چندین وقفه با اولویت های مختلف وجود داشته باشن که اگر هر کدوم از وقفه های دیگه از اولویت بالاتری نسبت به وقفه ی تاخیر برخوردار باشن عملا تابع تاخیر ما را دچار مشکل می کنن.
      شاید در سری مگا و تاینی این چنین چیزی وجود نداشت اما در سری ایکس مگا چون می توان در هر لحظه ترتیب اولویت وقفه ها را تعیین کرد پس به نظر من باید یا باید اولویت وقفه ی تاخیرمونو را در حالت HIGH قرار بدیم و یا اینکه قبل از اینکه بخوایم تابع تاخیر رو اجرا کنیم اولویت اون وقفه رو High کنیم و سپس بعد از اجرای وقفه تاخیر ترتیب را به حالت قدیم برگردانیم.
      راه حل دومی که من فکر می کنم می تونه مفید باشه اینه که می تونیم قبل از اجرای تابع تاخیر و یا وقفه ی تاخیر وقفه های دیگر را به کلی غیر فعال کرده و سپس بعد از اجرای وقفه تاخیر اونا رو فعال کنیم.
      براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

      دیدگاه


        #4
        پاسخ : نکته ای در کدنویسی

        باز دقیق مطمعا نیستم ولی شاید هم بخاطر این باشه که میکرو های 8 بیتی برای کار با متغییر های بیش از 8 بیت مثلا اینجا 16 بینی نیاز به چندید پالس ساعت داره
        و ممکنه وسط عملکرد میکرو بر روی متغییر 16 بیتی مثلا قسمت با ارزش را بررسی کرده یک دفعه وقفه تایمر میرسد و وسط کار میکرو به روتین رفته و متغییر مربوط به تاخییر را تغییر میدهد
        در بازگشت دیگر مشخص نیست چه اتفاقی افتاده و ممکنه شرط به درستی اجرا نشود
        درایور شبکه و nRF24L01
        کاتالوگ محصولات
        کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
        شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
        فروش اسيلوسکوپ GWinstek GOS-630FC

        دیدگاه


          #5
          پاسخ : نکته ای در کدنویسی

          با سلام.
          دلایل فراوانی برای عدم صحت مقدار تاخیر وجود دارد. یک دلیل ان ریست نکردن مقدار تایمر در حال شمارش در زمان مقدار دهی به متغیر تاخیر میباشد(نا همزمانی). به عنوان مثال ممکن است درست زمانی که به متغیر مقداری داده شده وقفه تایمر رخ دهد و بدون اینکه واقعا 1ms طی شده باشد مقدار متغیر یک واحد کم شود. از این لحاظ برای تاخیر های کمتر خطای بیشتری بدست میآید.
          مورد مهمتر اینکه همانطوری که جناب بیرامی اشاره کردند ممکن است درست در وسط دستور مقدار دهی 16 بیتی وقفه رخ دهد و مقدار رجیستر 8 بیتی مربوط به بایت پر ارزش دست کاری شود، که بسته به مقدار بایت پر ارزش ممکن است خطاهای بسیار بزرگی ایجاد کند. البته این مورد به معماری میکروکنترلر و کامپایلر نیز وابسته است.
          مثال: مثلا اگر مقدار تاخیر مورد نظر برابر 256 باشد و کامپایلر ابتدا بایت پرارزش را مقدار دهی کند مقدار بایت پر ارزش برابر 1 خواهد شد. چنانچه قبل از مقدار دهی به بایت کم ارزش وقفه رخ دهد در روتین وقفه مقدار بایت پر ارزش برابر 0 و بایت کم ارزش برابر 255 خواهد شد. بلافاصله بعد از برگشت از روتین وقفه در ادامه مقدار دهی به متغیر ، برنامه مقدار بایت کم ارزش را برابر 0 خواهد کرد. بنابر این به جای 256 میلی ثانیه عملا تاخیر کمتر از یک میلی ثانیه خواهیم داشت.
          راه حل این معضل غیر فعال کردن تایمر و وقفه آن و همچنین ریست کردن مقادیر شمارنده تایمر قبل از مقداردهی به متغیر و فعال کردن مجدد آن پس از مقداردهی میباشد.

          دیدگاه


            #6
            پاسخ : نکته ای در کدنویسی

            با سلام فکر کنم اگر اینجوری نوشته بشه درست بشه
            کد:
            #asm("cli")  
               
            delay=DELAY_VALUE;
            #asm("sei")

            دیدگاه


              #7
              پاسخ : نکته ای در کدنویسی

              من به صورت عملی برنامه را با یک led واسکوپ تست کردم دقیقا مشکل از جایی شروع میشه که مقادیر delay از یک بایت بیشتر میشه مثلا بیشتر از 255
              میشه با غیر فعال کردن وقفه یعنی همونی که در پست قبل نوشته بودم هم مشکل حل نشد

              دیدگاه


                #8
                پاسخ : نکته ای در کدنویسی

                بهتره فایل lst را نگاه کنید و ببینید به ازای دستوراتی که نوشته اید چند خط اسمبلی جایگزین شده و بدین ترتیب خطای کار را کم کنید.
                چند نکته :
                1- حتما مقدار تایمر را در ابتدای فرایند اینتراپت ریست کنید.
                2- میزان پله تغییر تاخیر را زیاد در نظر بگیرید مثلا هر 10 میلی ثانیه یا 100 میلی ثانیه یک واحد از مقدار متغییر delay کم شود.

                روشی که تا به امروز از آن استفاده کرده ام و مخصوصا در کار با ماژول GSM که مدام باید منتظر جواب از طرف مقابل باشه به کار اومده بدین شرح است :
                یاد آوری : چون نیاز به استفاده از زمانهای زیاد در حد 30 ثانیه تا 65 ثانیه به بالا داشتم نوع متغییرهایم بعضا خیلی بزرگه و باعث ایجاد خطا در کار میشه. هدفم از ارایه این مطلب به اشتراک گذاشتن ایده و چیز یاد گرفتن از شما خواننده محترم هست.
                میکروی مورد استفاده ATMEGA8 هست.
                1- همیشه یک تایمر 8 بیتی را برای این کار در نظر گرفته و کار دیگری با آن انجام نمیدهیم.

                [code=c]
                // Timer/Counter 2 initialization
                // Clock source: System Clock
                // Clock value: 7.813 kHz
                // Mode: Normal top=0xFF
                // OC2 output: Disconnected
                TCCR2=0x05;
                TCNT2=0x00;
                OCR2=0x00;

                // Timer(s)/Counter(s) Interrupt(s) initialization
                TIMSK |= (1<<6);
                [/code]

                2- تابع زیر را تعریف کرده و قبل از محل استفاده تاخیر صدا میزنیم.
                متغییر T2_Counter برای زمانهایی در حد بیش از یک اینتراپت تایمر می باشد.
                [code=c]
                #define set_timer2(t) TCNT2 = t
                #define get_timer2 TCNT2
                void Timer_2_Waite_For(unsigned int Delay)
                {
                #define MAX_T2 255 // f_T2 = 8713 Hz then MAX_T2 = 32.76 msec
                #define _1mSEC_T2 8731 // f_T2 = 8713 Hz then MAX_T2 = 32.76 msec

                char temp;
                T2_Counter = (long)Delay * _1mSEC_T2 / 1000; // Delay * 8.731
                if(T2_Counter > (MAX_T2+1))
                {
                temp = T2_Counter%256;
                set_timer2(MAX_T2-temp);
                T2_Counter -= temp;
                }
                else
                {
                set_timer2(MAX_T2-T2_Counter-1);
                T2_Counter = 0;
                }
                Flag_T2 = OFF;
                }
                [/code]

                3- اینتراپت تایمر را هم به صورت زیر استفاده میکنیم.

                [code=c]
                // ---------- Waite_For() ----------
                static char Flag_T2 = OFF; // for check end of time
                static unsigned long int T2_Counter = 0;

                // Timer2 overflow interrupt service routine
                interrupt [TIM2_OVF] void timer2_ovf_isr(void)
                {
                // Place your code here
                if(T2_Counter != 0)
                {
                T2_Counter -= 256;
                set_timer2(0);
                }
                else
                {
                Flag_T2 = ON;
                }
                }
                [/code]

                4- به صورت زیر در برنامه استفاده میکنیم:

                [code=c]
                Timer_2_Waite_For(300); // 300msec
                while(Flag_T2 != ON)
                {
                // do ...
                }

                [/code]

                دیدگاه


                  #9
                  پاسخ : نکته ای در کدنویسی

                  اگه درست متوجه شده باشم موردی که جناب طراح عنوان کردند به دلیل وقفه های تو در تو و اولویت و اینجور چیزها نیست. این موارد خطاهای ناچیزی توی تأخیر نهایی دارند. بالأخره وقفه که گم نمیشه که! بعد از یه مدت زمان کوتاهی اجرا میشه.

                  همونطور که دوستمون گفتند، به نظر من هم مشکل اصلی اینجاست که شما دارید متغیر عمومی رو دستکاری می کنید و معلوم نیست دقیقاً همون لحظه ای که دارید دستکاریش می کنید وقفه اومده یا نه. فرض کنید توی حلقه اصلی برنامه دارید متغیر delay رو تغییر میدید که ممکنه دو بایتی یا 4 بایتی باشه و چندین دستورالعمل برای تغییر مقدارش طول بکشه. درست در همین لحظه وقفه فرا می رسه و دیگه مقدار متغیر اون چیزی که شما می خواید نخواهد بود.

                  راه حل اصلی اینه که این متغیر نباید در دو جای مختلف مقدار دهی بشه. میشه از flag استفاده کرد یا وقفه رو غیر فعال کرد. راهی که همیشه من ازش استفاده می کنم اینه که فقط و فقط یک جا توی وقفه تایمر، متغیر عمومی رو ++ می کنم. معمولاً هم 4 بایتی در نظر می گیرمش که با وقفه 1ms تقریباً تا 3 سال متمادی! می تونه شمارش رو انجام بده.
                  [code=C]
                  delay_1ms++;[/code]
                  حالا یه تابع تعریف می کنم به نام my_delay با گام تأخیر 1ms که هر جای روتین اصلی برنامه دلم خواست صدا بزنمش:
                  [code=C]
                  void my_delay(unsigned long int delay_value){
                  unsigned long int final_time = delay_1ms + delay_value;
                  while(delay_1ms < final_time) ;
                  }[/code]
                  بیایید با Google آشتی کنیم!

                  دیدگاه


                    #10
                    پاسخ : نکته ای در کدنویسی

                    نوشته اصلی توسط محمد رستمی
                    اگه درست متوجه شده باشم موردی که جناب طراح عنوان کردند به دلیل وقفه های تو در تو و اولویت و اینجور چیزها نیست. این موارد خطاهای ناچیزی توی تأخیر نهایی دارند. بالأخره وقفه که گم نمیشه که! بعد از یه مدت زمان کوتاهی اجرا میشه.

                    همونطور که دوستمون گفتند، به نظر من هم مشکل اصلی اینجاست که شما دارید متغیر عمومی رو دستکاری می کنید و معلوم نیست دقیقاً همون لحظه ای که دارید دستکاریش می کنید وقفه اومده یا نه. فرض کنید توی حلقه اصلی برنامه دارید متغیر delay رو تغییر میدید که ممکنه دو بایتی یا 4 بایتی باشه و چندین دستورالعمل برای تغییر مقدارش طول بکشه. درست در همین لحظه وقفه فرا می رسه و دیگه مقدار متغیر اون چیزی که شما می خواید نخواهد بود.

                    راه حل اصلی اینه که این متغیر نباید در دو جای مختلف مقدار دهی بشه. میشه از flag استفاده کرد یا وقفه رو غیر فعال کرد. راهی که همیشه من ازش استفاده می کنم اینه که فقط و فقط یک جا توی وقفه تایمر، متغیر عمومی رو ++ می کنم. معمولاً هم 4 بایتی در نظر می گیرمش که با وقفه 1ms تقریباً تا 3 سال متمادی! می تونه شمارش رو انجام بده.
                    [code=C]
                    delay_1ms++;[/code]
                    حالا یه تابع تعریف می کنم به نام my_delay با گام تأخیر 1ms که هر جای روتین اصلی برنامه دلم خواست صدا بزنمش:
                    [code=C]
                    void my_delay(unsigned long int delay_value){
                    unsigned long int final_time = delay_1ms + delay_value;
                    while(delay_1ms < final_time) ;
                    }[/code]
                    باسلام
                    در ابتدا از استاد کی نژاد تشکر میکنم به خاطر وقتی که گذاشتند و امیدوارم این تاپیک ادامه داشته باشه و سوالات بیشتری توسط ایشون و یا حتی بچه های دیگه ارائه بشه .خیلی میتونه مفید واقع بشه.
                    در ادامه خدمت دوست عزیزمون "محمد رستمی" (هم اسم و فامیلی داداشم )باید عرض کنم که
                    با نظر شما موافقم و راه حلتون هم به نظر بنده زیبا بود و البته به نظرم در قسمت تابع برای حل مشکل سه سال!(البته اینو می دونم که در طی سه سال احتمالش کمه که میکرو جدا از زنده بودن حتی ریست هم نشه! oo: ) میشه بعد از while شرطی رو گذاشت که در صورتی که delay_1ms بزرگتر مساوی عدد بزرگ با اختلاف مثلا چند هزار (یا حتی بیشتر بسته به برنامه )تا حداکثر یک متغیر 4بایتی که نمیدونم دقیقا چنده و حوصلشم ندارم حساب کنم ، بود delay_1ms رو ریست کنه. :wow:
                    ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                    شهید دکتر مصطفی چمران

                    دیدگاه


                      #11
                      پاسخ : نکته ای در کدنویسی

                      نوشته اصلی توسط طراح
                      مدتی است که به خاطر مشغله بسیار زیاد فرصت مراجعه و مشارکت در بحث ها چندان برایم فراهم نبوده است (البته افت شدید علمی این انجمن و تا حدی دور شدن ماهیت آن از یک انجمن علمی هم در عدم وجود انگیزه برای اختصاص وقت بی تاثیر نیست).
                      امروز که بعد از مدتی فرصتی فراهم شد، به نظرم رسید برای دوستان فعال و باهوشی که کمابیش در انجمن حضور دارند صورت مسئله ای را مطرح کنم تا شاید یکی از صدها نکته و به اصطلاح فوت و فن کوزه گری در برنامه نویسی در قالب این سوال مطرح و روشن شود. در صورت بازخورد مثبت شاید این نوع صورت مسئله ها ادامه یابد.

                      فرض کنیم در برنامه ای لازم باشد تاخیر هایی را با مقادیر گوناگون از طریق متغیری تعریف کنیم و در هرجایی از تابع main که لازم باشد، به آن متغیر مقدار بدهیم و منتظر صفر شدن آن بمانیم. این متغیر در ابتدا به صورت عمومی تعریف می شود:
                      [code=c]volatile unsigned int delay;[/code]
                      این متغیر در روتین وقفه یک تایمر (مثلا با فاصله زمانی 1ms)به شکل زیر کاهش می یابد:
                      [code=c]if(delay) delay--;[/code]
                      بنابراین برای ایجاد تاخیر، در تابع main در هرجایی که لازم باشد به این متغیر مقدار دهی را انجام می دهیم و برای صفر شدن آن منتظر می مانیم:
                      [code=c]delay=DELAY_VALUE;
                      while(delay);[/code]
                      اگر فرض کنیم که هیچ وقفه دیگری به جز وقفه تایمر وجود نداشته باشد، اتفاقی که در عمل پیش می آید این است که تاخیر مورد نظر ممکن است درست عمل کند و ممکن است با خطای زیادی همراه باشد و شرط حلقه while در زمان درست عمل نکند.
                      سوال چالشی در این پست این است که دلیل ایجاد این خطای زیاد که جنبه random هم دارد چیست و با چه تمهیداتی می توان این مشکل را برطرف نمود؟
                      سلام
                      من خودم رو در حدی نمیبینم که بخوام اظهار نظر کنم؛ اونم توی همچین تاپیکی و در محضر چنین اساتیدی

                      اما در موارد آماتوری که من از این حالت استفاده میکنم(معمولا برای اسکن کلید ها یا صدای بیزر) مشکلی که دارم همینه که جناب کی نژاد فرمودن
                      کاری که من انجام میدم اینه که اول بعد از صفر شدن مقدار مورد نظر برای تاخیر، تایمر رو متوقف میکنم! برای اینکه بار روی میکرو کمتر بشه
                      و زمانی که نیاز به استفاده دارم اول مقدار تایمر رو صفر میکنم؛ بعد دوباره اون رو استارت میکنم

                      امیدوارم جوابم زیادی پرت نباشه شرمنده بشم :redface:

                      آموزش ساخت جعبه برای مدار با نرم افزار Corel Draw - آموزش طراحی تابلو ثابت با Corel Draw و LED Tool - آموزش کرک LED Tool

                      116 کتابخانه مورد نیاز برای Altium Designer

                      از دروغ متنفرم؛ هرچند در این مملکت به جرم صداقت، کودن نامیده شوم.

                      دیدگاه


                        #12
                        پاسخ : نکته ای در کدنویسی

                        سلام

                        از روی کنجکاوی یه کدی رو برای تست روی Xmega نوشتم و نتیجه همون بود که آقای کی نژاد تو پست اول اعلام کرده بودن. ریشه مشکل رو پیدا کردام ولی چون تو C تازه کار هستم علتش رو نمی تونم توضیح بدم :rolleyes:

                        این دوتا یه فرقی باهم دارن و محل اخلال تو عملکرد صحیح کد هم همین بودن یا نبودن ; آخر عبارت while هست
                        [code=c] while(delay)
                        while(delay);[/code]

                        دیدگاه


                          #13
                          پاسخ : نکته ای در کدنویسی

                          نوشته اصلی توسط mahdi421
                          این دوتا یه فرقی باهم دارن و محل اخلال تو عملکرد صحیح کد هم همین بودن یا نبودن ; آخر عبارت while هست
                          [code=c] while(delay)
                          while(delay);[/code]
                          مهندس چشم بسته غیب گفتی .معلومه یه تفاوتی باهم دارند ولی این تفاوت یکم از حدش گذشته .من الان نگرانم که برنامه تون در حالتی که سمی کالن نذاشتید کامپایل هم شد؟و شما پروگرام هم کردی؟
                          ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                          شهید دکتر مصطفی چمران

                          دیدگاه


                            #14
                            پاسخ : نکته ای در کدنویسی

                            سلام
                            من گفتم تازه کارم اما شما یکم پیازداغشو زیاد کردین

                            به دوتا کد زیر نگاه کنید

                            [code=c] delay=500;
                            while(delay)
                            PORTE_OUTSET=255;

                            delay=500;
                            while(delay)
                            PORTE_OUTCLR=255;[/code]

                            [code=c] delay=500;
                            while(delay);
                            PORTE_OUTSET=255;


                            delay=500;
                            while(delay);
                            PORTE_OUTCLR=255;[/code]


                            کد اولی درست کار میکنه ولی دومی نه. در کل منظورم این بود که حلقه while احتمالا نباید بدونه دستور باشه


                            دیدگاه


                              #15
                              پاسخ : نکته ای در کدنویسی

                              نوشته اصلی توسط mahdi421
                              سلام
                              من گفتم تازه کارم اما شما یکم پیازداغشو زیاد کردین
                              PORTE_OUTCLR=255;[/code]
                              من چاکرتم :byeقصد جسارت نداشتم ولی قبول کن من از کجا می باس متوجه بشم که بعدش کدی رو گذاشتی .
                              در ثانی اینم بدون وقتی چیزی نمیگذاری دستور NOP در حال اجراست و همچین هم خالی خالی نیست.و نکته دیگه اینکه بهتره کدت رو اینطور بنویسی :
                              کد:
                                  while(delay)  PORTE_OUTCLR=255;
                              یا حداقل اینطور
                              کد:
                                  while(delay)
                                      PORTE_OUTCLR=255;
                              تا خوانایی کد بالا بره.بازم ببخشید اگه ناراحت شدی :nice:
                              ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                              شهید دکتر مصطفی چمران

                              دیدگاه

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