اطلاعیه

Collapse
No announcement yet.

تایمر کانتر 1

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

    تایمر کانتر 1

    روز همگی بخیر
    من یه مشکل کوچیک توی تایمر 1 مگا 32 دارم
    من میخوام هر بار که پوش باتن رو میزنم فرکانس تایمر عوض بشه (خوب خیلیم خوب و راحت این قسمتش درست کار میکنه)
    مشکل اینجاست که بعضی وقتآ‌ها موقع تتغییر فرکانس یه 3-4 ثانیهآ‌ایی مکس میکنه بعد فرکانس عوض میشه
    حالا به نظرتون من چیکار کنم؟ مشکل از کجاست؟
    یه تیکه از برنامه رو اینجا میزارم

    if (button==1) //moteghayere kelid ke ba harbar feshorde shodan adadesh ta 4 bala mire
    {

    if (beatFlag==1) //age beatFlag==1 bood frequency tanzim beshe
    {
    TCCR1A=0x40;
    TCCR1B=0x0D;
    OCR1AH=0x10;
    OCR1AL=0x00;
    beatFlag=0;
    }

    }

    #2
    پاسخ : تایمر کانتر 1

    کسی نیست کمکمون کنه :sad:

    دیدگاه


      #3
      پاسخ : تایمر کانتر 1

      این تیکه ای که اینجا گذاشتین رو کجای برنامه قرار دادین؟
      توی کدهاتون تاخیر(delay) هم دارید؟

      دیدگاه


        #4
        پاسخ : تایمر کانتر 1

        این تیکه توی (1)while گذاشتم
        توی برنامه تاخیر و تایمر 2 RTC و ADC هم دارم اما وقتی که میخواد فرکانس رو تغییر بده بااندازه گیری من 10 ثانیه طول میکشه (البته بعضی وقتا) ولی تو این مدت 10 ثانیه میکرو کار میکنه یعنی هنگ نمیکنه مثلا صفحه تاچم کار میکنه، سنسور خونده میشه و ... :angry:

        دیدگاه


          #5
          پاسخ : تایمر کانتر 1

          beatFlag کجا تغییر می کند؟ شاید برابر با 1 نمی شه.

          دیدگاه


            #6
            پاسخ : تایمر کانتر 1

            beatFlag رو گذاشتم که اون تیکه از برنامه فقط یه بار اجرا بشه
            بدون اونم این مشکلو دارم
            برنامه رو به این شکل تغییر دادم بهتر شد اما هنوز این مشکلو دارم
            beat=button

            کد:
             if (beat == 0)    TCCR1A = 0;
            
              else { 
               TCCR1A = (1<<COM1A0);  //0x40; 
               TCCR1B = (1<<WGM12)|(5<<CS10); //0x0D; 
               switch (beat) { 
                 case 1: OCR1A = 0x1000; break; 
                 case 2: OCR1A = 0x0800; break; 
                 case 3: OCR1A = 0x0500; break; 
                 case 4: OCR1A = 0x0400; break; 
               } 
               delay_ms(20); 
              }

            دیدگاه


              #7
              پاسخ : تایمر کانتر 1

              آقا من همه چی رو غیر فعال کردم فقط تایمر 1 و گذاشتم کار کنه، طبق برنامهآ‌ی زیر، اما موقع تغییر فرکانس از 1 به 2 دوباره نزدیک به 10 ثانیه طول میکشه. :sad:
              یعنی هیشکی نمیتونه کمک کنه؟؟؟؟؟ :cry:
              کد:
              while(1)
               { 
               TCCR1A = 0x40; 
               TCCR1B = 0x0D; 
                 switch (beat) { 
                   case 1: OCR1A = 0x1000; break; 
                   case 2: OCR1A = 0x0800; break; 
                   case 3: OCR1A = 0x0500; break; 
                   case 4: OCR1A = 0x0400; break; 
                 delay_ms(20); 
                 }    
                
                delay_ms (3000);
                beat++;
                if (beat>4) beat=1;
              }

              دیدگاه


                #8
                پاسخ : تایمر کانتر 1

                نوشته اصلی توسط ara_d777
                آقا من همه چی رو غیر فعال کردم فقط تایمر 1 و گذاشتم کار کنه، طبق برنامهآ‌ی زیر، اما موقع تغییر فرکانس از 1 به 2 دوباره نزدیک به 10 ثانیه طول میکشه. :sad:
                یعنی هیشکی نمیتونه کمک کنه؟؟؟؟؟ :cry:
                کد:
                while(1)
                 { 
                 TCCR1A = 0x40; 
                 TCCR1B = 0x0D; 
                   switch (beat) { 
                     case 1: OCR1A = 0x1000; break; 
                     case 2: OCR1A = 0x0800; break; 
                     case 3: OCR1A = 0x0500; break; 
                     case 4: OCR1A = 0x0400; break; 
                   delay_ms(20); 
                   }    
                  
                  delay_ms (3000);
                  beat++;
                  if (beat>4) beat=1;
                }
                این طور که من از برنامه شما برداشت کردم شما میخواهید (حدود ) هر 3 ثانیه یک بار فرکانس موج مربعی روی پین OC1A را تغییر دهید (متغییر بین چهار مقدار) (یعنی 3 ثانیه با یک فرکانس ثابت بعد این مقدار تغییر میکند و... )

                من برنامه را کامپایل نکردم ولی فکرش به نظر درست میاد.!!
                ولی بهتر است مقدار دهی به رجیستر های TCCR1A و TCCR1B قبل از حلقه بینهایت باشد و وظیفه حلقه فقط تغییر در OCR1A باشد.(اون delay بیست میلی ثانیه هم یه چیز الکیه - خیلی بدجا هم نوشتینش)
                اگر منظورتون را درست فهمیدم ، بگید تا برم سر وقت کامپایل و دیباگش

                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                دیدگاه


                  #9
                  پاسخ : تایمر کانتر 1

                  من برنامه را یکم تغییر دادم و تو پروتئوس جواب درست گرفتم:
                  محاسبات برای بدست آوردن فرکانس های مد نظرتون را خودتون انجام بدید (که فکر نمیکنم توش مشکلی داشته باشید ، اگرم داشتید بگید میخواید تو چه فرکانس هایی تغییر کنه تا کد را اصلاح کنم )

                  کد استاندارد کدویژن ، میکرو مگا32 با کلاک 8 مگاهرتز :

                  کد:
                  #include <mega32.h> 
                  #define xtal 8000000
                  #include <delay.h>
                  void main(void) 
                  {  
                    unsigned char beat=1;
                    DDRD.5=1;
                    OCR1A=0x1000;
                    TCCR1A = 0x40; 
                    TCCR1B = 0x09; 
                  
                    while(1)
                    { 
                      switch (beat) 
                      { 
                        case 1: 
                        {
                          OCR1A = 0x1000; 
                          break;
                        } 
                        case 2: 
                        {
                          OCR1A = 0x0800; 
                          break;
                        } 
                        case 3: 
                        {
                          OCR1A = 0x0500; 
                          break;
                        } 
                        case 4:
                        {
                          OCR1A = 0x0400; 
                          break; 
                        }
                      }    
                      
                      delay_ms (3000);
                      beat++;
                      if (beat>4) beat=1;
                    }
                  }
                  راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                  کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                  نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                  http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                  انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                  دیدگاه


                    #10
                    پاسخ : تایمر کانتر 1

                    راستش این برنامه رو که هر 3 ثانیه فرکانس عوض میشه رو برای تست نوشتم وگرنه برنامه‌ی اصلی من توسط کاربر فرکانس عوض میشه اونم با استفاده از صفحه تاچ
                    مقدار TCCR1A و TCCR1B رو قبل از حلقه‌ی اصلی هم نوشتم اما جواب نداد.
                    من فرکانس‌های 1و2و3و4 هرتز میخوام درست کنم
                    الان فهمیدم که برنامه با مقدار TCCR1B = 0x09 (که میشه 8 مگا هرتز) درست کار میکنه اما با مقدار TCCR1B = 0x0D به همون مشکل قبلی برخورد میکنه (یک نکته‌ی مثبت توی رفع مشکل :nice: )
                    حالا اگه من بخوام با مقدار TCCR1A = 0x40 و TCCR1B = 0x09 فرکانس‌های 0و1و2و3و4 هرتز درست کنم مقدار OCR1A رو چقدر بدم؟
                    فرمول محاسبش چیه؟

                    دیدگاه

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