اطلاعیه

Collapse
No announcement yet.

سرعت کلیدزنی در برنامه؟

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

    سرعت کلیدزنی در برنامه؟

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

    #2
    پاسخ : سرعت کلیدزنی در برنامه؟

    شما وقفه را روی حالت low level فعال کنید در این صورت مادامی که کلید را نگه دارید وقفه اتفاق میافتد.
    The harder I work, the luckier I get

    دیدگاه


      #3
      پاسخ : سرعت کلیدزنی در برنامه؟

      نوشته اصلی توسط narek
      شما وقفه را روی حالت low level فعال کنید در این صورت مادامی که کلید را نگه دارید وقفه اتفاق میافتد.
      ببخشید میشه بیشتر توضیح بدهید من این کار را کردم در این صورت با یک بار فشردن کلید یک پرش صدتایی بالا میرود وبا دوبار کلید افزایش به اخرین عدد میرسه .من اینجوری نمیخوام
      میخوام با هر کلید زدن دونه دونه افزایش پیدا کنه فقط درصورتی که دستم روی کلید موند سریع افزایش یا کاهش بدهد اما بازم دونه دونه.

      دیدگاه


        #4
        پاسخ : سرعت کلیدزنی در برنامه؟

        خیلی وقته دیگه با بسکام کار نمیکنم ولی اگه درست یادم مونده باشه اینطوری مینوشتیم
        config int0=lowlevel
        The harder I work, the luckier I get

        دیدگاه


          #5
          پاسخ : سرعت کلیدزنی در برنامه؟

          اینم از help بسکام پیدا کردم (توضیح اجمالی در مورد اینتراپت)
          CONFIG INTx = state

          state
          LOW LEVEL to generate an interrupt while the pin is held low. Holding the pin low will generate an interrupt over and over again.

          FALLING to generate an interrupt on the falling edge.

          RISING to generate an interrupt on the rising edge.

          CHANGE to generate an interrupt on the change of the edge. Not all microprocessors support CHANGE.

          The harder I work, the luckier I get

          دیدگاه


            #6
            پاسخ : سرعت کلیدزنی در برنامه؟

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

            دیدگاه


              #7
              پاسخ : سرعت کلیدزنی در برنامه؟

              خوب چون سرعت کلاک میکرو بالاست هر ثانیه که کلید و نگه داری 1میلیون بار وقفه اتفاق میفته(بستگی به کریستال دارد) شما واسه ی برطرف کردن این مشکل توی زیر برنامه ی وقفه وقتی به متغیرتون یک واحد اضافه کردید یه تاخیر 500 میلی ثانیه( یا هرچقدر که میخواهید) ایجاد کنید اونوقت هر 500 میلی ثانیه 1 بار 1واحد اضافه میشه
              The harder I work, the luckier I get

              دیدگاه


                #8
                پاسخ : سرعت کلیدزنی در برنامه؟

                نوشته اصلی توسط narek
                خوب چون سرعت کلاک میکرو بالاست هر ثانیه که کلید و نگه داری 1میلیون بار وقفه اتفاق میفته(بستگی به کریستال دارد) شما واسه ی برطرف کردن این مشکل توی زیر برنامه ی وقفه وقتی به متغیرتون یک واحد اضافه کردید یه تاخیر 500 میلی ثانیه( یا هرچقدر که میخواهید) ایجاد کنید اونوقت هر 500 میلی ثانیه 1 بار 1واحد اضافه میشه
                بازم ازتون متشکرم اما من اینکارها را کردم ولی اونجوری که من میخوام نمیشه درسته با این تاخیر درصورتی که دستم را روی کلید فشار بدهم سریع جلو میرود اما در این حالت وقتی میخواهم یک بار کلید بزنم بجای اضافه شدن یک واحد چند تا اضافه میشود این روش را با چند عدد تست کردم اما مناسب کار من نیست
                * راستی یادم رفت بگم اعداد من اعشاری هستن*
                باز هم ازدوستان خواهش دارم اگر روشی دیگر میشناسند کمک کنند.

                دیدگاه


                  #9
                  پاسخ : سرعت کلیدزنی در برنامه؟

                  شما مجبوری این کار رو خودت دستی انجام بدی. به این صورت:

                  در مرحله اول باید فشرده شدن هر کلید با رعایت دیبانس چک بشه. مادامی که کلید از نظر برنامه فشرده نباشه (بعد از دیبانس این اتفاق میفته)؛ بحث های دیگه بیخوده.
                  از مرحله دوم به بعد باید همیشه چک بشه که اگه کلید ول شده همه چی به مرحله بعد برگرده.
                  حالا یک متغیر زمانی داریم که مثلا ابتدای کار برابر با 300 هست. و این به این معنی هست که مادامی که ما کلید رو فشار دادیم (و ولش نکردیم) هر چند میلی ثانیه فرض بشه این کلید تکرار شده. این مقدار رو میتونیم به مرور کم کنیم تا به مقدار مثلا 100 برسه. این میشه 10 کلید در ثانیه که باز هم بطور چشمی قابل تشخیصه. ولی اگر این مقدار کمتر بشه باید گام های کم و زیاد شدن بجای 1 به 5 یا 10 تغییر کنه. در این صورت باز هم نمایش کند هست ولی اعداد به سرعت بالاتری کم و زیاد میشن.

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

                  دیدگاه


                    #10
                    پاسخ : سرعت کلیدزنی در برنامه؟

                    راه حل سخت افزاری اعمال پالس به وقفه طبق شکل زیر.با کلید ابتدا یک پالس یک ثانیه وبعد پالسهای 250 میلی ثانیه به پایه وقفه ارسال می شود. در این روش وقفه بایستی روی لبه بالا رونده تنظیم باشد.RISING to generate an interrupt on the rising edge.

                    دیدگاه


                      #11
                      پاسخ : سرعت کلیدزنی در برنامه؟

                      سلام
                      شما می تونین یه تابع تاخیر خودتون بسازید که با توجه به تعداد دفعات یه متغیر یه تاخیر خاص ایجاد کنه
                      مثلا اگه از 10 بیشتر شد تاخیر رو یک دهم بکنه و 100 بیشتر شد خیلی کمتر
                      توی خود اون تابع هم یا از دستورات delay یا wait استفاده کنین و یا با استفاده از تایمر ها و یا با شمارش ...
                      بعد اون تابع رو توی روتین وقفه بذارین
                      به همین سادگی

                      دیدگاه


                        #12
                        پاسخ : سرعت کلیدزنی در برنامه؟

                        سلام
                        نوشته اصلی توسط رضا آقازاده
                        شما مجبوری این کار رو خودت دستی انجام بدی.
                        نوشتن کل این کد با استفاده از روال های موجود در بسکام نشدنیه. غیر از مرحله دیبانس اولیه بقیه موارد رو باید با استفاده از تایمر ها و وقفه ها خودتون بنویسین.
                        نوشته اصلی توسط arash_zp
                        سلام
                        شما می تونین یه تابع تاخیر خودتون بسازید که با توجه به تعداد دفعات یه متغیر یه تاخیر خاص ایجاد کنه
                        مثلا اگه از 10 بیشتر شد تاخیر رو یک دهم بکنه و 100 بیشتر شد خیلی کمتر
                        توی خود اون تابع هم یا از دستورات delay یا wait استفاده کنین و یا با استفاده از تایمر ها و یا با شمارش ...
                        بعد اون تابع رو توی روتین وقفه بذارین
                        به همین سادگی
                        من اینکار را بصورت دستی کردم و طبق قول شما ودوست دیگرمون هم تابع تاخیری با توجه به تایمر یک ساختم به اینصورت ولی متاسفانه اصلا موقعی که کلید را فشار میدم جوابی دریافت نمیکنم ؟
                        Do

                        Start Timer1
                        If Down = 0 Then
                        Stop Timer1
                        End If
                        Tim = Timer1
                        If Tim =< 100 Then
                        Incr F
                        Elseif Tim =< 1000 Then
                        F = F + 2
                        Else
                        F = F + 40
                        End If
                        loop
                        البته من این بخش اصلی برنامه را گذاشتم فقط میخوام بدونم ایا روشم درست است یا نه ؟ومشکل اینکه جوابی دریافت نمیکنم چیه؟

                        *** من در پروتئوس چک میکنم.***

                        دیدگاه


                          #13
                          پاسخ : سرعت کلیدزنی در برنامه؟

                          نوشته اصلی توسط arash_zp
                          سلام
                          شما می تونین یه تابع تاخیر خودتون بسازید که با توجه به تعداد دفعات یه متغیر یه تاخیر خاص ایجاد کنه
                          مثلا اگه از 10 بیشتر شد تاخیر رو یک دهم بکنه و 100 بیشتر شد خیلی کمتر
                          توی خود اون تابع هم یا از دستورات delay یا wait استفاده کنین و یا با استفاده از تایمر ها و یا با شمارش ...
                          بعد اون تابع رو توی روتین وقفه بذارین
                          به همین سادگی
                          فقط یک سوال پیش میاد.کجای برنامه بایستی متغیر ریست بشه تا برای دفعات بعدی کلید زدن دوباره قابل استفاده باشه .منظور اینه که متغیر هر جای برنامه که ریست بشه به ازای اجرای هر وقفه این اتفاق میافته و نمیشه تعداد دفعات را با اون حساب کرد

                          دیدگاه


                            #14
                            پاسخ : سرعت کلیدزنی در برنامه؟

                            با سلام
                            به نظر من بیایید یک دیبانس نرمافزاری به این صورت تعریف کنید البته با شرایط زیر :
                            1. وقفه های خارجی برای اسکن پوش باتون حساس به لبه پایین رونده باشند مثلا وقفه خارجی 0 و1
                            2. یک تایمر در برنامه تون حتما باید استفاده بشه ، اگه تایمری در برنامه دارید که برای کار دیگه ای هست میتونیمد برای این کار استفاده کنید مثلا تایمر 1
                            3.یک پین میکرو رو هم باید به این کار اختصاص بدین مثلا pb0
                            حالا کاری که باید بکنید اینه که بیایید در ابتدا پایه pb0 رو به صورت خروجی تعریف کنید با مقدار صفر بعد توی روتینهای وقفه خارجی، تایمر 1 رو روشن کنید و وقفه خارجی مورد نظر رو غیر فعال و پایه pb0 رو یک کنید حال برید به روتین سریز تایمر و یک متغیر به نام دیبانس تعریف کنید که توی همین روتین مقدارش پس از هر بار سریز یک واحد اضافه بشه و سپس یک ساختار if تعریف کنید که مثلا هر وقت متغیر مورد نظر ما به 20 رسید ، تایمر 1 خاموش ، متغیر دیبانس صفر ، پایه pb0 رو صفر و در آخر هم وقفهای خارجی رو فعال کنید ؛ به این ترتیب با فشردن هر پوش باتون روتین وقفه متناظر اجرا بعد مثلا به مدت زمانی معادل 20 دیبانس غیر فعال و دوباره فعال خواهد شد و البته از اونجا که وقفه نیاز به لبه پایین رونده داره ما هم امدیم هر 20 دیبانس یک لبه پایین رونده درست کردیم که خوب شاید همین 1و 0 کردن پایه pb0 کافی باشه اما برای اطمینان بیشتر به خاطر وجود نویز وقفه ها رو هم غیر فعال کنید بد نیست !


                            اینو یادم رفت، نحوه اتصال سخت افزار هم به شکل زیر باشه :

                            دیدگاه


                              #15
                              پاسخ : سرعت کلیدزنی در برنامه؟

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

                              دیدگاه

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