با سلام ،
دوست عزیز شما در حال استفاده از ورژنی قدیمی از اینترنت اکسپلورر هستید ، برای اینکه مشکلات ناشی از نمایش را نداشته باشید ، لطفا اقدام به دریافت مرورگری مناسب کرده و یا از ورژن قدیمی ما استفاده نمایید.


موضوع بسته شده است 
امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل حل شد فرق میان دو برنامه ساده
#1
سلام به همه

من دو تا برنامه خیلی ساده برای مدار زیر نوشتم که با فشار دادن دگمه ای که به Portb.b7 وصله LEDی که به Portb.b0 وصله روشن بشه.

İmage

کد:
        CLRF    0x06
        BSF    0x03,    5
        MOVLW    0xFE
        MOVWF    0x86
        BCF    0x03,    5
               
START        BTFSC    0x06,    7
        BSF    0x06,    0
        GOTO    START        
   
        END


کد:
        CLRF    0x06
           BSF    0x03,    5
           MOVLW    0xFE
           MOVWF    0x86
           BCF    0x03,    5
               
START        BTFSS    0x06,    7
           GOTO    START
           BSF    0x06,    0        
   
           END

همونطور که میبینین در یکی از برنامه ها تست دگمه رو با دستور BTFSS انجام دادم و در برنامه دیگه با دستور BTFSC و در هر دو برنامه LED روشن میشه و تا اینجا درست.

ولی در برنامه ای که با دستور BTFSS نوشتم LED بعد از اینکه دستم رو از روی دگمه برمیدارم خاموش میشه.

حالا این سوالا برام پیش اومده
با اینکه از دستوری برای خاموش کردن LED استفاده نکردم چطور میشه که LED خاموش میشه؟ یعنی وقتی من یه بیتی رو Set میکنم چطور ممکنه خود به خود Reset بشه؟

ضمنا چطور میشه بعد از دستور BSF که آخرین دستور هست برنامه دوباره وضعیت دگمه رو تست میکنه؟ همونطور که میبینین دستور BSF بیرون حلقه هستش و ضمنا آخرین دستور هم هست و باید طبیعتا برنامه با دستور End کارش رو تموم کنه.




فقط عنوان موضوع ویرایش شد.

#2
با سلام دوست عزیز

خب این برمیگرده به نحوه عملکرد میکروکنترلر که احتمالا باهاش آشنا نیستین. WleGiggle

دلیلش اینه که تو برنامه دومی وقتی دگمه فشار داده میشه، از حلقه بیرون میاد و Led روشن میشه و چون دستوری برای اتمام کار ( حلقه بی پایان ) ننوشتین میکروکنترلر تا آخرِ حافظه برنامه میره و دوباره برمیگرده و دستورات رو از اول اجرا میکنه و با رسیدن به دستور Clrf 0x06 میره و Led رو خاموش میکنه ( تا اینجا جواب سوال اول ) و بعدش با رسیدن به دستور Btfss 0x06, 7 دوباره وضعیت دگمه رو تست میکنه و منتظر میشه تا دگمه رو فشار بدین ( این هم جواب سوال دوم ) و تا این مدت هم Led خاموشه. البته همونطور که میدونین این مراحل خیلی سریعتر از اینکه بشه با چشم تعقیبش کرد انجام میشه.
 
ضمنا End دستور نیست و مثل List, Org, Equ و Include رهنمون کامپایلر هستش و فقط انتهای فایل رو به اسمبلر نشون میده. دستورهای PIC فقط 35 تا هستن که در این دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
هم بهشون اشاره شده.

در ضمن اینکه اصولا میکروکنترهای PIC دستوری مثل Halt که در بعضی میکروها وجود داره، دستوری برای توقف برنامه نداره و برای اینکار باید از حلقه بی پایان استفاده کرد. اگه دقت کنین همیشه قبل از End از $ Goto ( حلقه بی پایان که هیچ دستوری هم داخلش نیست ) استفاده میکنن.





support.wle.ir
#3
(21 مرداد 1394، 02:51 صبح)هادی نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
... میکروکنترلر تا آخرِ حافظه برنامه میره و دوباره برمیگرده و دستورات رو از اول اجرا میکنه ...

با تشکر از جوابتون

ولی در این مورد مطمئن هستین؟ میتونین ثابت کنین؟  Confused  Confused

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

#4
(21 مرداد 1394، 01:56 عصر)مصطفی نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
میتونین ثابت کنین؟

بله، اصلا کار مهندس ثابت کردنه.

یه برنامه نوشتم براتون که اگه اجرا و تحلیلش کنین همه چیز رو متوجه میشین:

کد:
LIST    P=16F628A
INCLUDE    "P16F628A.INC"

BSF    STATUS,    5
CLRF    TRISB
BCF    STATUS,    5

INCF    PORTB,    1

END

همونطور که میبینین PORTB بصورت خروجی تعریف شده و بدون اینکه مقداردهی اولیه بشه با دستور INCF به مقدارش 1 واحد اضافه شده.

حالا اگه همون چیزی که شما گفتین باشه باید بعد از یکبار اجرا و اضافه کردن 1 واحد، با رسیدن به END برنامه تموم بشه. ولی اگه برنامه رو اجرا کنین میبینین که مقدار PORTB همش در حال تغییره و هی داره به مقدارش 1 واحد اضافه میشه. پس وقتی همه دستورات رو اجرا میکنه دوباره میره بالا و از اول دوباره اجراشون میکنه.

