اطلاعیه

Collapse
No announcement yet.

چرا میکرو اینجوری میشه ؟

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

    چرا میکرو اینجوری میشه ؟

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

    1- دوستان کسی می دونه به چه دلایلی میکرو ممکنه از دستور while(1); یا از دستور for(;; ); بگذره و دستورات بعدی رو اجرا کنه ؟
    من یه چیز به ذهنم می رسید اونم اینتراپت بود و با دستور disable_interrupts(global); از کار انداختمش .

    2- کسی می دونه چطور باید جلوی نویز رو گرفت ؟ ، علارقم اینکه می گن این میکرو ها نسبت به نویز حساس نیستن ولی در یه محیط بدون نویز مدام براشون اشکال بوجود میاد

    پیشاپیش از راهنماییتون متشکرم
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

    #2
    پاسخ : چرا میکرو اینجوری میشه ؟

    سلام
    دوست عزیز در مورد مشکل دوم میتونید بیشتر توضیح بدید ؟ میکرو شما چه مدلیه ؟ آیا فیوز بیت LVP را از کار انداختید ؟ چرا که اگر میکرو شما دارای قابلیت low voltage programming باشد و غیر فعال نشده باشد ، کافیه که بعد از راه اندازی میکرو ، دستتون را بکشید روی میکرو تا از کار بیفته و وارد حالت low voltage programming بشود .
    بدرود :nerd:
    هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"

    دیدگاه


      #3
      پاسخ : چرا میکرو اینجوری میشه ؟

      نوشته اصلی توسط abolfazlk873
      سلام
      دوست عزیز در مورد مشکل دوم میتونید بیشتر توضیح بدید ؟ میکرو شما چه مدلیه ؟ آیا فیوز بیت LVP را از کار انداختید ؟ چرا که اگر میکرو شما دارای قابلیت low voltage programming باشد و غیر فعال نشده باشد ، کافیه که بعد از راه اندازی میکرو ، دستتون را بکشید روی میکرو تا از کار بیفته و وارد حالت low voltage programming بشود .
      بدرود :nerd:
      از لطفتون ممنون.
      با اینکه از همچین چیزی خبر نداشتم ولی نه ، تو برنامه غیر فعالش کردم:
      #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
      البته من برنامه رو به صورت سریال ICSP ، بارگذاری می کنم و تا الان فکر می کردم برای بارگذاری سریال برنامه از همین LVP استفاده می شه :redface:
      دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

      دیدگاه


        #4
        پاسخ : چرا میکرو اینجوری میشه ؟

        سلام
        این مشکل قبلا برای من اتفاق افتاده بود واقعا کارم زیر سوال رفت اما خدا رو شکر به نتیجه رسیدم
        1- دوستان کسی می دونه به چه دلایلی میکرو ممکنه از دستور while(1); یا از دستور for(;; ); بگذره و دستورات بعدی رو اجرا کنه ؟
        ارتباط سریال یا دو آداپتور بودن در مدارتون وجود ندارد؟ شرط دیگری وجود ندارد که از حلقه خارج بشین؟
        برنامتون رو بزارین بهتر می شه نظر داد؟
        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


          #5
          پاسخ : چرا میکرو اینجوری میشه ؟

          دستوری به اسم while یا for وجود نداره
          یه عبارت شرطی مثل BTFSS برسی میشه و درصورتی که شرط درست نباشه خط بعدی که میتونه دستور GOTO باشه اجرا میشه
          بنابراین به خودی خود میکرو نمیتونه از اون صرفه نظر کنه مگه اینکه یا مقدار عبارت شرط در طول حلقه برنامه تغییر کنه و یا نویزی شدید باعث این تغییر بشه که البته دومی دائمی نمیتونه باشه بنابراین اگه برنامه در محیط های دیگه باز هم همین مشکل داشت احتمالا مشکل اولی باعث شده
          حالا اگه وسط برنامه اینتراپت هم رخ بده بازم تاثیری نداره
          برای جلوگیری از این مشکلات تو محیط های نویز پذیر میشه از WD استفاده کرد
          برای کاهش نویز هم روش های مختلفی وجود داره که فکر کنم در مجله نویز بصورت مفصل بحث شده
          [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

          دیدگاه


            #6
            پاسخ : چرا میکرو اینجوری میشه ؟

            نوشته اصلی توسط ADMlN
            دستوری به اسم while یا for وجود نداره
            یه عبارت شرطی مثل BTFSS برسی میشه و درصورتی که شرط درست نباشه خط بعدی که میتونه دستور GOTO باشه اجرا میشه
            بنابراین به خودی خود میکرو نمیتونه از اون صرفه نظر کنه مگه اینکه یا مقدار عبارت شرط در طول حلقه برنامه تغییر کنه و یا نویزی شدید باعث این تغییر بشه که البته دومی دائمی نمیتونه باشه بنابراین اگه برنامه در محیط های دیگه باز هم همین مشکل داشت احتمالا مشکل اولی باعث شده
            حالا اگه وسط برنامه اینتراپت هم رخ بده بازم تاثیری نداره
            برای جلوگیری از این مشکلات تو محیط های نویز پذیر میشه از WD استفاده کرد
            برای کاهش نویز هم روش های مختلفی وجود داره که فکر کنم در مجله نویز بصورت مفصل بحث شده
            بله ! دوست عزیزمون بسیار عالی توضیح دادن ! کاملا صحیحه . با اجازه منم چندتا روش بزارم !
            اگه میکروتون قفل میکرد ( یعنی دیگه اصلا هیچی اجرا نمیشد ) ین عمل از وقفه ها یا از نویز میتونست باشه ( به احتمال بالای 90% ) . اما شما این مشکل رو ندارین . از wd هم استفاده ی آزاد نکنید بهتره چون ممکنه مشکل ریست شدن پیدا بکنید در بعضی از برنامه ها . همونطور که دوستمون گفتن wd رو فقط در صورتی که در شرایط نویز فوق العاده هستین ، بهتره استفاده کنید . ( کار باهش به صورت حرفه ای واقعا سخته و معمولا در اسمبلی همیشه استفاده میشه و با دستورات شما به مشکل میخوره ) .
            اما مشکل شما به احتمال 90% از برنامه هستش و کار با رجیستر هاتون . 9% هم از stack ها میتونه باشه . شما باید رجیستر هاتون رو چک کنید . احتمالا یک رجیستر رو چندجا باهم استفاده میکنید و به خاطر همین قاط میزنه . این حالت در برنامه های چندبخشی زیاد پیش میاد . من در این جور مواقع رجیسترهای اصلیم رو جای دیگه ( تو رجیستر دیگه ای ) سیو میکنم و بعد از زیربرنامه ی فرعی ، دوباره بارگیری میکنم . یکم سخته دیگه ! اما دقت کنید . فقط به برنامه ی خودتون برمیگرده . مشکل همه هستش ( از جمله خودم !) وقتی برنامه درست کار نمیکنه ، میکرو و کامپایلر و حتا خود کامپیوتر (!) رو میبرم زیر سوال ! فکر میکنم اونا خرابن ! در صورتی که مشکل 99% از خود برنامم بوده و کمتر از یک هزارم درصد از کامپایلر بوده و 1% از میکرو !
            موفق و شاد باشید .
            if all men are the same
            then
            why do women take so long to choose one ?

            دیدگاه


              #7
              پاسخ : چرا میکرو اینجوری میشه ؟

              نوشته اصلی توسط ADMlN
              دستوری به اسم while یا for وجود نداره
              یه عبارت شرطی مثل BTFSS برسی میشه و درصورتی که شرط درست نباشه خط بعدی که میتونه دستور GOTO باشه اجرا میشه
              بنابراین به خودی خود میکرو نمیتونه از اون صرفه نظر کنه مگه اینکه یا مقدار عبارت شرط در طول حلقه برنامه تغییر کنه و یا نویزی شدید باعث این تغییر بشه که البته دومی دائمی نمیتونه باشه بنابراین اگه برنامه در محیط های دیگه باز هم همین مشکل داشت احتمالا مشکل اولی باعث شده
              حالا اگه وسط برنامه اینتراپت هم رخ بده بازم تاثیری نداره
              برای جلوگیری از این مشکلات تو محیط های نویز پذیر میشه از WD استفاده کرد
              برای کاهش نویز هم روش های مختلفی وجود داره که فکر کنم در مجله نویز بصورت مفصل بحث شده
              جناب admin ، از توضیحاتتون خیلی متشکرم .
              من عبارت while1 یا for;; رو برداشتم و جاش این رو گذاشتم:
              loop:
              goto loop;
              ولی باز هم از این دستور می پره و باقی خطوط زیرش رو اجرا می کنه.
              والا من نویز زیادی تو مدارم ندارم . خارج از مدار هم کامپیوترمه ، یه اسپیکره ، آداپتور و دیگر هیچ!
              دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

              دیدگاه


                #8
                پاسخ : چرا میکرو اینجوری میشه ؟

                سلام
                پیشنهادم این هست سورس برنامتون رو کامل قرار بدین
                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                دیدگاه


                  #9
                  پاسخ : چرا میکرو اینجوری میشه ؟

                  نوشته اصلی توسط baby_1
                  سلام
                  این مشکل قبلا برای من اتفاق افتاده بود واقعا کارم زیر سوال رفت اما خدا رو شکر به نتیجه رسیدمارتباط سریال یا دو آداپتور بودن در مدارتون وجود ندارد؟ شرط دیگری وجود ندارد که از حلقه خارج بشین؟
                  برنامتون رو بزارین بهتر می شه نظر داد؟
                  سلام جناب baby_1 . مخلصیم .
                  ارتباط سریال ندارم البته میکرو رو گذاشتم با پایه های ICSP مدام به کامپیوتر وصله و هر وقت بخوام برنامه رو می ریزم توش ، حلقه ام هم فقط همین while(1); یا for(;; یا loop; goto loop; هست و شرط دیگه ای توش نیست . ولی از دو تا آداپتور تو مدارم استفاده می کنم ، یکی 9 ولت که با یه 7805 میشه 5 ولت و یکی هم 12 ولت برای کار روی شیر برقی.
                  البته من الان آداپتور 12 ولت رو از برق کشیدم ، پایه های مخصوص ICSP رو هم از پروگرامر جدا کردم . ولی بازم برای دستگاه مشکل بوجود میاد ، هم مشکل پریدن از حلقه و هم مشکل هنگ کردن.
                  همون طور که در جریان هستید من از ال سی دی دارم استفاده می کنم ، ممکنه مشکل از اون باشه ؟ چون وقتی اون رو برمی دارم دیگه نمی تونم با تاچ یه سری دستورات رو به استپ موتورم بدم ، یعنی دیگه به اونجا نمی رسه.
                  دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                  دیدگاه


                    #10
                    پاسخ : چرا میکرو اینجوری میشه ؟

                    چشم ولی سورس برنامه بدون کتابخونه هایی که دستکاری کردم 1000 خطه !
                    http://wdl.persiangig.com/pages/download/?dl=http://mhjmail.persiangig.com/document/step_e_valve_lcd_touch_buzzer_optoswitch%20all.zip
                    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                    دیدگاه


                      #11
                      پاسخ : چرا میکرو اینجوری میشه ؟

                      نوشته اصلی توسط josef2600
                      اما مشکل شما به احتمال 90% از برنامه هستش و کار با رجیستر هاتون . 9% هم از stack ها میتونه باشه . شما باید رجیستر هاتون رو چک کنید . احتمالا یک رجیستر رو چندجا باهم استفاده میکنید و به خاطر همین قاط میزنه . این حالت در برنامه های چندبخشی زیاد پیش میاد . من در این جور مواقع رجیسترهای اصلیم رو جای دیگه ( تو رجیستر دیگه ای ) سیو میکنم و بعد از زیربرنامه ی فرعی ، دوباره بارگیری میکنم . یکم سخته دیگه ! اما دقت کنید . فقط به برنامه ی خودتون برمیگرده
                      جناب josef2600 از راهنماییتون متشکرم ،
                      من سورس برنامه رو قرار دادم.
                      ولی من مستقیم با رجیستر ها کار نمی کنم ، من فقط تو c با متغیر ها کار می کنم ، حتی تو این برنامه از هیچ وقفه و تامیری هم استفاده نکردم.
                      بعد یه چیز جالب اینکه اگر دو تا حلقه بذارم تو حلقه دوم گیر می کنه و دیگه جلوتر نمی ره در ضمن دیگه مشکل هنگ هم ندارم ( یکی از مشکلات هنگ به هم ریختن ال سی دی بود که الان ال سی دی همونجایی که هست میمونه .- البته شاید هنگ کرده ولی ال سی دی بهم نریخته)
                      البته من به ذهنم رسید تو کتابخونه ال سی دی حتما یه دستور break هست که باعث میشه برنامه از حلقه اول عبور کنه ولی تو حلقه دوم گیر کنه ، ولی بعد با این نتیجه رسیدم که نه ممکن نیست چون وقتی برنامه در حال اجراست باید از آخرین حلقه که توش هست بیاد بیرون و هنگامی که برنامه در حال اجرای کتابخونه هاست داخل این شرط نیست ! باز یه دلیل دیگه هم هست و اون اینه که من مشکل رو تو دستور goto loop هم دیدم که حلقه نیست!
                      دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                      دیدگاه


                        #12
                        پاسخ : چرا میکرو اینجوری میشه ؟

                        دوباره !
                        اول از همه : چرا اینقدر زشت شماتیک رو کشیدی ؟!! خوب صفحه رو بزرگتر کن یا page اضافه کن و ... .
                        دوم : فایل هگز نبود توش ! نتونستم شبیه سازی رو ببینم !
                        سوم : شما یک برنامه ی جدید درست کن و فقط چند دستور ساده رو بزار توی حلقه . ببین جواب میده یا نه .
                        چهارم : محض خنده (!) اگه این روشها جواب نداد ، چندتا nop ( مثلا 5 تا ) بزار توی حلقه . ; آخرش رو هم بزار ! ( مال لیبل ) .
                        if all men are the same
                        then
                        why do women take so long to choose one ?

                        دیدگاه


                          #13
                          پاسخ : چرا میکرو اینجوری میشه ؟

                          سلام
                          من قبلا در پروژه ای که باید با ارتباط سریال کار می کردم و کلی نویز محیطی در کنار دستگاههای صنعتی داشتم دستگام در حالت عادی داده ها رو از کامپیوتر می گرفت و پروسه خودش رو انجام می داد اما وقتی موتورهای سه فاز به دستگاه متصل می شد و مجددا باید پروسه بالا کار می کرد دستگاه به ناگاه از خط while بدون هیچ شرط پرشی که برقرار باشه پرش می کرد (while(1) ) با کلی مشکل فهمیدم که قضیه در انتقال ac محیط از طریق زمین کامپیوتر به برد بود که با تعویض پروتکل max485 به جای rs232 مشکل حل شد.
                          اما حالا به قول جناب "josef2600" بزارین برنامه رو دقیقا چک کنیم ،
                          هم مشکل پریدن از حلقه و هم مشکل هنگ کردن
                          با این حرفتون احتمالا باید مشکل از برنامه باشه
                          دقیقا کجای برنامه ، برنامه از حلقه خارج می شه یا هنگ می کند و دچار مشکل می شه؟ دستگاه ریست نمی شه که شاید فکر کنین از حلقه خارج شده؟

                          تنها در صورتی که پروژه می خواد کاملا عملی بشه
                          خروجی 7805 در حالتی که خازن خروجی کمتر از 10 میکروفاراد باشه کمی unstable هست سعی کنین در قبل و بعد از 7805 هم دو خازن 470 میکرو فاراد برای جلوگیری از جهش از ولتاژ داشته باشین

                          اگر valve ها سلونوییدی هستن خروجی رو بعد از unl با اسنابرهای مختلف محافظت کنین
                          هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                          دیدگاه


                            #14
                            پاسخ : چرا میکرو اینجوری میشه ؟

                            نوشته اصلی توسط josef2600
                            دوباره !
                            اول از همه : چرا اینقدر زشت شماتیک رو کشیدی ؟!! خوب صفحه رو بزرگتر کن یا page اضافه کن و ... .
                            دوم : فایل هگز نبود توش ! نتونستم شبیه سازی رو ببینم !
                            سوم : شما یک برنامه ی جدید درست کن و فقط چند دستور ساده رو بزار توی حلقه . ببین جواب میده یا نه .
                            چهارم : محض خنده (!) اگه این روشها جواب نداد ، چندتا nop ( مثلا 5 تا ) بزار توی حلقه . ; آخرش رو هم بزار ! ( مال لیبل ) .
                            بعد از تشکر:
                            1. من قصدم از شماتیک فقط رسیدن به pcb بوده ،
                            2. حتی خودم هم شبیه سازیش نکردم!
                            3.با این فقط زمانش دیر تر می شه مثلا 20 ثانیه ولی بلاخره میپره بیرون
                            while(1)
                            {
                            delay_cycles(1);
                            delay_cycles(1);
                            delay_cycles(1);
                            #asm
                            nop
                            nop
                            nop
                            nop
                            #endasm
                            }

                            دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                            دیدگاه


                              #15
                              پاسخ : چرا میکرو اینجوری میشه ؟

                              سلام
                              من قبلا در پروژه ای که باید با ارتباط سریال کار می کردم و کلی نویز محیطی در کنار دستگاههای صنعتی داشتم دستگام در حالت عادی داده ها رو از کامپیوتر می گرفت و پروسه خودش رو انجام می داد اما وقتی موتورهای سه فاز به دستگاه متصل می شد و مجددا باید پروسه بالا کار می کرد دستگاه به ناگاه از خط while بدون هیچ شرط پرشی که برقرار باشه پرش می کرد (while(1) ) با کلی مشکل فهمیدم که قضیه در انتقال ac محیط از طریق زمین کامپیوتر به برد بود که با تعویض پروتکل max485 به جای rs232 مشکل حل شد.
                              سلام-از پیگیری شما و اینکه تجربیاتتون رو در اختیار دیگران قرار می دید خیلی متشکرم. :applause:
                              ا این حرفتون احتمالا باید مشکل از برنامه باشه
                              دقیقا کجای برنامه ، برنامه از حلقه خارج می شه یا هنگ می کند و دچار مشکل می شه؟ دستگاه ریست نمی شه که شاید فکر کنین از حلقه خارج شده؟
                              اولین حلقه داخل تابع main این مشکل رو داره که الان چند تا تاخیر هم به توصیه جناب josef2600 براش گذاشتم
                              کد:
                                show_initialization();
                                disable_interrupts(global);
                                show_pic();
                                while(1)
                                {
                                }
                                //delay_ms(2000);
                                if(read_eeprom(f_t_var)!=first_time)
                                {
                                 write_eeprom(f_t_var,first_time);
                                 //
                              تنها در صورتی که پروژه می خواد کاملا عملی بشه
                              خروجی 7805 در حالتی که خازن خروجی کمتر از 10 میکروفاراد باشه کمی unstable هست سعی کنین در قبل و بعد از 7805 هم دو خازن 470 میکرو فاراد برای جلوگیری از جهش از ولتاژ داشته باشین

                              اگر valve ها سلونوییدی هستن خروجی رو بعد از unl با اسنابرهای مختلف محافظت کنین
                              این دو کار رو انجام دادم
                              والو رو کامل جدا کردم ، دو تا خازن هم گذاشتم برای رگولاتورم ( البته 1000 میکرو داشتم که گذاشتم )
                              ولتاژ بعد از رگولاتورم هم اینه :
                              mean:5v & peak2peak:260mv
                              فکر کنم باید اینا رو هم چک کنم :
                              دستورات ال سی دی-یا کلا امتحان سیستم بدون دستورات ال سی دی
                              استپ موتور
                              دستورات ای تو پی رام
                              تا نظر اساتید چی باشه
                              دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                              دیدگاه

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