اطلاعیه

Collapse
No announcement yet.

مشکل در استفاده از وقفه

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

    مشکل در استفاده از وقفه

    با سلام...
    کسی از دوستان می تونه به من کمک کنه که این کار را بکنم؟ ببینید می خوام که وقتی یک دکمه مثلا اف 1 فشرده میشه برنامه ای که داره اجرا می شه از توی لوپ بیاد بیرون و بره توی یک تابعی که می خوایم .
    اما مشکلی که دارم اینه که اگر بخوام از کیس استفاده کنم تو لوپ برنامه و بگم که فلان دکمه زده شد برو بیرون در این صورت برنامه اصلی که می خوام دایم انجام بشه , انجام نمی شه و فقط منتظر می مونه که از کیبرد بخونه ... اما اگر از وقفه استفاده کنم می تونه بفهمه که وقتی خواستیم بره توی وقفه ...
    باز هم اما.. نمیدونم چه طوری از وقفه استفاده کنم :cry2: که برنامه اصلی داخل لوپ انجام بشه و وقتی که کلید مثلا اف1 فشرده شد عکس العمل نشون بده و از لوپ بیاد بیرون و بره توی تابعی که پایین لوپ تعریف کردیم و بعد از انجام اون و فشردن مثلا اف 2 مجددا برگرده به لوپ و کار خودش را انجام بده... کتاب علی کاهه را هم یه نگاهی انداختم اما متاسفانه متوجه نشدم, و فکر نمی کنم اصلا در این خصوص توضیحی داده باشه...( البته به نظر من بی سواد) به هر حال ممنون می شم اگر کسی کمکم کنه ... راستی با بیسیک کار می کنم

    #2
    پاسخ : مشکل در استفاده از وقفه

    این یه برنامه فلاشر هستش که از 2 تا وقفه میکرو استفاده شده که برای کم و زیاد کردن سرعت فلاشر از وقفه استفاده کردیم.
    اگه فایل پروتئوسش رو هم خواستی به این تایپک یه سری بزن: http://www.eca.ir/forum2/index.php?topic=16357.15

    $regfile = "M16def.dat"
    $crystal = 8000000
    Config Porta = Output
    Config Int0 = Falling
    Config Int1 = Falling
    Enable Interrupts
    Enable Int0
    Enable Int1
    On Int0 Updelay
    On Int1 Downdelay

    Dim A As Byte , X As Byte
    Dim B As Byte
    Dim Delay1 As Word
    B = 0
    Delay1 = 500

    Do

    For A = 0 To 13
    Porta = Lookup(b , Efect1)
    Incr B
    Waitms Delay1
    Next A
    X = 0

    Do
    B = &B00000001
    For A = 0 To 15
    Porta = B
    Rotate B , Left
    Waitms Delay1
    Next A
    B = 0
    incr x
    Loop Until X = 3
    X = 0

    Do
    For A = 0 To 11
    Porta = Lookup(b , Efect2)
    Incr B
    Waitms Delay1
    Next A
    B = 0
    Incr X
    Loop Until X = 3


    Loop
    End

    Updelay:
    Delay1 = Delay1 + 100
    Return

    Downdelay:
    Delay1 = Delay1 - 100
    Return


    Efect1:
    Data &B10000001
    Data &B11000011
    Data &B11100111
    Data &B11111111
    Data &B11100111
    Data &B11000011
    Data &B10000001
    Data &B11000011
    Data &B11100111
    Data &B11111111
    Data &B11100111
    Data &B11000011
    Data &B10000001

    Efect2:
    Data &B10000001
    Data &B10000010
    Data &B10000100
    Data &B10001000
    Data &B10010000
    Data &B10100000
    Data &B11000000
    Data &B10100000
    Data &B10010000
    Data &B10001000
    Data &B10000100
    Data &B10000010
    Data &B10000001
    www.icesi.ir

    دیدگاه


      #3
      پاسخ : مشکل در استفاده از وقفه

      ممنون ولی هنوز متوجه نشدم !!!
      من که گفتم وارد نیستم . ببینید این قضیه int0 & int1 چیه ؟ منظورم اینه که چه طور برنامه می فهمه که چه زمانی باید بره تو وقفه ( همون اینت 0 و 1 که فعالشون کردین ) ؟ چون توی لوپ برنامه که هیچ چیزی که مرتبط بشه به این دو تا من نمی بینم ... بعد هم تا اون جا میدونم اینت0 روی پورت دی.2 هستش . و تو این برنامه چیزی هم که به پورت دی وصل نیست( البته فایل پروتیوس را نمی تونم ببینم ) و فقط از پورت ا برای رفرش کردن استفاده شده...
      من می خوام بدونم که چه طور میکرو بفهمه که کی بره مثلا توی همون اپدیلی یا dowdealy که تعریف کردین ؟
      من می خوام از صفحه کلید استفاده کنم و وقتی که مثلا دکمه اف 1 زده می شه بیاد بره توی همین داندیلی ... :rolleyes:

      ممنونم

      دیدگاه


        #4
        پاسخ : مشکل در استفاده از وقفه

        برای برنامه تعریف کردیم.Config Int0 = Falling که هر موقع که پالس پایین رونده ای اومد کار کن.
        On Int0 Updelay و اینجا هم گفتیم هر موقع پالس پاین رونده اومد بپر به این برچسب.

        این کلید f1 ی که شما میگید یه میکرو سوئیچه یا یکی از کلید های کیبورد 3*4 یا 4*4 هستش؟
        www.icesi.ir

        دیدگاه


          #5
          پاسخ : مشکل در استفاده از وقفه

          نوشته اصلی توسط boyironi
          ممنون ولی هنوز متوجه نشدم !!!
          من که گفتم وارد نیستم . ببینید این قضیه int0 & int1 چیه ؟ منظورم اینه که چه طور برنامه می فهمه که چه زمانی باید بره تو وقفه ( همون اینت 0 و 1 که فعالشون کردین ) ؟ چون توی لوپ برنامه که هیچ چیزی که مرتبط بشه به این دو تا من نمی بینم ... بعد هم تا اون جا میدونم اینت0 روی پورت دی.2 هستش . و تو این برنامه چیزی هم که به پورت دی وصل نیست( البته فایل پروتیوس را نمی تونم ببینم ) و فقط از پورت ا برای رفرش کردن استفاده شده...
          من می خوام بدونم که چه طور میکرو بفهمه که کی بره مثلا توی همون اپدیلی یا dowdealy که تعریف کردین ؟
          من می خوام از صفحه کلید استفاده کنم و وقتی که مثلا دکمه اف 1 زده می شه بیاد بره توی همین داندیلی ... :rolleyes:

          ممنونم
          سلام
          من این موضوع رو این جوری واست توضیح می دم که :nerd:

          وقتی میکرو کنترلر روشن میشه، خود به خود میره و از یک جایی از حافظه شروع میکنه به خوندن بزنامه و اجرا کردن اون. حالا کاری به این نداریم که ما می تونیم یک جورایی به میکرو بگیم که از کجا شرو به خوندن بکن.... در حالت عادی وقتی میکرو روشن می شه، میره از اون محل مخصوص شرو می کنه به خوندن بزنامه. توی همون قسمت ما به میکرو میگیم که از چه قسمت هایی از میکرو استفاده می خواهیم بکنیم و همینطور می گیم به چه صورت. مثلا میگیم که پرت A رو ورودی می کنیم. تایمر 1 رو در حالت PWM استفاده می کنیم. وقفه تایمر هم برامون فعال باشه. وقفه خارجی 0 هم فعال و به لبه بالا رونده حساس باشه و . . . . :smile:

          حالا میکرو می فهمه که باید به تایمر 1 کلاک بده، و وقفه تایمر هم فعاله و وقفه خارجی 0 هم . . .

          اینجا یک نگته قشنگ هست و اونم اینه که میکرو خودش الان دیگه می دونه که وقتی واسه تایمر یک، وقفه اومد باید بپره به یک آدرس مشخص ( که ثابته) و برنامه رو از اونجا ادامه بده و همینطور برای بقیه وقفه ها . . . . :agree:


          مثلا ما یک برنامه می نویسیم که می خوایم یک متغیر رو هر ثانیه یک مقدار افزایش بده و در عین حال با زدن کلید، وقفه خارجی 0 فعال بشه و مقدار متغیر رو روی LED هایی که به پایه میکرو وصله نشون بده.

          اول برنامه ( همونجا که تا میکرو روشن میشه از اونجا کدرو میخونه) مشخص می کنیم که وقفه خارجیمون رو می خواهیم و فعاله و پرت A هم خروجی. بعد برنامه رو می نویسیم که هر ثانیه یکی به مقدار متغیرمون اضافه کنه.
          ااصل قضیه اینجاست که حالا توی اون آدرسی که میکرو به محض اومدن وقفه خارجی 0 بهش پرش می کنه دستورات مربوط به نمایش مقدار متغیر رو بر روی پرت می نویسیم.
          در این صورت با روشن شدن میکرو برنامه کار خودشو انجام میده. . . . . اما به محض اینکه ما کلید وقفه 0 رو بزنیم برنامه میپره به اون آدرس مخصوص و مقدار متغیر رو روی LED ها نشون میده و ذوباره بر می گرده به همون آدرسی که ازش پریده بود به وقفه و ار اونجا دوباره برنامه اصلی رو ادامه می ده تا زمانی که دوباره وقفه بیاد......



          اینجا به یک مشکل بر می خوریم..... اون آدرسی که واسه مثلا وقفه خارجی 0 هست، اونقدر جا نداره که همه دستورات رو همونجا بنویسیم. واسه همین، برنامه وقفه رو توی یک جایی از حافظه که به اندازه کافی جای خالی باشه می نویسیم و توی اون قسمت مربوط به وقفه یک دستور پرش به محل جدید دستورات وقفه می نویسیم. :nice:

          امیدوارم گیج نشده باشی و بتونی یک پیزایی بفهمی..... :mrgreen: :cry: oo:

          http://www.4shared.com/file/50793153...e/regfile.html

          دیدگاه


            #6
            پاسخ : مشکل در استفاده از وقفه

            در وحله اول تشکر می کنم از شما دو نفر که لطف کردین و پاسخ دادین و به خصوص از شما که پاسخی مفصل و تپل مپل دادین :job: :applause:
            فکر می کنم الان تا حدودی فهمیدم که باید چیکار کنم , ببینید:
            بعد از این تعریف ها که بالا کردیم و وقفه را فعال کردیم و کیبرد را تعریف کردیم ( صفحه کلید کامپیوتر) می گیم بهش میایم دیتای صفحه کلید را مثلا میدیم به اینت 0 ( سخت افزاری ) و بعد هم اگر که هر دکمه ای روی کیبرد زده بشه برنامه از لوپ میاد بیرون و میره توی لیبلی که واسش تعریف کردیم مثلا داندیلی ... خب حالا هم که یه کیس می ذاریم اینجا و ... :wow:
            باز هم ممنون فکر کنم کارم راه بیفته تو این قسمت

            دیدگاه

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