یه نکته مهمی که هست اینکه من عمدا PORTB رو مقدار دهی اولیه نکردم. چون در اینصورت با هر بار اجرا، مقدار اولیه رو دوباره میریخت توی PORTB و یه واحد بهش اضافه میکرد و در ظاهر به نظر میرسید که میکروکنترلر برنامه رو اجرا کرده و کارش متوقف شده.

این میشه اثبات چیزی که من گفتم - برنامه های دیگه ای هم خودتون میتونین بنویسین و تست کنین.

حالا بذارین براتون توضیح بدم که دقیقا چرا اینطوریه:

تو میکروکنترلرهای PIC یه رجیستر به اسم PC هستش که مخفف Program Counter هستش. کارش نگهداری آدرس دستور بعدی هستش. این رجیستر در حالت عادی بصورت اتوماتیک هِی به مقدارش 1 واحد اضافه میشه تا دستورات بترتیب و پشت سر هم اجرا بشن. مگر اینکه ما با دستوراتِ انشعابی مثل DECFSZ, RETURN, CALL, GOTO و ... مقدار PC رو تغییر بدیم. خب حالا بعد از اینکه همه بیتهای این رجیستر 1 هستش، یه واحد بهش اضافه بشه مقدارش 0 میشه (مثل همه رجیسترها) یعنی میره روی سطر اول حافظه برنامه.

پس وقتی ما تو برناممون بصورت دستی این رجیستر رو کنترل نکنیم، این تمام حافظه برنامه رو تا آخر میره و دوباره برمیگرده به خط اول و دوباره دستورات رو اجرا میکنه.

حالا بذارین ببینیم حافظه برنامه به چه صورت هستش.

این حافظه هم 14 بیتی هستش و در میکروکنترلر PIC16F628A دارای 2048 سطر هستش. دستورهایی که ما مینویسیم به ترتیب از سطر صفرم قرار میگیره و تا جایی که دستور نوشتیم میره پایین. جاهایی هم که دستور توش نیست هم با 1 پر میشه.

حالا بیایین یه حساب سر انگشتی بکنیم:

اگه برنامه بالا رو با یه کریستال 4Mhz اجراش کنیم در هر ثانیه 1،000،000 دستور اجرا میشه.

حافظه ما هم که کلا جای 2048 دستور داره، پس 2048 / 1،000،000 تقریبا میشه 488 - یعنی در هر ثانیه 488 بار کل دستورات حافظه برنامه اجرا میشه.

حالا اگه ما فرکانس PORTB.B0 رو اندازه بگیریم باید نصف عددی که بدست آورده بودیم رو که تقریبا میشه 244Hz ببینیم. ( نصفش میشه چون باید دستور INCF دوبار اجرا بشه تا Pulse ایجاد بشه )

اینم نتیجه اندازه گیری:




İmage


WleLaugh  WleLaugh   WleLaugh

پس معلوم میشه که میکروکنترلر تا آخر حافظه برنامه میره و دوباره برمیگرده بالا

امیدوارم که اثبات شده باشه

از اسیلوسکوپ پروتئوس هم میتونین کمک بگیرین

WleLaugh  WleLaugh  WleLaugh


(21 مرداد 1394، 01:56 عصر)مصطفی نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
چون تو هیچ یکی از کتابها و منابع فارسی و حتی از استادا هم نشنیدم ... حتی همه میگن دستورات که تموم میشه میکرو هم کارش تموم میشه.

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

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

support.wle.ir
#5

مهندس ایمان آوردم به شما و واقعا سپاسگذارم.

واقعا چند هفته درگیر این بودم و هیچ کس نتونسته بود جواب درست و حسابی بده. اکثرا میگفتن پروگرامر و یا میکروکنترلت مشکل داره. WleFacepalm
#6
نقل قول: حتی در اصرع وقت اون جزوه رو به سبزی فروشی محل اهدا کنه که سبزی بپیچن دورش چون بدرد کار دیگه ای نمیخوره. WleGiggle

Idea Idea Idea
#7
(21 مرداد 1394، 06:19 عصر)مصطفی نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
مهندس ایمان آوردم به شما و واقعا سپاسگذارم.

واقعا چند هفته درگیر این بودم و هیچ کس نتونسته بود جواب درست و حسابی بده. اکثرا میگفتن پروگرامر و یا میکروکنترلت مشکل داره.  WleFacepalm

من هم سپاسگذارم از اینکه تا قانع نشدین دست بردار نبودین. WleSmile

خب خوشحالم که مشکلتون حل شده. باز هم اگه سوالی به ذهنتون رسید حتما بپرسین.

موفق باشین.

(21 مرداد 1394، 06:22 عصر)mkhp نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
نقل قول: حتی در اصرع وقت اون جزوه رو به سبزی فروشی محل اهدا کنه که سبزی بپیچن دورش چون بدرد کار دیگه ای نمیخوره.  WleGiggle

Idea   Idea   Idea

خوشم میاد که زود مطلبو میگیری. WleLaugh

support.wle.ir
مشترک شدن در این موضوع موضوع بسته شده است 


پرش به انجمن:

کاربرانِ درحال بازدید از این موضوع: 1 مهمان

انتخاب پوسته :

دسترسی سریع
درباره ما
انجمن سرزمین الکترونیک در 20 شهریور 91 تاسیس شده ، که همیشه سعی کرده با ظاهری متفاوت و سرعتی خوب رضایت کاربران را جلب کند ، امیدواریم توانسته باشیم گامی کوچک در پیشرفت فناوری در ایران برداشته باشیم...
نیرو گرفته از MyBB 1.8.6 با فارسی سازی مای بی بی ایران - طراحی شده در : ملت دیزاین
© تمامی حقوق برای انجمن سرزمین الکترونیک محفوظ می باشد .

پوسته‌ی انجمن: