اطلاعیه

Collapse
No announcement yet.

مشکل ساده با برنامه ساده

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

    مشکل ساده با برنامه ساده

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

    شرح برنامه:
    سه کلید ورودی داریم (Pin a.0, Pin a.1, Pin a.2 )و سه خروجی (Pin d.0, Pin d.1, Pin d.2 ) که به ورودی هر کدام یک کلید وصله و به خروجی ها LED وصله
    حالاقراره که هر کدام از کلیدها را زده شود LED پین مقابل آن برای 5 بار 2 ثانیه روشن و 2 ثانیه خاموش بشه و سه کلید از هم مستقل باشند
    برنامه را داخل بسکام نوشتن و داخل پروتوس تست می کنم ، ولی جواب نمی گیرم ، لطفاً کمک کنید:


    '-----------------------------------------------------------------------------------------
    'name : staver24m32.bas
    'copyright : (c) 1995-2005, MCS Electronics
    'micro : Mega16
    '-----------------------------------------------------------------------------------------

    $regfile = "m16def.dat" ' specify the used micro
    $crystal = 8000000 ' used crystal frequency
    $baud = 9600 ' use baud rate

    Dim I As Byte
    Dim J As Byte
    Dim G As Byte
    Dim S As Byte
    Dim Y As Byte
    Dim Z As Byte

    S = 5
    Y = 5
    Z = 5

    U = 1
    J = 1
    G = 1

    Config Pina.0 = Input ' Config inputs
    Config Pina.1 = Input
    Config Pina.2 = Input

    Config Pind.0 = Output ' Config output
    Config Pind.1 = Output ' Config output
    Config Pind.2 = Output ' GREEN LED




    Bitwait Pina.0 , Reset
    For I = 0 To S
    Set Pind.0
    Wait 1
    Next
    Reset Pind.0


    Bitwait Pina.1 , Reset
    For J = 0 To Y
    Set Pind.1
    Wait 1
    Next
    Reset Pind.1


    Bitwait Pina.2 , Reset
    For G = 0 To Z
    Set Pind.2
    Wait 1
    Next
    Reset Pind.2


    Return


    End

    #2
    پاسخ : مشکل ساده با برنامه ساده

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

    $regfile = "m16def.dat" ' specify the used micro
    $crystal = 8000000 ' used crystal frequency

    Dim I As Byte
    Dim J As Byte
    Dim G As Byte
    Dim S As Byte
    Dim Y As Byte
    Dim Z As Byte

    S = 5
    Y = 5
    Z = 5

    U = 1
    J = 1
    G = 1

    Config Pina.0 = Input ' Config inputs
    Config Pina.1 = Input
    Config Pina.2 = Input

    Config Pind.0 = Output ' Config output
    Config Pind.1 = Output ' Config output
    Config Pind.2 = Output ' GREEN LED


    do

    if pina.0 = 0 then
    For I = 0 To S
    Set Portd.0
    Wait 2
    Reset Portd.0
    wait 2
    Next
    endif



    if pina.1 = 0 then
    For I = 0 To y
    Set Portd.1
    Wait 2
    Reset Portd.1
    wait 2
    Next
    endif


    if pina.2 = 0 then
    For I = 0 To z
    Set Portd.2
    Wait 2
    Reset Portd.2
    wait 2
    Next
    endif

    loop

    دیدگاه


      #3
      پاسخ : مشکل ساده با برنامه ساده

      سلام
      سال نو برهمهتون مبارک
      اگه خواستید من حاضرم برنامه شو براتون بنویسم و قرار بدم فقط خبر بدید.
      Telegram:
      @reza_br_2489


      Instagram:
      _amp_c

      دیدگاه


        #4
        پاسخ : مشکل ساده با برنامه ساده

        سال نو بر شما هم مبارک


        متشکرم دوستان عزیز
        من فایل برنامه شما (MZJ1037) را کپی کردم توی برنامه بسکام و کمپایل کردم، (البته متغیر U هم فراموش شده بود که بصورت بایت تعریف کردم)
        بعد داخل سخت افزار زیر که داخل برنامه ISIS است فایل هگز را روی میکرو تعریف کردم ولی پین D.0 همش ست و ریست میشه و بقیه ورودی ها هم تاثیری نداره، به نظرتان برنامه اشکال داره؟
        اصلاً داخل پروتوس برای فایل هگز درست عمل می کنه یا باید .elf باشه؟
        شماتیک سخت افزار هم بالا گذاشتم

        دیدگاه


          #5
          پاسخ : مشکل ساده با برنامه ساده

          برنامه زیر را ببینید ، خوب کار می کنه ولی وقتی وارد حلقه ست و ریست میشه دیگه خارج نمی شه
          $regfile = "m16def.dat" ' specify the used micro
          $crystal = 8000000 ' used crystal frequency

          Dim I As Byte
          Dim J As Byte
          Dim G As Byte
          Dim S As Byte
          Dim Y As Byte
          Dim Z As Byte

          S = 5
          Y = 5
          Z = 5

          I = 1
          J = 1
          G = 1

          Config Pinb.0 = Input ' Config inputs
          Config Pinb.1 = Input
          Config Pinb.2 = Input

          Config Portd.0 = Output ' Config output
          Config Portd.1 = Output ' Config output
          Config Portd.2 = Output ' GREEN LED


          do

          If Pinb.0 = 1 Then
          For I = 1 To S
          Set Portd.0
          Waitms 2
          Reset Portd.0
          Waitms 2
          INCR I
          Next
          endif



          If Pinb.1 = 1 Then
          For J = 1 To Y
          Set Portd.1
          Waitms 2
          Reset Portd.1
          Waitms 2
          Incr J
          Next
          endif


          If Pinb.2 = 1 Then
          For G = 1 To Z
          Set Portd.2
          Waitms 2
          Reset Portd.2
          Waitms 2
          Incr G
          Next
          End If
          loop

          دیدگاه


            #6
            پاسخ : مشکل ساده با برنامه ساده

            من تونستم با زبان سی راهش بندازم
            اگر خواستی کد رو میذارم برات :mrgreen: :biggrin:

            دیدگاه


              #7
              پاسخ : مشکل ساده با برنامه ساده

              نوشته اصلی توسط imanxx_81
              برنامه زیر را ببینید ، خوب کار می کنه ولی وقتی وارد حلقه ست و ریست میشه دیگه خارج نمی شه
              $regfile = "m16def.dat" ' specify the used micro
              $crystal = 8000000 ' used crystal frequency

              Dim I As Byte
              Dim J As Byte
              Dim G As Byte
              Dim S As Byte
              Dim Y As Byte
              Dim Z As Byte

              S = 5
              Y = 5
              Z = 5

              I = 1
              J = 1
              G = 1

              Config Pinb.0 = Input ' Config inputs
              Config Pinb.1 = Input
              Config Pinb.2 = Input

              Config Portd.0 = Output ' Config output
              Config Portd.1 = Output ' Config output
              Config Portd.2 = Output ' GREEN LED


              do

              If Pinb.0 = 1 Then
              For I = 1 To S
              Set Portd.0
              Waitms 2
              Reset Portd.0
              Waitms 2
              INCR I
              Next
              endif



              If Pinb.1 = 1 Then
              For J = 1 To Y
              Set Portd.1
              Waitms 2
              Reset Portd.1
              Waitms 2
              Incr J
              Next
              endif


              If Pinb.2 = 1 Then
              For G = 1 To Z
              Set Portd.2
              Waitms 2
              Reset Portd.2
              Waitms 2
              Incr G
              Next
              End If
              loop
              سلام دوست عزیز
              برنامه درسته بلکه شماتیک ایراد داره برای حل مشکل باید کلید ها رو با مقاومت 10k پول داون کنی
              موفق باشی

              دیدگاه


                #8
                پاسخ : مشکل ساده با برنامه ساده

                اینم ی برنامه بسکام با فایل پرتئوس
                http://cld.persiangig.com/download/L...mM/TEST.rar/dl
                چشم ها را باید شست ، جور دیگر باید دید . . .

                دیدگاه


                  #9
                  پاسخ : مشکل ساده با برنامه ساده

                  نوشته اصلی توسط MZJ1037
                  سلام دوست عزیز
                  برنامه درسته بلکه شماتیک ایراد داره برای حل مشکل باید کلید ها رو با مقاومت 10k پول داون کنی
                  موفق باشی
                  سلام
                  مرسی از جوابتون
                  می خواستم بدونم چرا مقاومت 10K پول آن قدر مهمه؟
                  اصن چه تاثیری رو سیستم می ذاره؟

                  دیدگاه


                    #10
                    پاسخ : مشکل ساده با برنامه ساده

                    نوشته اصلی توسط Hamedsj
                    من تونستم با زبان سی راهش بندازم
                    اگر خواستی کد رو میذارم برات :mrgreen: :biggrin:
                    دمت گرم داداش
                    میشه کدش رو بذاری
                    ضمنا با چه برنامه ای فایل برنامه C رو به هگز تبدیل میکنی؟
                    مرسی

                    دیدگاه


                      #11
                      پاسخ : مشکل ساده با برنامه ساده

                      با سلام.
                      اصلا خود برنامه مهم نیست ! ایده برنامه .

                      شما گفتی که 3 تا push button داری و سه تا ال ای دی . نظیر به نظیر قراره ال ای دی ها 5 بار 2 ثانیه روشن و دو ثانیه خاموش بشن یعنی یه دوره 20 ثانیه ای .

                      و توی این 20 ثانیه میشه دو کلید دیگه رو هم فشار داد و این ها نباید با هم تداخل کنن.

                      این از روشن کردن پروژه.

                      حالا من میگم که کجای برنامه شما ایراد داشته.

                      اول از همه برنامه رو که میزارید، داخل تگ code بزارین تا درست نمایش داده بشن:

                      [code=vb]

                      '-----------------------------------------------------------------------------------------
                      'name : staver24m32.bas
                      'copyright : (c) 1995-2005, MCS Electronics
                      'micro : Mega16
                      '-----------------------------------------------------------------------------------------

                      $regfile = "m16def.dat" ' specify the used micro
                      $crystal = 8000000 ' used crystal frequency
                      $baud = 9600 ' use baud rate

                      Dim I As Byte
                      Dim J As Byte
                      Dim G As Byte
                      Dim S As Byte
                      Dim Y As Byte
                      Dim Z As Byte

                      S = 5
                      Y = 5
                      Z = 5

                      U = 1
                      J = 1
                      G = 1

                      Config Pina.0 = Input ' Config inputs
                      Config Pina.1 = Input
                      Config Pina.2 = Input

                      Config Pind.0 = Output ' Config output
                      Config Pind.1 = Output ' Config output
                      Config Pind.2 = Output ' GREEN LED




                      Bitwait Pina.0 , Reset
                      For I = 0 To S
                      Set Pind.0
                      Wait 1
                      Next
                      Reset Pind.0


                      Bitwait Pina.1 , Reset
                      For J = 0 To Y
                      Set Pind.1
                      Wait 1
                      Next
                      Reset Pind.1


                      Bitwait Pina.2 , Reset
                      For G = 0 To Z
                      Set Pind.2
                      Wait 1
                      Next
                      Reset Pind.2


                      Return


                      End
                      [/code]

                      اولین اشتباه اینه که برنامه رو تو do-loop نذاشتین و برنامه پویا نیست و خطی است.
                      یعنی یه بار شروع میکنه و یه بار تموم میشه .
                      اون دستور return اضافیه.

                      دومی اینکه از bitwait استفاده کردی. و میکرو تا زمانی که پایه مورد نظر به اون حالتی که گفتی نرسه ، همون جا میمونه.

                      سومی اینکه نیازی به اون همه متغیر نیست. برای مقدار انتهای حلقه for حتما نباید متغیر باشه! میتونید همون 5 رو بزارید.
                      و برای شمارنده for هم نباید هر for متغیر جدا داشته باشه و برای همشون میتونید از همون I استفاده کنید.

                      چهارمی اینکه اگه حلقه for از 0 تا 5 باشه ، 6 بار حلقه اجرا میشه نه 5 بار. حلقه باید از 1 شروع شه.

                      پنجمی اینکه واسه مقدار خروجی دادن به یه پایه، باید به رجیستر port مقدار بدین نه به pin . و برای ورودی یا خروجی تعریف کردن هم باید PORTX.Y رو مساوی output یا input قرار بدین.
                      ولی برای فهمیدن وضعیت پین ورودی باید به رجیستر pin نگاه کنید که همین کار رو کردین.

                      ششمی اینکه حلقه for شما ال ای دی رو چشمک نمیزنه. بلکه اون رو 5 ثانیه روشن نگه میداره و بعد خاموشش میکنه.

                      باید اینجوره بنویسید تا 5 بار ، و هر بار 2 ثانیه روسن و 2 ثانیه خاموش کنه:

                      [code=vb]
                      For I = 1 To 5
                      Set Portx.y
                      Wait 2
                      Reset Portx.y
                      Wait 2
                      next i
                      [/code]

                      خوب تا اینجا برنامه شما از لحاظ غلط اصلاح شد. در واقع میشه این برنامه رو درست نوشت و کار هم خواهد کرد. ( با if و for )
                      که همون برنامه ای هست که جناب ترابی نوشتن.

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

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

                      زیاد حرف زنم.

                      قربان همتون.

                      [glow=green,2,300][b]بشر ممکن الخطاست
                      درخت هرچه پربار تر سر به زیر تر[/glow]

                      دیدگاه


                        #12
                        پاسخ : مشکل ساده با برنامه ساده

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

                        حال چند سوال دیگه تا پروژه به نتیجه برسد:
                        1- تکلیف کریستال چی شد ؟ من نفهمیدم ، تو پروژه آقای ترابی زحمت کشیده بود حذف شده بود ، تو عمل هم باید حذف بشه؟
                        2- مقاومت پول داون نقشش چیه؟
                        3- در عمل من بجای کلید می خواهم شاسی استارت استفاده کنم ، جواب می ده؟ یا 220 به شاسی وصل کنم و به رله وصلش کنم و خزوجی اش به میکرو بدهم؟ کلاً بهترین کلید که توی کار دوام بیاره چیه؟

                        راستش کل برنامه ای که مورد نظره به شکل زیره: لطفاً تو بقیه آن هم کمک کنید
                        1- با زدن هریک از کلیددها مستقل از هم 5 بار روشن و خاموش کنه و پس از 5 بار سوئیچ حدود 5 دقیقه کلاً روشن بمانه
                        2- هر کدام از بخشها از هم مستقل کار کنند یعنی اگر کلید اول فشار داده شد و سیکل آن شروع شد پس از آن کلید دوم زده شد مستقل آن هم کار کنه و سیکلش شروع بشه


                        با سپاس

                        دیدگاه


                          #13
                          پاسخ : مشکل ساده با برنامه ساده

                          نوشته اصلی توسط abed73
                          سلام
                          مرسی از جوابتون
                          می خواستم بدونم چرا مقاومت 10K پول آن قدر مهمه؟
                          اصن چه تاثیری رو سیستم می ذاره؟
                          سلام
                          خواهش میکنم.
                          از آقای بیگدلی هم تشکر میکنم که بسیار کامل توضیح دادن من هم قصد داشتم تا مشکلاتی که ایشون بهش اشاره کردن رو توضیح بدم اما هم وقت زیادی نداشتم هم اینکه زیاد بلد نیستم با ابزار سایت کار کنم. بگذریم.....
                          مقاومت 10k یا هر مقدار دیگه ای که حول و حوش این مقدار باشه فرقی نداره باید برای pull down کردن پایه های میکرو که به کلید متصل شده استفاده کنی.
                          هر پایه میکرو در وضعیت ورودی به طور کلی با سه حالت ممکنه روبرو بشه:
                          صفر ، یک ، یا نامعلوم. وضعیت یک منطقی با فشردن کلید بوجود میاد اما زمانی که کلید فشرده نشده باشه چی ، وضعیت نامعلومه یعنی نه صفره نه یک و این برای میکرو نامعلومه میکرو فقط صفر و یک رو میشناسه ، زمانی که میکرو با وضعیت نامعلوم روبرو بشه وابسته به شرایط محیط یا بهتر بگم نویز محیط اطرافش جواب شرط مقابل if رو یا یک یا صفر در نظر میگیره. به طور کل یعنی بدون اینکه کلید فشرده بشه ممکنه خود به شرط برنامه عمل کنه و چون اولین if برنامه مربوط به پایه d.0 هست شما میبینی که این پایه بدون فشار دادن کلید شروع میکنه به چشمک زدن پس باید وقتی که کلیدی رو فشار ندادی وضعیت نامعلوم رو به وضعیت معلوم صفر تبدیل کنی تا میکرو میکرو دچار اشتباه نشه و برای اینکه این وضعیت صفر موقع فشار دادن کلید با وضعیت یک اتصال کوتاه نشه باید به طور غیر مستقیم و با یک مقاومت مثلا 10k پایه رو به صفر متصل کنی البته ناگفته نماند که به جای pull down میتونی از pull up کردن پایه هم استفاده کنی که برای این کار جای کلید و مقاومت در مدار عوض میشه و شرط هم به جای pina.0=1 باید با pina.0=0 مقایسه بشه که اگه این کار رو انجام بدی یه حسن داره که اونوقت میتونی به جای مقاومت خارجی از مقاومت pull up داخل میکرو استفاده کنی و دیگه مقاومت رو تو مدار نذاری. طریقه فعال کردن مقاومت pull up داخلی هم به این صورته که بعد از input تعریف کردن پایه باید همون پایه رو با دستور portx.y مساوی یک قرار بدی به همین سادگی.
                          اما اصلی ترین مسئله همون مشکلی هست که آقای بیگدلی بهش اشاره کردن که برای حلش میتونی با اینتراپت به راحتی و حتی بدون اینتراپت اما با کمی سختی این کارو انجام بدی که الان وقت ندارم وارد این مبحث بشم باید یه کار نیمه تموم رو کامل کنم که فردا باید تحویلش بدم خلاصه شرمنده.
                          موفق باشی

                          دیدگاه


                            #14
                            پاسخ : مشکل ساده با برنامه ساده

                            http://s5.picofile.com/file/8178732092/test2.rar.html

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

                            فقط الان مشکلم اینه که زمانیکه یکی از دکمه ها فشرده بشه و سیکل آن شروع بشه ممکنه دکمه دیگه فشرده شود و در واقع سه سیکل با هم همزمان کار کنند
                            اینتراپ داستانش چیه ؟ می توانید همکاری کنید؟
                            سه سیکل مستقل از هم کار کنند

                            دیدگاه


                              #15
                              پاسخ : مشکل ساده با برنامه ساده

                              نوشته اصلی توسط imanxx_81
                              http://s5.picofile.com/file/8178732092/test2.rar.html

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

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

                              اول این مدار رو ببند:



                              برای استفاده از وقفه هست. خازن ها رو هم نذاشتی، نذاشتی.

                              مقاومت های پول دان گذاشته شد.


                              اینم از برنامه:

                              [code=vb]
                              $regfile = "m32def.dat"
                              $crystal = 8000000
                              '============================================ ===================================
                              Declare Sub Detect_key
                              Declare Sub Led1blink
                              Declare Sub Led2blink
                              Declare Sub Led3blink
                              '============================================ ===================================
                              Config Porta.0 = Input
                              Config Porta.1 = Input
                              Config Porta.2 = Input
                              Config Portb.0 = Output
                              Config Portb.1 = Output
                              Config Portb.2 = Output
                              '============================================ ===================================
                              Key1 Alias Pina.0
                              Key2 Alias Pina.1
                              Key3 Alias Pina.2
                              Led1 Alias Portb.0
                              Led2 Alias Portb.1
                              Led3 Alias Portb.2
                              '============================================ ===================================
                              Enable Interrupts
                              Enable Int0
                              Enable Timer0
                              Enable Timer1
                              Enable Timer2
                              Enable Ovf0
                              Enable Ovf1
                              Enable Ovf2
                              '============================================ ===================================
                              Config Int0 = Rising

                              Config Timer0 = Timer , Prescale = 1024
                              Timer0 = 61

                              Config Timer1 = Timer , Prescale = 1024
                              Timer1 = 65341

                              Config Timer2 = Timer , Prescale = 1024
                              Timer2 = 61
                              '============================================ ===================================
                              On Int0 Detect_key
                              On Ovf0 Led1blink
                              On Ovf1 Led2blink
                              On Ovf2 Led3blink
                              '============================================ ===================================
                              Dim F1 As Byte
                              Dim F2 As Byte
                              Dim F3 As Byte
                              Dim D1 As Byte
                              Dim D2 As Byte
                              Dim D3 As Byte
                              Dim C1 As Byte
                              Dim C2 As Byte
                              Dim C3 As Byte
                              Dim X As Byte
                              '============================================ ===================================
                              D1 = 0
                              D2 = 0
                              D3 = 0
                              C1 = 0
                              C2 = 0
                              C3 = 0
                              F1 = 0
                              F2 = 0
                              F3 = 0
                              '============================================ ===================================
                              Stop Timer0
                              Stop Timer1
                              Stop Timer2
                              '============================================ ===================================
                              Do
                              If F1 = 1 Then
                              Stop Timer0
                              Timer0 = 61
                              F1 = 0
                              C1 = 0
                              D1 = 0
                              End If

                              If F2 = 1 Then
                              Stop Timer1
                              Timer1 = 65431
                              F2 = 0
                              C2 = 0
                              D2 = 0
                              End If

                              If F3 = 1 Then
                              Stop Timer2
                              Timer2 = 61
                              F3 = 0
                              C3 = 0
                              D3 = 0
                              End If
                              Loop
                              End
                              '============================================ ===================================
                              Detect_key:

                              If Key1 = 1 Then
                              Start Timer0
                              Set Led1
                              C1 = 1
                              End If

                              If Key2 = 1 Then
                              Start Timer1
                              Set Led2
                              C2 = 1
                              End If

                              If Key3 = 1 Then
                              Start Timer2
                              Set Led3
                              C3 = 1
                              End If

                              Return
                              '============================================ ===================================
                              Led1blink:
                              Stop Timer0
                              Timer0 = 61

                              If C1 = 11 Then
                              F1 = 1
                              C1 = 0
                              D1 = 0
                              Else
                              If D1 = 80 Then
                              X = C1 Mod 2
                              D1 = 0
                              If X = 1 Then
                              C1 = C1 + 1
                              Set Led1
                              Else
                              C1 = C1 + 1
                              Reset Led1
                              End If
                              Else
                              D1 = D1 + 1
                              End If
                              End If

                              If F1 = 0 Then Start Timer0
                              Return
                              '============================================ ===================================
                              Led2blink:
                              Stop Timer1
                              Timer1 = 65341


                              If C2 = 11 Then
                              F2 = 1
                              C2 = 0
                              D2 = 0
                              Else
                              If D2 = 80 Then
                              X = C2 Mod 2
                              D2 = 0
                              If X = 1 Then
                              C2 = C2 + 1
                              Set Led2
                              Else
                              C2 = C2 + 1
                              Reset Led2
                              End If
                              Else
                              D2 = D2 + 1
                              End If
                              End If


                              If F2 = 0 Then Start Timer1
                              Return
                              '============================================ ===================================
                              Led3blink:
                              Stop Timer2
                              Timer2 = 61


                              If C3 = 11 Then
                              F3 = 1
                              C3 = 0
                              D3 = 0
                              Else
                              If D3 = 80 Then
                              X = C3 Mod 2
                              D3 = 0
                              If X = 1 Then
                              C3 = C3 + 1
                              Set Led3
                              Else
                              C3 = C3 + 1
                              Reset Led3
                              End If
                              Else
                              D3 = D3 + 1
                              End If
                              End If


                              If F3 = 0 Then Start Timer2
                              Return
                              '============================================ ===================================
                              [/code]


                              با وقفه ها که انشاءالله آشنایی داری...

                              اگه نداشته باشی، توضیح این برنامه کار من نیست.

                              ولی اگه داری:

                              اول فشرده شدن کلید ها توسط یه وقفه شناسایی میشه به این صورت که هر کلیدی فشرده بشه، میکرو به زیر روال detect_key میره.

                              بعد چک میکنه که کدوم کلید زده شده و تایمر مربوطه رو start میکنه.

                              برای اینکه از 3 تا تایمر استفاده شده، هر کلید هرزمانی میتونه فشرده بشه و هیچکدوم هم با هم تداخل نمیکنن.

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

                              البته جای ال ای دی ها رو تغییر دادم و به پورت B وصل کردم.

                              محاسبات تایمر ها هم به گونه ای انجام شده که تایمر هر 0.025 ثانیه ، به زیر روال وقفه بره.

                              به همین خاطر برای تولید زمان 2 ثانیه باید زیر روال 80 بار اجرا بشه که بار 80 اُم ، 2 ثانیه از بار اول گذشته باشه.

                              ایجاد این 80 ثانیه بر عهده ی متغیر های D هست.

                              سیکل ما 10 مرحله داره ( 5 بار و هر بار روشن و خاموش میشه 5 * 2 )

                              وقتی کلید فشرده میشه در همون لحظه باید قسمت اول سیکل اجرا بشه. پس c برابر 1 قرار داده میشه.

                              و اتمام سیکل 10 تا بعد 1 یعنی 11 اُمین باری که به c اضافه میشه خواهد بود.

                              ولی هنگام اتمام سیکل خود تایمر نمیتونه خودش رو stop کنه، پس فلگ f رو 1 میکنه تا روال اصلی برنامه این کار رو بکنه.

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

                              این پروژه رو تو واقعیت هم تست کردم و کار میکنه.

                              موفق باشید.
                              [glow=green,2,300][b]بشر ممکن الخطاست
                              درخت هرچه پربار تر سر به زیر تر[/glow]

                              دیدگاه

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