اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام میخوام برنامه ای بنویسم که هر 5 دقیقه یکبار به مدت یک دقیقه LED را روشن کنه و بعد خاموش بشه و این عمل تکرار بشه ، کد زیر را نوشتم اما جواب نمیده ! مقادیر تایمر را طوری باگذاری کردم که هر 5 ثانیه یکبار سر ریز میکنه .
      #include <mega8.h>
    #define LED PORTD.0
    unsigned int i,m=0;

    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    i++;
    TCNT1H=0xEC;
    TCNT1L=0xEC;

    }

    void main(void)
    {
    DDRD.0=1;
    TCCR1B=0x05;
    TCCR1A=0x00;
    TCNT1H=0xEC;
    TCNT1L=0xEC;
    TIMSK=0x04;

    #asm("sei")

    while (1);
    {
    if(i==12)
    m++;
    if(m==5)
    {
    LED=1;
    if(m==6)
    LED=0;
    i=0;
    m=0;

    }

    }

    }
    خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

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

    نوشته اصلی توسط fmicro نمایش پست ها
    سلام میخوام برنامه ای بنویسم که هر 5 دقیقه یکبار به مدت یک دقیقه LED را روشن کنه و بعد خاموش بشه و این عمل تکرار بشه ، کد زیر را نوشتم اما جواب نمیده ! مقادیر تایمر را طوری باگذاری کردم که هر 5 ثانیه یکبار سر ریز میکنه .
      #include <mega8.h>
    #define LED PORTD.0
    unsigned int i,m=0;

    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    i++;
    TCNT1H=0xEC;
    TCNT1L=0xEC;

    }

    void main(void)
    {
    DDRD.0=1;
    TCCR1B=0x05;
    TCCR1A=0x00;
    TCNT1H=0xEC;
    TCNT1L=0xEC;
    TIMSK=0x04;

    #asm("sei")

    while (1);
    {
    if(i==12)
    m++;
    if(m==5)
    {
    LED=1;
    if(m==6)
    LED=0;
    i=0;
    m=0;

    }

    }

    }
    سلام
    من کد رو یک نگاه کلی انداختم؛ چند جا اشتباه وجود داره. اول توی بلاک بندی، بعد توی 0 کردن مقدار متغیرها. یک بار خودتون برنامه رو خط به خط مرور کنید متوجه میشید.
    مورد بعدی این که توی تعریف i از کلمه volatile هم استفاده کنید.

    دیدگاه


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

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      من کد رو یک نگاه کلی انداختم؛ چند جا اشتباه وجود داره. اول توی بلاک بندی، بعد توی 0 کردن مقدار متغیرها. یک بار خودتون برنامه رو خط به خط مرور کنید متوجه میشید.
      مورد بعدی این که توی تعریف i از کلمه volatile هم استفاده کنید.

      کجای بلک بندی ؟ و این خب متغییرها باید در آخر شرط صفر بشن ، یکی از اشتباهاتم این است که بعد از while سمی کالن گذاشتم .
      خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

      دیدگاه


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

        نوشته اصلی توسط fmicro نمایش پست ها
        کجای بلک بندی ؟ و این خب متغییرها باید در آخر شرط صفر بشن ، یکی از اشتباهاتم این است که بعد از while سمی کالن گذاشتم .
        مثلا شما اومدی چک کردی که i رسیده به ۱۲ یا نه. خوب باید همونجا توی بلاک اون شرط i رو صفر کنی. اون سمی کالن هم نباید باشه. چندتا مورد دیگه اینجوری هم هست که اگر دقت بشه راحت پیدا میشن.
        یه مورد دیگه هم الآن یادم اومد که البته اشکالی در برنامه ایجاد نمیکنه ولی بهتره از الآن سعی کنید رعایت کنید. اون مورد بحث مدیریت حافظه و پردازش هستش. ببینید avr یک ماشین ۸ بیتیه و خیلی راحت تر با مقادیر ۸ بیتی کار میکنه. از طرفی متغیرهای شما هیچ کدوم بیشتر از ۲۵۵ نمیشه. بنابر این بهتره نوع متغیرها رو unsigned char بذارید که هم جای کمتری میگیره، هم پردازش سریع تری داره. این مورد خودشو توی این برنامه ساده اصلا نشون نمیده ولی توی برنامه های بزرگ، رعایت همین نکات کوچیک میتونه تاثیر زیادی داشته باشه.
        جدیدترین ویرایش توسط hossein.m98; ۱۸:۳۹ ۱۴۰۰/۱۲/۱۴.

        دیدگاه


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

          شما خودتون گفتید voltatileبذارم نه unsigned char و اینکه مقدار دهی رجیسترها داخل اینتراپت صحیحه ؟ و در آخر اینکه مواردی که گفتید را اصلاح کردم اما جواب نداد
          خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

          دیدگاه


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

            نوشته اصلی توسط fmicro نمایش پست ها
            شما خودتون گفتید voltatileبذارم نه unsigned char و اینکه مقدار دهی رجیسترها داخل اینتراپت صحیحه ؟ و در آخر اینکه مواردی که گفتید را اصلاح کردم اما جواب نداد
            نه دوست عزیز volatile یک نوع داده نیست یه ویژگیه! ویژگی ها از نوع داده جدا هستن.
            تغییرات هم حتما ناقص اعمال کردی که جواب نمیده دیگه.

            دیدگاه


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

              الان با تغییراتی که دادم قسمت اول برنامه اجرا میشه یعنی 5 دقیقه که میگذره ، ال ای دی روشن میشه اما پارت دوم اجرا نمیشه یعنی یک دقیقه روشن بعد خاموش اجرا نمیشه !
                #include <mega8.h>
              #define LED PORTD.0
              volatile int i=0,m=0;

              interrupt [TIM1_OVF] void timer1_ovf_isr(void)
              {
              i++;
              TCNT1H=0xEC;
              TCNT1L=0xEC;

              }

              void main(void)
              {
              DDRD.0=1;
              TCCR1B=0x05;
              TCCR1A=0x00;
              TCNT1H=0xEC;
              TCNT1L=0xEC;
              TIMSK=0x04;

              #asm("sei")

              while (1)
              {
              if(i==12){
              i=0;
              m++;
              if(m==5)
              {
              LED=1;
              if(m==6)
              {
              // i=0;
              m=0;
              LED=0;
              }

              }
              }

              }

              }
              خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

              دیدگاه


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

                نوشته اصلی توسط fmicro نمایش پست ها
                الان با تغییراتی که دادم قسمت اول برنامه اجرا میشه یعنی 5 دقیقه که میگذره ، ال ای دی روشن میشه اما پارت دوم اجرا نمیشه یعنی یک دقیقه روشن بعد خاموش اجرا نمیشه !
                  #include <mega8.h>
                #define LED PORTD.0
                volatile int i=0,m=0;

                interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                {
                i++;
                TCNT1H=0xEC;
                TCNT1L=0xEC;

                }

                void main(void)
                {
                DDRD.0=1;
                TCCR1B=0x05;
                TCCR1A=0x00;
                TCNT1H=0xEC;
                TCNT1L=0xEC;
                TIMSK=0x04;

                #asm("sei")

                while (1)
                {
                if(i==12){
                i=0;
                m++;
                if(m==5)
                {
                LED=1;
                if(m==6)
                {
                // i=0;
                m=0;
                LED=0;
                }

                }
                }

                }

                }
                اگر if(m==5) رو به if(m>=5) تغییر بدی احتمالا درست بشه.

                دیدگاه


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

                  نوشته اصلی توسط hossein.m98 نمایش پست ها
                  اگر if(m==5) رو به if(m>=5) تغییر بدی احتمالا درست بشه.
                  خیر نشد !!! ...مهندس مشکل از بعد از خط LED=1 است ، چون همانطور که گفتم ال ای دی 5 دقیقه روشن می ماند و دیگر خاموش نمی شود ، هدف ما این است که هر 5 دقیقه یکبار ال ای دی به مدت یک دقیقه روشن و بعد از یک دقیقه خاموش شود و مجددا 5 دقیقه بعد ال ای دی روشن شود و.......
                  خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

                  دیدگاه


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

                    نوشته اصلی توسط fmicro نمایش پست ها
                    خیر نشد !!! ...مهندس مشکل از بعد از خط LED=1 است ، چون همانطور که گفتم ال ای دی 5 دقیقه روشن می ماند و دیگر خاموش نمی شود ، هدف ما این است که هر 5 دقیقه یکبار ال ای دی به مدت یک دقیقه روشن و بعد از یک دقیقه خاموش شود و مجددا 5 دقیقه بعد ال ای دی روشن شود و.......

                    #include <mega8.h>


                    #define LED PORTD.0


                    volatile unsigned char i = 0;
                    unsigned char m = 0;


                    interrupt[TIM1_OVF] void timer1_ovf_isr(void)
                    {
                    i++;
                    TCNT1H = 0xEC;
                    TCNT1L = 0xEC;
                    }


                    void main(void)
                    {
                    DDRD.0 = 1;
                    PORTD.0 = 0;
                    TCCR1B = 0x05;
                    TCCR1A = 0x00;
                    TCNT1H = 0xEC;
                    TCNT1L = 0xEC;
                    TIMSK = 0x04;


                    #asm("sei")


                    while (1)
                    {
                    if (i >= 12)
                    {
                    i = 0;
                    m++;
                    if (m == 5)
                    {
                    LED = 1;
                    }
                    else if (m == 6)
                    {
                    m = 0;
                    LED = 0;
                    }
                    }
                    }
                    }

                    دیدگاه


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

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

                      دیدگاه


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

                        نوشته اصلی توسط fmicro نمایش پست ها
                        ممنون آقای مهندس ...سپاس از شما .....، الان نتیجه داد فقط دلیل اینکه برای متغیر i کلمه voltatime تعریف می کنیم چی هست ؟
                        ببینید کمپایلرها غالبا مدهای بهینه*سازی دارن. به این صورت که سعی میکنن مثلا متغیرهای بدون استفاده رو حذف کنن یا چیزهایی شبیه به این. مورد بعدی که وجود داره اینه که توی بعضی پردازنده ها پردازش مستقیما روی RAM امکان*پذیر نیست. یعنی مثلا CPU برای جمع کردن دوتا متغیر که توی فضای RAM واقع شدن، باید اون ها رو توی رجیسترهای پردازنده لود و پردازش کنه، بعد نتیجه رو توی محل مناسب قرار گرفته روی RAM آپدیت کنه. مشکلی که به وجود میاد اینه که ممکنه توی بعضی شرایط این لود کردن و نتیجه رو آپدیت کردن (اصطلاحا میگن Laod و Store کردن) با تشخیص کمپایلر، دقیقا مطابق خواسته ما انجام نشه!
                        توی این برنامه ما داریم داخل سرویس وقفه i رو یک واحد زیاد میکنیم و به صورت موازی توی حلقه اصلی برنامه چک اش میکنیم. توی اینجور کدها ممکنه تحت شرایطی کمپایلر تشخیص بده که بهتره لود و استور کردن بلافاصله انجام نشه. وقتی بیاییم از کلمه volatile استفاده کنیم، کمپایلر لود و استور کردن رو بلافاصله بعد از هر تغییر انجام میده و بهینه*سازی روی اون متغیر خاص انجام نمیده. البته این مورد شاید برای کد ساده شما هیچ وقت رخ نده ولی خوب بهتره ازش پیشگیری کرد.

                        دیدگاه

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