اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    char flag1=1;
    char hhh=0;
    char count=0;
    void RegConfigration()
    {
    //Timer2 Registers Prescaler= 16 - TMR2 PostScaler = 16 - PR2 = 150
    t2con=0b01111011;
    PR2 = 150;
    tmr2=0;
    PIR1.TMR2IF = 0;
    PIE1.TMR2IE = 1;
    INTCON.GIE = 1;
    INTCON.PEIE = 1;
    }
    void pinsconfigration()
    {
    TRISB.f7 =0;
    PORTB.f7 =0;
    trisc.f3 =1;
    }
    void interrupt()
    {
    if (PIR1.TMR2IF == 1)
    {
    count++;
    PIR1.TMR2IF = 0;
    if (count==100)
    {
    PR2 = 150;
    tmr2=0;
    PORTB.F7 =0;
    count=0;
    t2con.tmr2on=0;
    }
    }
    }
    void main()
    {
    pinsConfigration();
    RegConfigration();
    hhh=0;
    flag1=1;
    flag2=0;
    while(1)
    {
    if (portc.f3==0) { if (hhh==0)
    { portb.f7=1;
    flag1=0;
    hhh=1;
    }
    }
    if (hhh==1) { if (portc.f3==1)
    {
    t2con.tmr2on=1;
    }
    }
    if (portc.f3==0) { if (flag1==0)
    {
    portb.f7=0;
    hhh=0;
    flag1=1;
    }
    }
    }
    }
    مشکلم اینه که بعضی وقتا باید چند بار میکروسویچ رو بزنم تا LED تغییر وضعیت بده !!!؟ و تایمرم که درست کار نمیکنه و سر یک ثانیه LED رو خاموش نمیکنه !! این مشکل ها که حل بشه میرم سر وقت صورت مسئله ی اصلی
    من از میکروسی استفاده می کنم و PIC 16f877


    #2
    پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

    سلام.برنامه رو گذرا یه نگاهی انداختم.وقتی میکرو سوییچ رو میزنی یه خرده دستت رو روی سوییچ نگه دار( در حد 1 ثانیه یا کمتر) ببین بازهم همین اتفاق میفته؟

    دیدگاه


      #3
      پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

      نوشته اصلی توسط شاهرخ
      سلام.برنامه رو گذرا یه نگاهی انداختم.وقتی میکرو سوییچ رو میزنی یه خرده دستت رو روی سوییچ نگه دار( در حد 1 ثانیه یا کمتر) ببین بازهم همین اتفاق میفته؟
      مشکلم سر همین حساس نبودن میکروسوئیچه اگه 1 ثانیه نگه دارم معمولا درست کار میکنه ولی من میخوام خیلی حساس باشه یعنی به محض اینکه میکرو سوویچ رو زدم عمل کنه و خطا هم نداشته باشه

      دیدگاه


        #4
        پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

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

        دیدگاه


          #5
          پاسخ : مشکل برای تاگل کردن LED و استفاده از تایم&#1

          سلام.

          اینتراپت تایمر 2 رو فعال کردی ولی ISRش رو نذاشتی. اینجوری وقتی تایمر 2 فعال میشه و اینتراپت میده، هی stack رو overflow میکنه.

          در ضمن نگفتی کلاک میکروت چقده؟
          خویشتن را اصلاح کنید تا خداوند کارها را اصلاح کند. امیر المومنین علی (ع)

          دیدگاه


            #6
            پاسخ : پاسخ : مشکل برای تاگل کردن LED و استفاده از تایم

            نوشته اصلی توسط hamed8419215
            سلام.

            اینتراپت تایمر 2 رو فعال کردی ولی ISRش رو نذاشتی. اینجوری وقتی تایمر 2 فعال میشه و اینتراپت میده، هی stack رو overflow میکنه.

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

            دیدگاه


              #7
              پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

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

              دیدگاه


                #8
                پاسخ : مشکل برای تاگل کردن LED و استفاده از تایم&#1

                ISR مخفف Interrupt Service Routine هست.

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

                به زبون یه کم پیچیده:
                وقتی یک وقفه ایجاد میشه، آدرس فعلی PC داخل Stack ذخیره شده و سپس اجرای برنامه به بردار وقفه فرستاده میشه (در میکروهای سری Mid range فقط یک بردار وقفه وجود داره). در بردار وقفه آدرس زیر برنامه وقفه (یا همون ISR) قرار داره و اجرای برنامه رو به زیر برنامه وقفه هدایت میکنه (با یک دستور goto).
                داخل زیر برنامه وقفه به وقفه رسیدگی میشه و فلگ مربوطه پاک میشه (در PIC باید به صورت دستی فلگ وقفه پاک بشه). در آخرین خط زیر برنامه وقفه، اجرای برنامه به محل اول خود (یعنی جایی از برنامه اصلی که وقفه در اون جا رخ داده و آدرسش در Stack ذخیره شده) بر میگرده.
                در میکروهای سری mid range، اندازه Stack برابر 8 هست. یعنی بعد از 8 بار فراخوانی زیربرنامه، Stack سرریز خواهد شد.

                حال اگه فرض شه که وقفه ای فعال باشه و زیر برنامه وقفه نداشته باشه که به اون رسیدگی شه، میکرو پس از وقوع وقفه مدام به بردار وقفه میپره و برنامش قاط میزنه. :biggrin:
                خویشتن را اصلاح کنید تا خداوند کارها را اصلاح کند. امیر المومنین علی (ع)

                دیدگاه


                  #9
                  پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

                  وقفه خارجی:

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

                  وقفه خارجی قابلیت تعریف در لبه بالا رونده یا پایین رونده رو داره. یعنی شما میتونین مشخص کنین که تغییر وضعیت از 0 به 1 وقفه ایجاد کنه یا تغییر وضعیت از 1 به 0.
                  امیدوارم به درد خورده باشه.
                  خویشتن را اصلاح کنید تا خداوند کارها را اصلاح کند. امیر المومنین علی (ع)

                  دیدگاه


                    #10
                    پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

                    نوشته اصلی توسط hamed8419215
                    وقفه خارجی:

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

                    وقفه خارجی قابلیت تعریف در لبه بالا رونده یا پایین رونده رو داره. یعنی شما میتونین مشخص کنین که تغییر وضعیت از 0 به 1 وقفه ایجاد کنه یا تغییر وضعیت از 1 به 0.
                    امیدوارم به درد خورده باشه.
                    ممنون از توضیحی که دادید من بررسی کردم و دیدم که فقط یه وقفه ی خارجی برای کل میکرو داریم پس اصلا منطقی نیست من بیام ازش استفاده کنم چون اگه تعداد میکرو سوئیچ ها بیشتر از یکی بود چی ؟ من فکر می کنم این مشکل بر میگرده به لغزش میکرو سوئیچ و با همین if میشه حلش کرد . فکر می کنم صورت سئوال بالا هم میخواد در نهایت همین مشکل رو حل کنه یعنی میکرو سوئیچ فقط توی یه زمان های خاصی فعال بشه در این صورت ذیگه این مشکل پیش نمی آد . البته امیدوارم :biggrin:

                    دیدگاه


                      #11
                      پاسخ : مشکل برای تاگل کردن LED و استفاده از تایمر

                      سلام.

                      درسته که تعداد پین های اینتراپت خارجی در میکروکنترلرها محدوده، ولی میکروهای PIC یه قابلیت جالب به نام IOC (مخفف Interrupt On Change) دارن که میشه از اون به عنوان اینتراپت خارجی استفاده کرد.
                      بعضی از پین های میکروهای PIC که IOC دارن، میتونن با هر تغییر در سطح منطقی روی اون پین، وقفه ایجاد کنن. به عبارتی IOC یه جور وقفه خارجیه که به هر دو لبه حساسه (اگه شما به یه لبه خاص نیاز دارین، میتونین به صورت نرم افزاری، لبه دلخواه خود رو ایجاد کنین).

                      اکثر مدلهای PIC (حتی مدلهای قدیمی) این قابلیت رو دارن. معمولا IOC روی پورت B هست.

                      اصولا استفاده از If صرفا برای اینکه بخوایین Debounce کنین، کار جالبی نیست. شما میتوننی Debounce رو به صورت نرم افزاری یا سخت افزاری انجام بدین؛ جوری که سرعت برنامه تون کاهش پیدا نکنه.

                      یه روش برای خوندن سوییچهایی که روی پینهای میکرو قرار دارن (و تعدادشون هم زیاده) اینه که به صورت دوره ای (مثلا هر 10 میلی ثانیه) وضعیت اونا رو چک کنین و اگه مثلا برای سه دوره متوالی در یک وضعیت بودند، اون وضیت رو تثبیت شده در نظر بگیرین و ارسالش کنین به برنامه.

                      خویشتن را اصلاح کنید تا خداوند کارها را اصلاح کند. امیر المومنین علی (ع)

                      دیدگاه

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