اطلاعیه

Collapse
No announcement yet.

روشن شدن دو موتور با تایمرصفر mega16 ؟

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

    روشن شدن دو موتور با تایمرصفر mega16 ؟


    با سلام میخوام برنامه ای بنویسم با تایمر 1 مگا 16 بدون استفاده از وقفه تایمر یعنی روش polling مانند همین چیزی که در زیر نوشتم میخوام در واقع 5 ثانیه موتور اول روشن بشه و بعد از 5 ثانیه موتور اول خاموش وموتور دوم روشن بشه واین عمل تکرار گردد حالا نمیدونم چه کدی به برنامه زیر اضافه کنم وکجای برنامه بنویسمش دوستان کمک کنن:

    #include <mega16.h>

    // Declare your global variables here

    void main(void)
    {
    DDRC=0xFF;
    PORTC=0x01;
    TCNT1H=0xb3;
    TCNT1L=0xb4;
    TCCR1A=0x00;
    TCCR1B=0x04;


    while (1)
    {
    while(!(TIFR & 0x04));
    TIFR|=0x40;
    TCNT1H=0xb3;
    TCNT1L=0xb4;

    };
    }


    #2
    پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

    کد:
    while(1)
    {
    if(TCNT1 >= X)
    {
    TCNT1 = 0;
    if(a)
    MOTOR 1 = 1;
    MOTOR 2 = 0;
    b = 1;
    a = 0;
    }
    else if(b)
    {
    MOTOR 1 = 0;
    MOTOR 2 = 1;
    b = 0;
    a = 1;
    }
    }
    دودمانم بر باد رفت

    دیدگاه


      #3
      پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

      میشه در مورد این کدی که نوشتید توضیح بدید متغییر X چیه ؟

      دیدگاه


        #4
        پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

        کد رو کمی تصیح کردم
        کد:
        bit b = 0;
        bit a = 1;
        int x;
        while(1)
        {
        if(TCNT1 >= x)
        {
        if(a)
        MOTOR 1 = 1;
        MOTOR 2 = 0;
        b = 1;
        a = 0;
        }
        else if(b)
        {
        MOTOR 1 = 0;
        MOTOR 2 = 1;
        b = 0;
        a = 1;
        }
        TCNT1 = 0;
        }
        متغییر X مقداری هست که اگه TCNT بهش رسید یعنی زمان لازم ایجاد شده پس وارد شرط میشه .
        بیت های aو b رو هم توضیح میدم.
        پس از ورود به شرط ما مقدار بیت A که قبلا به صورت دستی در ابتدای برنامه یک شده بود چک میکنیم .اگه این بیت یک باشه موتور شماره یک روشن میشه.
        بعد بیت a رو صفر میکنیم تا اگه دوباره وارد شرط شدیم این دستور مجددا تکرار نشه.
        بعد بیت B رو یک میکنیم تا اگه دوباره زمان لازم ایجاد شد وارد شرط دوم شد بیتb مقدار لازم رو داشته باشه.
        بعد که دستورات اجراشد.زمانی که داریم از شرط خارج میشیم tcnt رو صفر میکنیم این حرکت معادل این هست که تایمر رو صفر کردیم.
        بعد از این که تایمر مجددا زمان لازم رو ایجاد کرد.
        زمانی که در شرط اول مقدار a صفر شده پس این شرط صحیح نبوده و وارد شرط دوم میشه.چون در شرط قبلی bit b رو یک کرده بودیم پس وارد این شرط میشه.
        با وارد شدن به این شرط موتور 1 خاموش میشه و موتور 2 روشن میشه.
        بیت a رو یک میکنیم تا دوباره حلقه بالا تکرار بشه.
        متغییر b رو صفر میکنیم چون دیگه بهش احتیاج نداریم.
        قبل از خروج کامل از اخرین شرط متغییر tcnt رو مجددا صفر میکنیم تا timer صفر بشه.
        این برنامه در یک حلقه نوشته شده پس این عمل تکرار متداول داره.
        باقی دستوراتش هم باخودت مثل تنظیم تایمر ها و باقی کد ها.
        به همین سادگی به همین خوشمزگی :icon_razz:
        دودمانم بر باد رفت

        دیدگاه


          #5
          پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

          برنامه رو تکمیل کردم با کدهای بالا اما جواب نداد !

          دیدگاه


            #6
            پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

            برنامه و شماتیک
            http://mkbup.vvs.ir/do.php?filename=13807185251.rar
            دودمانم بر باد رفت

            دیدگاه


              #7
              پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

              مرسی دوست عزیز اما برنامه شما یک ایراد داره واونم اینه که وقتی تغذیه مدار رو وصل می کنی 1 ثانیه طول میکشه تا موتور روشن بشه در صورتی ما میخواهیم زمان سنجی بعد از روشن شدن آی سی صورت بگیره به طور واضح تر اگر تاخیر 5 ثانیه باشه به محص روشن کردن آی سی هر دو موتور خاموشند !

              دیدگاه


                #8
                پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

                خوب کاری نداره ابتدا موتور یک رو دستی روشن میکنیم بعد موتور دو خودش روشن شه.
                کد:
                کد:
                #include <mega32.h>
                
                #define MOTOR_1  PORTA.0
                #define MOTOR_2  PORTA.1
                
                     bit b   = 1;
                     bit a   = 0;
                unsigned int timer = 4650; //930 baraye 1 sec ==> 940*5 = 4700
                
                
                void main (void)
                {
                PORTA = 0x00;
                DDRA = 0xFF;
                TCCR1A=0x00;
                TCCR1B=0x05;
                TCNT1 = 0;
                MOTOR_1 = 1;
                while(1)
                {
                
                 if(TCNT1 >= timer)
                 {
                 if(a)
                 {
                  MOTOR_1 = 1;
                  MOTOR_2 = 0;
                  b = 1;
                  a = 0;
                  } 
                  
                 else if(b)
                 {
                  MOTOR_1 = 0;
                  MOTOR_2 = 1;
                  b = 0;
                  a = 1;
                  }
                 TCNT1 = 0;
                 } 
                } 
                 
                }//END
                دودمانم بر باد رفت

                دیدگاه


                  #9
                  پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

                  چرا 930 را در 5 ضرب کردید ؟

                  دیدگاه


                    #10
                    پاسخ : روشن شدن دو موتور با تایمرصفر mega16 ؟

                    فرکانس میکرو 1 مگاهرتز هست .با مقسم 1024 کلاک تایمر در یک سانیه میشه 977 یعنی اگه رجیستر TCNT به مقدار977 برسه یک ثانیه ساخته شده.
                    حالا اگه این عدد در 5 ضرب کنیم 5 ثانیه ساخته میشه
                    و از اونجایی که داریم به روش پول کار میکنیم این مقدار رو کمتر تر در نظر میگیریم چون خود اجرای دستورات کلاک میگیره .ولی چون حالا خودم عددش رو ذهنی حساب کرده بودم اشتباه نوشتم 930 ولی اصلش 977 هست.
                    دودمانم بر باد رفت

                    دیدگاه

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