اطلاعیه

Collapse
No announcement yet.

یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

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

    یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

    با عرض سلام.
    من تازه شروع به یاد گرفتن میکروکنترلر 8051 و برنامه نویسی ان به زبان اسمبلی کرده ام.
    اگر ممکن است به زبان اسمبلی برنامه ای برای تاخیر یک ثانیه ای بنویسید.منظورم این است که این برنامه هر مرتبه یک ثانیه از وقت CPU را بگیرد.هر جوری حساب کردم به 100 میلی ثانیه هم نرسید چه برسد به یک ثانیه.ضمنا برنامه بدون استفاده از تایمرها و وقفه باشد و در ان فقط از دستورات ساده ای مثل DJNZ و MOV استفاده شده باشد.
    ممنونم.

    #2
    پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

    فکر کنم این یک ثاینه باشه. البته دقیق نیست و باید با آزمون و خطا مقدار دقیق رو بدست بیاری.
    در هر صورت قانونش اینه که با حلقه های تو در تو الکی CPU رو معطل کنی. به ساختار زیر برنامه دقت کن: اول 7FH رو مقدار دهی میکنه و بعد اون دو تای دیگه.
    بعد شروع میکنه از آخری یه دونه یه دونه کم کردن. تموم که شد یه دونه از دومی کم میکنه و دوباره سومی رو مقدار دهی میکنه و باقی قضایا.

    ;********************************
    DELAY1S:MOV 7FH,#25
    M1: MOV 7EH,#200
    M2: MOV 7DH,#100
    M3: DJNZ 7DH,M3
    DJNZ 7EH,M2
    DJNZ 7FH,M1
    RET
    ;********************************

    موفق باشی

    دیدگاه


      #3
      پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

      ممنون از جوابتان.اما این تاخیر خیلی بیشتر از یک ثانیه بود.تقریبا 3 ثانیه.البته من محاسبه نکردم و بصورت عملی در پروتئوس امتحان کردم.حالا زیاد مهم نیست.فقط میشه بفرمایید که چطور می توان این برنامه را دستکاری کرد که زمان تاخیرش بشه 60 ثانیه.لطفا یه خورده بیشتر توضیح بدهید.بازم ممنونم.

      دیدگاه


        #4
        پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

        نوشته اصلی توسط kasper
        ممنون از جوابتان.اما این تاخیر خیلی بیشتر از یک ثانیه بود.تقریبا 3 ثانیه.البته من محاسبه نکردم و بصورت عملی در پروتئوس امتحان کردم.حالا زیاد مهم نیست.فقط میشه بفرمایید که چطور می توان این برنامه را دستکاری کرد که زمان تاخیرش بشه 60 ثانیه.لطفا یه خورده بیشتر توضیح بدهید.بازم ممنونم.
        پروتیوسو ولش. در این مورد ممکنه پروتیوس اشتباه کنه. باز مثلاً اگر با نمودار امتحان کنی بهتره ولی خب ...
        اول بذار یه چیزی بگم. ظاهراً این تاخیر ها رو واسه ساعت میخوای. برای چیزی مثل ساعت اگر در هر ثانیه یک میلی ثانیه اشتباه داشته باشه در یک روز میدونی چقدر میشه؟
        برای ساعت میتونی از آیسی های real time clock استفاده کنی مثل ds1307 که یه پروژه هم تو سایت با این آیسی هست.
        ولی به هر حال اگه بخوای اون تاخیر رو که دادم از بیرون 60 بار تکرار کنی باید اینطوری بنویسی:

        کد:
           MOV R0,#60
        LOOP: CALL DELAY1S
           DJNZ R0,LOOP

        اگرم بخوای از تو زیر برنامه رو تغییر بدی باید یه برچسب به خط اولی زیر برنامه بزنی (مثلاً M0) و یه خط روی اون اضافه کنی به این صورت: MOV 7CH,#60 و به آخر برنامه هم این خطو اضافه کنی: DJNZ 7CH,M0

        موفق باشی

        دیدگاه


          #5
          پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

          سلام.خیلی خیلی از شما ممنونم.فقط یه چیز دیگه.ببینید الان شما عدد 60 هگز را در یکی از خانه های رم قرارداده اید.خوب من اگه بخواهم عددی بزرگتر از 256 را در یکی از رجیسترها قرار دهم باید چه کار کنم؟یعنی می خواهم تاخیر را زیاد کنم.ایا دستور DJNZ DPTR,#1000H معتبر است؟اگر نیست پس باید چی کار کنم؟
          حتما باید از حلقه های زیاد استفاده کنم؟می شه بفرمایید چطوری این کارو بکنم؟
          حالا یک سوال دیگه برام پیش اومد.در این حلقه ها زمان تاخیر هر حلقه با حلقه دیگر ضرب می شه یا جمع؟
          در ضمن من این برنامه را برای ساعت نمی خواهم.بازم ممنونم.

          دیدگاه


            #6
            پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

            سلام.
            اگه میخوایی ببینی کدت معتره یا نه تو برنامه keil یا فرانکلین بنویس و تبدیل به هگز کن اگه درست باشه ارور نمیده
            www.icesi.ir

            دیدگاه


              #7
              پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

              دوست عزیز ساخت تاخیر زمانی یک نکته خیلی ساده داره و اونم اینه که هر تاخیری که خواستی بسازی نصف آن تاخیر را در رجیسترات بریز.
              برای مثال اگه میخوای تاخیر 1 ثانیه درست کنی باید سه عدد انتخاب کنی که ضرب آنها 500000 بشه مثلا برای یک ثانیه اعداد 50*100*100 میشه 500000 .
              ***نکته زمان اجرای کد DJNZ در میکرو 8051 2 میکرو ثانیه میباشد.***
              www.icesi.ir

              دیدگاه


                #8
                پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                ممنون از جوابتون.فقط یه سوال دیگه.اگه من بخواهم عددی بزرگتر از 256 را در رجیسترها قرار بدهم تکلیف چیه؟

                دیدگاه


                  #9
                  پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                  نوشته اصلی توسط kasper
                  سلام.خیلی خیلی از شما ممنونم.فقط یه چیز دیگه.ببینید الان شما عدد 60 هگز را در یکی از خانه های رم قرارداده اید.خوب من اگه بخواهم عددی بزرگتر از 256 را در یکی از رجیسترها قرار دهم باید چه کار کنم؟یعنی می خواهم تاخیر را زیاد کنم.ایا دستور DJNZ DPTR,#1000H معتبر است؟اگر نیست پس باید چی کار کنم؟
                  حتما باید از حلقه های زیاد استفاده کنم؟می شه بفرمایید چطوری این کارو بکنم؟
                  حالا یک سوال دیگه برام پیش اومد.در این حلقه ها زمان تاخیر هر حلقه با حلقه دیگر ضرب می شه یا جمع؟
                  در ضمن من این برنامه را برای ساعت نمی خواهم.بازم ممنونم.
                  سلام
                  اولاً 60 هگز نبود 60 دسیمال بود.( اگر بعد از مقدار، هیچ حرفی نذاری دسیمال فرض میکنه)
                  دستور DJNZ DPTR,LABEL معتبر نیست.( این چیزا رو خودتون هم میتونید امتحان کنید ها!)
                  عددی بزرگتر از 256 تو یه بایت جا نمیشه. برای اینکه بتونید تا خیر های گنده درست کنید باید هی اونا رو تو حلقه های متوالی تکرار کنید تا وقت CPU تلف بشه. راه دیگه ای هم نداره(البته تایمر هم میتونه کمک خوبی باشه ولی خب شما گفتین تایمر نباید استفاده بشه)
                  زمان تاخیر به قول شما ضرب میشود.
                  برای این که بفهمید چطوری تاخیر درست کنید برید تو این تاپیک صد تا PDF هست که تو همشون گفته.
                  http://www.eca.ir/forum2/index.php/topic,574.0.html
                  موفق باشید
                  فقط یه چیزی... اگه سوال بعدی که میخوای بپرسی توضیحش تو اون PDF ها که لینک دادم باشه.... :biggrin:
                  اول اونا رو بخون بعد اگه باز هم سوال بود در خدمتیم :agree:

                  دیدگاه


                    #10
                    پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                    سلام.از اینکه پرسیدن این سوال باعث ناراحتی شما شده است معذرت می خواهم.در ضمن من خودم اون دستور که می گید نامعتبر است را قبل از این که از شما بپرسم در فرانکلین امتحان کردم ولی هیچ خطایی نشان نداد.به خاطر همین من شک کردم و .....
                    اصلا یه چیز دیگه.تو این جزوه ها که معرفی کردید برای مثال نوشته که دستور MOV A,#305 اشتباه که خودمم همه این مسائل رو می دونم اما تو فرانکلین هیچ خطایی از دستوری که گفتم نمی گیره.اگه ممکنه یک مقدار در مورد این موضوع توضیح دهید.

                    دیدگاه


                      #11
                      پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                      نوشته اصلی توسط kasper
                      سلام.از اینکه پرسیدن این سوال باعث ناراحتی شما شده است معذرت می خواهم.
                      این چه حرفیه عزیز؟ شما تاج سری :biggrin:

                      در ضمن من خودم اون دستور که می گید نامعتبر است را قبل از این که از شما بپرسم در فرانکلین امتحان کردم ولی هیچ خطایی نشان نداد.به خاطر همین من شک کردم و .....
                      اصلا یه چیز دیگه.تو این جزوه ها که معرفی کردید برای مثال نوشته که دستور MOV A,#305 اشتباه که خودمم همه این مسائل رو می دونم اما تو فرانکلین هیچ خطایی از دستوری که گفتم نمی گیره.اگه ممکنه یک مقدار در مورد این موضوع توضیح دهید.
                      راستش من خودم با فرانکلین کار نمیکنم. کد هامو توی Notepad مینوسیم و ذخیره میکنم و با Intel mcs-51 cross assembler اسمبل میکنم.(چیز خاصی نیست همون اسمبلر تحت داسه)
                      بعد برای این که ببینم اروری داشتم یا نه به فایل .lst مراجعه میکنم. این که فرانکلین شما از MOV A,#305 اشکال نمیگیره عجیبه!
                      در کل پیشنهاد میکنم تو همون ناتپد تایپ کنی. من که اینجوری راحت ترم. در ضمن من این قضیه ارور نگرفتن رو میرم بررسی میکنم . قضیه مشکوکه.

                      فعلاً

                      دیدگاه


                        #12
                        پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                        من رفتم اینو تو فرانکلین زدم بعد تو فایل LST نگاه کردم خطا گرفته بود. شما چطور میگی خطا نمیگیره؟
                        خلاصه اگه خواستی اسمبلر تحت داس رو برات پلود میکنم. کار باهاش راحت تره. فایل اسمبلی رو درگ میکنی میندازی روی آیکونش برات اسمبل میکنه همونجا.

                        دیدگاه


                          #13
                          پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                          سلام.خوب من تو فایل LST. را تابحال نگاه نکرده بودم و منظور من از اینکه ارور نمی ده تو خود فرانکلین بود.تازه تو فایل LST. اون دستورو به عنوان هشدار(وارنینگ) در نظر گرفته بود نه ارور.حالا نمی دونم چطوری واسه شما ارور گرفته.اصلا تو فرانکلین که دیگه نباید به فایل LST. نگاه کرد.چون خودش باید ارورها را بگه.در ضمن برای چی با فرانکلین کار نمی کنید؟منظورم اینه که اگه کامپایلر مناسبی نیست و مشکل داره بگو تا دیگه منم باهاش کار نکنم.عوضش یه لینکی از اون کامپایلر که خودتون گفتید بزارید(واسه دانلود)که خیلی از شما ممنون می شم.ضمنا تو فایل LST. اینو نوشته بود به عنوان هشدار:
                          WARNING #53 IN LINE 2 OF TEST1.asm : VALUE HAS BEEN TRUNCATED TO 8 BITS
                          مثل اینکه مقدار 305 رو کوتاه کرده تا 8بیت و بقیشو زده!
                          اصلا این حرفهارو ولش کن.من از این قضیه خودمو کشیدم کنار.یه سوال دیگه دارم..تو همین فرانکلین چرا بعضی وقتها برنامه را که می نویسی و کامپایل را می زنی برنامتو کامپایل می کنه اما یک پیام به این شرح هم می دهد:OUT OF CODE
                          می خواستم بدونم که قضیه این پیام چیه؟ ایا خطایی تو برنامه بوده یا .....

                          دیدگاه


                            #14
                            پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                            نوشته اصلی توسط kasper
                            برای چی با فرانکلین کار نمی کنید؟منظورم اینه که اگه کامپایلر مناسبی نیست و مشکل داره بگو تا دیگه منم باهاش کار نکنم.
                            عوضش یه لینکی از اون کامپایلر که خودتون گفتید بزارید(واسه دانلود)که خیلی از شما ممنون می شم.
                            ....
                            یه سوال دیگه دارم..تو همین فرانکلین چرا بعضی وقتها برنامه را که می نویسی و کامپایل را می زنی برنامتو کامپایل می کنه اما یک پیام به این شرح هم می دهد:OUT OF CODE
                            می خواستم بدونم که قضیه این پیام چیه؟ ایا خطایی تو برنامه بوده یا .....
                            سلام . ببخشید که دارم دیر جواب میدم. جوابت پریروز حاضر بود ولی از اون موقع تا حالا نتونستم وارد سایت بشم :sad:
                            من خودم از همون اول با ناتپد کد مینوشتم . بعدشم فرانکلین رو امتحان کردم و به خاطر همین عدا بازی هاش ولش کردم.
                            البته مطمئنم من نتونستم درست باهاش کار کنم ولی به هر حال چیز خاصی توش ندیدم که منو مجبور کنه به ناتپد ترجیحش بدم.
                            (تازه من حتی نمیدونم چجوری باید با فرانکلین کد هگز تولید کرد. الان میزنم این کارو نمیکنه. فکر کنم درست حسابی کرکش نکردم)

                            در هر صورت در این مورد باید دوستانی که با فرانکلین کار کردند باید کمکتان کنند.
                            اینم لینک دانلود اسمبلر تحت داس: (فایل اسمبلی رو درگ کنید روی asm51.exe . یک فایل .obj ایجاد میشه که اون رو باید درگ کنید روی oh.exe )
                            http://www.4shared.com/file/21261989/7148b451/8051assembler.html

                            دیدگاه


                              #15
                              پاسخ : یک برنامه کوچک تاخیر یک ثانیه ای می خواستم

                              سلام و ممنون از لطفتون.من این مطلب را چند روز پیش می خواستم بنویسم اما به اینترنت دسترسی نداشتم.
                              راستش این کامپایلر که شما معرفی کردی کار نکرد.نمی دونم مشکل از چی بود ولی هر فایلی حتی با پسوند ASM. را روش میندازم همون ارور همیشگی محیط DOS را می دهد که دو گزینه CANCEL و IGNORE دارد.اصلا ولش کن.من با همون فرانکلین کار می کنم.اخه هنوز اونقدر حرفه ای نشدم که فرانکلین واسم کافی نباشه.بازم از لطف شما خیلی ممنونم.فقط یه سوال دیگه.
                              کسی می دونه که علت پیام OUT OF CODE در فرانکلین چیه؟این پیام هنگام کامپایل کردن بعضی از برنامه ها ظاهر می شود و در ظاهر ارور به حساب نمی اید.چون کامپایلر کد هگز برناممو می سازه.پس علت این پیام چیه؟

                              OUT OF CODE

                              دیدگاه

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