ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 9 از 9

موضوع: تایمر-CCS

  1. #1
    2011/01/29
    تهران
    484
    16

    تایمر-CCS

    سلام به دوستان و اساتید گرامی
    دوتا سوال داشتم در مورد تایمر.
    با pic18f452-CCS-crystal=16mhz - no PLL

    1- آیا راهی ( به جز استفاده از متغیر های عمومی ) برای انتقال متغیر به تابع اینتراپت هست ؟
    مثلا:
    کد:
    #int_timer2
    void timer2_ISR(float variable1 , unsigned int8 variable2)
    2-اگر بخواهیم تایمر یه عدد غیر رند مثلا 62470 رو بشماره باید چیکار کرد؟
    با حساب کتاب من باید تایمر رو اینجوری تنظیم کرد:
    کد:
    setup_timer2(16,255,16);
    و بعد 3.8 برابر صبر کرد!
    خوب این میشه 3 بار اینتراپت به علاوه ی 208 بار شمارش اضافی.
    این شمارش اضافی رو شما بودید چه طور در میاوردید؟

    مشکل اینه که با تغییر دادن مقدار تایمر تنظیمات تایمر یعنی -period-postscaler-prescaler از بین میره .

    متشکر
    -----------------------------
    ویرایش جدید:
    البته برای سوال دوم خودم چند تا راهکار به ذهنم میرسه که هیچکدوم چنگی به دل نمیزنه:
    1- استفاده از setup_timer دو بار در وقفه یک بار برای تنظیم حالت شمارش 0.8 یک بار هم برای برگرداندن از اون حالت
    2- استفاده از تاخیر delay که واقعا بده
    3- گرفتن مقدار الان تایمر و یک جمع و تفریق برای در آوردن 0.8 و صبر کردن تا رسیدن به مقدار جدید ( یه چیزی مثل همون مورد دوم )
    که بازم میگم همه روش های ابتدایی و بدی هستن
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
  2. #2
    2010/02/06
    mazandaran
    71
    1

    پاسخ : تايمر-CCS

    سلام دوست عزيز .من از هرطرف ميخونم چيزي دست گيرم نميشه ميشه يكم بيشتر توضيح بدي.اگه دقيقا بگي چيكارمي خواي بكنب بهتر ميشه كمك كرد
  3. #3
    2011/01/29
    تهران
    484
    16

    پاسخ : تایمر-CCS

    نقل قول نوشته اصلی توسط ramez
    سلام دوست عزيز .من از هرطرف ميخونم چيزي دست گيرم نميشه ميشه يكم بيشتر توضيح بدي.اگه دقيقا بگي چيكارمي خواي بكنب بهتر ميشه كمك كرد
    خدا خیرت بده.( بلاخره یه نفر اومد)
    اول خدمتت عرض کنم که من می خوام کار رو بهینه کنم ( وگرنه با همون روش هایی که گفتم الان دارم کار می کنم)
    دوم خدمتتون عرض کنم که من این سوال رو بعد از اینکه یه هفته تو این سایت موند و کسی جواب نداد رفتم از بچه های سایت ccsinfo پرسیدم اونا جواب دادن ( البته اونا هم گفتن که نمیشه- همین رو استفاده کن)
    سوم:
    و اما مشکل:
    1- شما چطور متغیر هاتون رو به تابع وقفه (ISR) منتقل می کنید ؟
    من از متغیر های عمومی استفاده کردم ، شما راه بهتری بلدید؟
    2- فرض کنید عددی رو بصورت منظم می خواهید بشمارید
    مثلا 58 میلی ثانیه.
    در این صورت تایمرتون رو چطور تنظیم می کنید؟
    ( توجه کنید که حداکثر مقداری که با تنظیم مقادیر postscaler-prescaler-period بدست میاد 16384 میکروثانیه است)
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
  4. #4
    2010/02/06
    mazandaran
    71
    1

    پاسخ : تايمر-CCS

    سلام.
    1-منم از روش متغيرهاي عمومي استفاده ميكنم(بالاخره متغير عمومي واسه همين روزاست ديگه :smile

    2-طبق تنظيماتي ك براي تايم2 انجام دادي نميشه58ميلي ثانيه درست كرد ولي با يكم تغيير ميشه
    کد:
    pic18f452-CCS-crystal=16mhz - no PLL
    setup_timer2(T2_DIV_BY_16,249,1);
    ×هر 4us تايمر يك واحد افزايش بيدا ميكنه.
    ×هر 1ms تايمر overflow ميشه.(وقتي تايمر به 250 رسيد اورفلو ميشه)
    ×هر 1ms وقفه تايمر 2 اتفاق مي افته.

    حالا اگه شما تو ISR وقفه تايمر 2, تعداد دفعات وقفه رو بشمري هر 58 تا وقفه ميشه 58 ميلي ثانيه
  5. #5
    2011/01/29
    تهران
    484
    16

    پاسخ : تایمر-CCS

    نقل قول نوشته اصلی توسط ramez
    سلام.
    1-منم از روش متغيرهاي عمومي استفاده ميكنم(بالاخره متغير عمومي واسه همين روزاست ديگه :smile

    2-طبق تنظيماتي ك براي تايم2 انجام دادي نميشه58ميلي ثانيه درست كرد ولي با يكم تغيير ميشه
    کد:
    pic18f452-CCS-crystal=16mhz - no PLL
    setup_timer2(T2_DIV_BY_16,249,1);
    ×هر 4us تايمر يك واحد افزايش بيدا ميكنه.
    ×هر 1ms تايمر overflow ميشه.(وقتي تايمر به 250 رسيد اورفلو ميشه)
    ×هر 1ms وقفه تايمر 2 اتفاق مي افته.

    حالا اگه شما تو ISR وقفه تايمر 2, تعداد دفعات وقفه رو بشمري هر 58 تا وقفه ميشه 58 ميلي ثانيه
    خیلی متشکر
    روشی که شما استفاده کردید روش ضربی بود(یعنی حاصلضرب چند تا وقفه).
    من با این روش دو تا مشکل دارم:
    بازه ی تغییرات زمانی که من از تایمر می خوام زیاده. همون طور که گفتم من از این برنامه دارم برای ساخت برنامه PWM نرم افزاری استفاده می کنم و انتظار دارم که این برنامه بتونه در تمام فرکانس هایی که کاربر می خواد و میکرو قادر به انجام اون هست کار کنه.(الان یه نمونه اولیه + یک اصلاح از این برنامه رو در زیرـانجمن "پروژه های تکمیل شده" گذاشتم-البته با همون روش ناقص خودم".
    برنامه اینجوری هست که بعد از گرفتن فرکانس و زمان وظیفه دلخواه موج رو برای کار بر ایجاد می کنه.(این فرکانس می تونه از 0.1 هرتز تا 10 کیلو هرتز باشه(برای میکرویی با سیکل کاری 0.25 میکروثانیه)
    داشتم اینو می گفتم که این روش دو تا مشکل برای من به وجود میاره:
    1- الگوریتمی که برای پیدا کردن پارامتر ها بوسیله ی این روش استفاده می شه دقیق نیست.( البته الگوریتمی که من درست کردم ، اگه میشه شما الگوریتم خودتون رو بفرمایید ، شاید اون دقیق باشه)
    2- بهینه ترین حالت برای این نرم افزار و در کل هر نرم افزاری استفاده کمتر از برنامه وقفه است . یعنی اینکه میکرو وقت خودش رو کمتر صرف گذراندن در وقفه این برنامه بکنه و بتونه به کارهای دیگه هم برسه. و این مستلزم اینه که تا اونجا که میشه تعداد وقفه ها کم ولی زمان هر وقفه طولانی تر بشه.(مثلا برای ایجاد پالس های 1 ثانیه ای بهتر اینه که فقط 65 بار وقفه اعلام بشه )

    از توجهتون متشکرم
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
  6. #6
    2010/02/06
    mazandaran
    71
    1

    پاسخ : تايمر-CCS

    قطعا درگيري كمتر با وقفه ها بهينه تره.از طرفي چون شما مي خواي pwm بصورت نرم افزاري راه اندازي كني خود بخود با برنامه كاربر تداخل داره يعني شما بايد درصدي از نرم افزارتو به اين كار اختصاص بدي .
    بر اساس تجربه شخصي خودم:pwm نرم افزاري از نظر تايمينگ و خوب در اوردن شكل موج،دشواري هاي زيادي داره مخصوصا براي شما كه تو اين رنج فركانسي كار ميكني.براي مثال دستور ساده (output_high(pin اول مياد pinرو بصورت خروجي در مياره بعد اونو يك ميكنه واين يني دستور بيشتر از يك سيكل طول ميكشه.ولي دركل براي كارهايي كه فركانس انچنان مهم نيست مناسبه.
    اجمالا راهي كه بنظرم ميرسه اينه كه اسمبلي بنويسي ومستقيم با خود رجيسترها كار كني
  7. #7
    2011/01/29
    تهران
    484
    16

    پاسخ : تایمر-CCS

    نقل قول نوشته اصلی توسط ramez
    قطعا درگيري كمتر با وقفه ها بهينه تره.از طرفي چون شما مي خواي pwm بصورت نرم افزاري راه اندازي كني خود بخود با برنامه كاربر تداخل داره يعني شما بايد درصدي از نرم افزارتو به اين كار اختصاص بدي .
    بر اساس تجربه شخصي خودم:pwm نرم افزاري از نظر تايمينگ و خوب در اوردن شكل موج،دشواري هاي زيادي داره مخصوصا براي شما كه تو اين رنج فركانسي كار ميكني.براي مثال دستور ساده (output_high(pin اول مياد pinرو بصورت خروجي در مياره بعد اونو يك ميكنه واين يني دستور بيشتر از يك سيكل طول ميكشه.ولي دركل براي كارهايي كه فركانس انچنان مهم نيست مناسبه.
    اجمالا راهي كه بنظرم ميرسه اينه كه اسمبلي بنويسي ومستقيم با خود رجيسترها كار كني
    متشکر ، الگوریتمی که استفاده می کنید چطور هست ؟
    برای پیدا کردن مشخصات تایمر و تعداد وقفه؟
    مثلا الان تو محاسباتی که کرده بودید 58 میلی ثانیه رو دقیق بدست آورده بودید . آیا میشه الگوریتیمی(ضربی) برای مشخص کردن دقیق زمان داشت؟
    ( من فکر می کردم نمی شه و حتما باید از الگوریتمی مبتنی بر جمع و ضرب همزمان استفاده کرد ، ولی دومین ارسال شما رو که دیدم یاد یه روش جدید افتادم که شاید بتونه هم دقیق باشه و هم از روش ضربی استفاده کنه)
    متشکر
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
  8. #8
    2010/02/06
    mazandaran
    71
    1

    پاسخ : تايمر-CCS

    فر مي كنيم مي خواهيم دو موج pwm با فركانس 20KHZ روي بايه هاي b0, b1 درست كنيم ك در اين صورت دوره تناوب ميشه 50us.سبس تايمر رو طوري تنظيم مي كنيم كه هر 50us يك وقفه ايجاد كنه اينجوري
    كريستال 16MHz
    کد:
    setup_timer_2(T2_DIV_BY_4,49,1);   //50.0 us overflow, 50.0 us interrupt
    تو روتين وقفه اينجوري مينويسيم
    کد:
    #int_TIMER2
    void TIMER2_isr(void) //every 50us
    {
      output_high(pin_b0);
      output_high(pin_b1);
    
    }
    با اين حركت ميكرو هر 50us ميره بايه هاي مورد نظر رو يك ميكنه تا اينجا فركانس 20khz رو درست كرديم حالا بايد ديوتي سايكل رو درست كنيم
    کد:
    void main()
    {
      int8 du_1=25,du_2=10;
      setup_timer_2(T2_DIV_BY_4,49,1);   //50.0 us overflow, 50.0 us interrupt
    
      enable_interrupts(INT_TIMER2);
      enable_interrupts(GLOBAL);
    
      while(TRUE)
      {
       
       if(get_timer2()>du_1)
         output_low(pin_b0);
       if(get_timer2()>du_2)
         output_low(pin_b1);
        
      }
    
    }
    متغير du_1 براي ديوتي سايكل بين bo وdu_2 هم براي بين b1 هست.
  9. #9
    2011/01/29
    تهران
    484
    16

    پاسخ : تایمر-CCS

    متشکرم ، لطف کردید ، البته چیزی که من می خواستم یه کم متفاوت بود(اگر به بخش پروژه های تکمیل شده برنامه ام رو نگاه کنید منظورم رو متوجه میشید)
    ممنون از راهنمایی
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
نمایش نتایج: از 1 به 9 از 9

موضوعات مشابه

  1. پاسخ: 9
    آخرين نوشته: 2016/01/31, 19:16
  2. کنترل یک تایمر با تایمر دیگر!!!
    توسط mjs1990s در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2014/07/22, 23:29
  3. تایمر
    توسط محمدعلی سلام در انجمن مدار هاي ديجيتال
    پاسخ: 1
    آخرين نوشته: 2013/07/27, 19:50
  4. جایگزینی تایمر انالوگ به جای تایمر چشمی حرکتی
    توسط DARTANIAN در انجمن سیستم های کنترلی
    پاسخ: 0
    آخرين نوشته: 2013/04/04, 15:14
  5. توضيح بيشتر در باره "تایمر در تایمر و PWM"
    توسط saghae در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2007/06/21, 21:18

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •