نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

آموزش آرم میکروکنترلر lpc1768 جلسه 10 rit

به نام الله : تو این مطلب از آموزش LPC1768 میخوام آموزش واحد جانبی RIT رو توضیح بدم، و تو مطلب دیگه ای هم پروژه های این واحد جانبی میکروکنترلر آرم مون رو قرار میدم ( آموزش آرم میکروکنترلر lpc1768 جلسه 10 rit )
آموزش آرم میکروکنترلر lpc1768 جلسه 10 rit

آموزش آرم میکروکنترلر lpc1768 جلسه 10 rit


 
مباحث این مطلب :

  1. مشخصات RIT
  2. یکم توضیح و داستان درباره RIT
  3. توضیح رجیسترها
  4. یکم مطلب غیر مربوط به مطلب!!!

 

مشخصات واحد RIT میکروکنترلر lpc1768

  1. وجود یه شمارنده 32 بیتی که برمبنای PCLK شمارش میکنه ( PCLK کلاک واحد جانبی RIT هستش و در هر کلاک یه واحد شمارنده مقدارش زیاد میشه )
  2. وجود یه رجیستر مقایسه 32 بیتی.
  3. وجود یه رجیستر مقایسه mask که 32 بیتی هستش. ( کارش چیه من متوجه نشدم دقیقا ؟ )
  4. وجود یه وقفه که در صورت رخ دادن برابری فعال میشه.
  5. وجود یه تابع وقفه اختصاصی

 

توضیح واحد RIT میکروکنترلر lpc1768

خب این واحد RIT یه جور تایمر هستش که دارای یه رجیستر 32 بیتی شمارنده هستش که از 0 میشموره تا 4294967295، به کمک واحد RIT میتونیم بگیم که مثلا هر 1 ثانیه یه بار تابع وقفت رو اجرا کن، حالا این چه کاربری داره؟ مثلا فک کنید میخواین یه LED رو هر 1 ثانیه 1بار روشن خاموش کنید، خب کد روشن خاموش شدن رو داخل تابع وقفه RIT میزاریم و این تابع وقفه هر 1ثانیه یکبار اجرا میشه و …؛ یا مثلا فک کنید یه ساعت میخواین بسازین، خب هر 1 ثانیه یکار که این تابع وقفه اجرا بشه، متغییر ساعت ما یه واحد زیاد میشه، یا مثلا میخواین مقدار یه سنسور رو هم 15 دقیقه یکبار بخونید، یا هر 15 دقیقه یکبار یه دیتایی به کامپیوتر ارسال کنید، خب این تابع وقفه RIT به کار ما میاد تو این مواقع و خیلی میتونه مفید باشه و ما دیگه مجبور نیستیم از تایمر های 0 تا 3 استفاده کنیم و این تایمرها رو میزاریم برا کارهای واجب تر؛ کلا هر کاری که نیاز دارید در هر زمان مشخصی اجرا بشه یا یه زمانی رو بررسی کنید این امکان میتونه مفید باشه، یا مثلا یه کیپد دارید، میخواید یه عدد 4 رقمی دریافت کنید، خب میاید به کمک این واحد میاید یه عدد  اول دریافت میکنید و بعد اگه در مدت 50 میلی ثانیه عددی دریافت شد که این یعنی ادامه عدد قبلی هستش، و اگه عددی وارد نشد که یعنی عدد ما همینه؛ مثلا یه کاربر عدد 590 رو ارسال میکنه – ما از کجا بدونیم که این 3 تا عدد پشت سر هم برا همدیگه هستن؟ خب میگیم اگه این 3 تا رقم در فاصله زمانی مد نظر از همدیگه وارد شدن، خب یعنی این 3 رقم، یه عدد هستن، مثلا اگه رقم 5 وارد شد و قبل از 300 میلی ثانیه رقم 9 وارد شد که یعنی 9 ادامه عددمون هستش و باز اگه در مدت کمتر از 300 میلی ثانیه رقمی باز وارد شد، یعنی این ادامه عددهای وارد شده قبلی هستش و….، و این زمان و محاسبه و بررسی زمان، به کمک این واحد انجام میگیره.( حالا سعی میکنم این پروژه کیپد با LPC1768 رو بزارم تو سایت، حداقل شده برا بحث آموزشیش )
 

توضیح رجیستر های واحد RIT میکروکنترلر LPC1768

توضیح رجیستر های واحد RIT میکروکنترلر LPC1768
خب این واحد، همش 4 تا رجیستر داره، با RIMASK که اصلا کاری ندارم؛ RICOUNTER همون طور که از اسمش معلومه، یه شمارنده هستش که از 0 میشموره تا مقدار حداکثرش ( چون 32 بیتی هستش لذا میشه 2 به توان 32 که میشه 4294967296 و باید ۱دونخ ازش کم کرد چون شمارش از ۰ شروع میشه)، حالا یه رجیستر دیگه به نام RICOMPVAL داریم که مخفف Compare Value هستش ( و باز کارش از اسمش معلومه ^_^ )، رجیستر RICOUNTER وقتی مقدارش با RICOMPVAL برابر بشه یه سری اتفاقات رخ میده، مثلا وقفه ای رخ میده، شمارنده RICOUNTER مقدارش 0 میشه و … یه رجیستر تنظیمات هم داریم که RICTRL هستش؛ وسلام. ^_^؛ توضیحات بیشتر! در ادامه مطلب…
 

( RI Compare Value register ( RICOMPVAL

( RI Compare Value register ( RICOMPVAL
به این رجیستر مقدار مد نظرمون رو میدیم، مقداری که شمارنده ( RICOUNTER ) وقتی به این مقدار برسه بسته به تنظیماتی که اعمال کردیم یه اتفاقاتی میوفته ^_^ وقفه ای رخ میده، شمارنده مقدارش 0 میشه و …
 

( RI Mask register ( RIMASK

( RI Mask register ( RIMASK
 والا این که چه کاربری داره و چه سودی داره من هنوز متوجه و قانع نشدم ولی اینو میدنم که مقدارش رو تغییر ندید که این واحد RIT درست کار نمیکنه اون وقت، مقدارش در حالت پیشفرض 0 هستش و بزارید همین 0 بمونه و تغییرش ندید. ( کلا کاری به این رجیستر نداریم )
 

( RI Control register ( RICTRL

رجیستر کنترل واحد RIT، کل تنظیمات این واحد جانبی، داخلی این رجیتسر هستش.
( RI Control register ( RICTRL
بیت 0 ( RITINT ) : پرچم وقفه.
1 : برابری رخ داده ( مقدار RICOUNTER با RICOMPVAL برابر شده )
0 : برابری رخ نداده.
توجه 0 : این پرچم داخل تابع وقفه به صورت خودکار پاک نمیشه و باید پاکش کنید دستی ( با یک کردن این بیت، پرچم وقفه پاک میشه )؛ اگه هم از وقفه استفاده نکنید که باز باید مثل رسم همیشگی به صورت دستی پاکش کنید. ( در هر دو حالا باید دستی پاک کنید ^_^ )
 
بیت 1 ( RITENCLR ) : ریست شدن شمارنده در هنگام رخ دادن برابری ( برابر شدن RICOMPVAL با RICOUNTER )
0 : بعد از رخ دادن برابری، مقدار شمارنده 0 نمیشه. ( مقدار پیشفرض همین هستش، یعنی بعد از ریست شدن میکرو، مقدار این بیت 0 میشه به صورت خودکار )
1 : بعد از رخ دادن برابری، مقدار شمارنده 0 میشه.

سوال : حالا این شمارنده 0 بشه یا نشه چه فرقی برا ما میکنه؟
جواب : خب مثلا ببین میخوای یه LED رو هر 1 ثانیه 1 بار روشن خاموش کنی، مثلا میبینی که باید مقدار 100 (مثلا) رو به رجیستر RICOMPVAL بدی، حالا شمارنده از 0 میشموره و وقتی به 100 برسه، 1 ثانیه طول میکشه، و بعد وقفه برابری رخ میده و ما اونجا وضعیت LED رو تغییر میدیم(یعنی اگه روشنه، خاموشش میکنیم و اگه خاموشه، روشنش میکنیم)؛ حالا اصل داستان اینجاس، اگه شمارنده مقدارش 0 نشه چی میهش؟ خب تا 4294967295 ( چون رجیستر 32 بیتی هستش و 2 به توان 32 منهای ۱ میشه همین مقدار ) میشموره و بعد 0 میشه، خب حالا این یعنی چی؟ یعنی این که از 100 تا 4294967295 میشموره و این شاید حدود چند دقیقه ای طول بکشه در حالی که ما میخوایم هر 1ثانیه یکبار LED رو روشن خاموش کنیم؛ با این کار بعد از رخ دادن برابری حتما باید رجیستر شمارنده مقدارش 0 بشه ( یعنی وقتی مقدار شمارنده با RICOMPVAL برابر شد باید مقدار 0 بشه )، تا دوباره شمارنده از 0 شروع کنه به شمارش و به 100 برسه ( که این میشه 1 ثانیه ) و باز 0 بشه و شروع کنه به شمارش و به 100 برسه و ....؛ حالا اگه این 0 شدن خودکار رو غیر فعال کنیم این اتفاق رخ میده : شمارنده از 0 تا 100 میشموره، وقفه برابری رخ میده، مثلا LED روشن میشه و بعد شمارنده تا 4294967295 میشموره و در این مدت LED هنوز روشنه و این وضعیت ممکنه 15 دقیقه طول بکشه، و بعد شمارنده وقتی به 4294967295 رسید، مقدارش 0 میشه و بعد تا 100 میشموره و بعد وقفه برابری رخ میده و بعد led خاموش میشه و بعد...، میبینید، 1 ثانیه LED روشن(یا خاموش) میشه و 15 دقیقه خاموش ( یا روشن) و اون چیزی که ما میخواستیم رخ نمیده ( 1ثانیه خاموش 1ثانیه روشن )
میبینی، این بحث 0 شدن شمارنده بعد از رخ دادن برابری چقدر مهمه.
 
بیت 2 ( RITENBR ) : فعال کردن تایمر برا بحث debug ( مقدار پیشفرض این بیت، 1 هستش )
1 : تایمر متوقف میشه وقتی processor برای عملیات debugging متوقف شده.
0 : Debug تاثیری روی عملیات تایمر ندارد.
توجه : فعلا این مورد زیاد مهم نیست، فقط اینو بگم که اگه این بیت 0 باشه، وقتی پروژه رو در مد Debug میبرید، وقتی خط به خط پروژه رو اجرا میکنید، شمارنده تایمر ( RICOUNTER ) هم مقدارش آروم آروم زیاد میشه، یعنی فقط زمانی که شما روی دکمه “اجرای کد در خط بعد” رو میزنید و کد موجود در خط بعدی اجرا میشه، اون وقت مقدار شمارنده زیاد میشه ولاغیر، ولی اگه این بیت 1 باشه، مد اشکال زدایی ( Debug ) کاری به شمارنده تایمر نداره، و وقتی میکرو متوقف هستش، شمارنده مقدارش زیاد میشه برا خودش ( خب میدونم کسی چیزی نفهمید ^_^، مشکلی نیست، فعلا فقط یه چیزی در مورد این رجیستر ها بدونید، در مطلب پروژه های این واحد جانبی، یه چند تا پروژه و یه فیلم از همین بیت من بگیرم و بزارم تو سایت، کامل یاد میگیرید، فعلا روزنامه وار این رجیسترها رو بخونید، چون حتی اگه کارشون رو هم بفهمید، 2 روز بعد فراموششون میکنید ^_^، چون رجیستر و بیت و … زیاد هستش و نمیشه حفظشون کرد، فقط روزنامه وار و مفهومی ^_^ )
 
بیت 3 ( RITEN ) : فعال/غیر فعال کردن شمارنده
1 : فعال کردن شمارنده. ( رجیستر RICOUNTER شروع به شمارش میکنه و مقدارش زیاد میشه )
0 : غیر فعال کردن شمارنده. ( با غیر فعال شدن شمارنده، مقدار رجیستر RICOUNTER دیگه زیاد نمیشه و متوقف میشه )
توجه مهم : به طور پیشفرض مقدار این بیت 1 هستش ( وقتی میکرو ریست بشه این بیت 1 میشه )؛ لذا بعد از فعال کردن power این واحد ( RIT )، شمارنده شروع به شمارش میکنه و اگه این بیت رو هم 1 نکردید در هنگام پیکربندی RIT موردی نداره چون همون طور که گفتم در ابتدا و بعد از روشن شدن میکرو، این بیت به صورت پیشفرض مقدارش 1 هستش.
 
بیت 4 تا 31 : رزرو شده.
 

( RI Counter register ( RICOUNTER

شمارنده ما، وقتی واحد RIT فعال بشه شروع به شمارش میکنه و وقتی با RICOMPVAL برابر بشه میتونه وقفه رخ بده و مقدارش 0 بشه.
( RI Counter register ( RICOUNTER
 

بلوک دیاگرام واحد RIT میکروکنترلر LPC1768

RI timer block diagram
 

 
قهرمان واقعی ایران : درود خدا بر سردار قاسم سلیمانی و سلیمانی هایی که شهید شدن و سلیمانی هایی که الان دارن آموزش میبین و منتظر شهادت هستن، یکی در سوریه و در حال جهاد و یکی هم در حال راه رفتن با شیاطین و کسانی که دستشون به خون هزاران بیگناه آلوده هستش.
سردار قاسم سلیمانی
 
معنای بصیرت : طلحه و زبیر هم یادتون نره، بزرگتر و والا مقام تر از این دو، الان سراغ دارید؟ این دو چی بودن و چی شدن، لذا هی نگید فلانی آدم بزرگی بوده و در زمان فلان، این همه کار کرده و از این جور حرفا…؛ بیایم به چیزی، الکی متعصب نباشیم.
معنای بصیرت
 
خب این مطلب هم تموم شد، پروژه ها هم بمونه برا یه مطلب دیگه، فعلا یا علی.

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ السارِچین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
5

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    کاظم قربانی خواجکینی

    این تابعی هستش که توسطش میتونید تاخیر هایی از چند نانو ثانیه تا ماکزیمم
    1/100e6*(2^32-1)
    ثانیه رو داشته باشید حدود 42 ثانیه
    1E-8 × 2^32 – 1 = 41.94967296
    با فرض اینکه کلاک سیستم تون 100 مگاهرتز هستش
    //===========================================================================
    void delay_cclk(const unsigned int DELAY_VALUE)
    {
    //===========================================================================
    // LPC_SC->PCONP |= (1<PCLKSEL0 |= (1<MR0 = DELAY_VALUE;
    // LPC_TIM0->IR |= (1<TC=0x00;
    // // LPC_TIM0->MCR = (1<TCR = (1<TCR = (1<IR & (1<IR |= (1<PCONP->(1<PCLKSEL1 &= ~(3L <PCLKSEL1 |= (1L <RICOUNTER = 0x00;
    LPC_RIT->RIMASK = 0x00;
    LPC_RIT->RICOMPVAL = DELAY_VALUE;
    LPC_RIT->RICTRL = (1<<0)|(1<<2)|(1<RICTRL & (1<RICTRL |= (1<<0);//RITINT Interrupt flag
    return;
    }

  2. Avatar

    مهمان

    kazem

    سلام
    بابت مطلبی که گذاشتید ممنون
    در مورد رجیستر ماسک همونطور که تو بلاک دیاگرام مشخص هستش متصل شده به گیت OR سی و دوبیتی
    به این معنی که اگه هر بیتی رو شما توی این رجیستر یک کنید دیگه این بیت تو مقایسه کننده همیشه صحیح هستس و مقایسه کننده مبناش رو روی بقیه بیت ها میذاره
    مثلا فرض کنیم این شکلی نوشتیمش :
    LPC_RIMASK-> |= ~(1<<8);//–then
    اونوقت بدون اینکه شمارنده میکرو رو ریست کنی به ازای هر 256 کلاک ساعت یک بار مقدار مقایسه کننده و کانتر یک میشه و روتین وقفه اجرا میشه
    چه خوب میشد یکسری مثال رو هم واسه بچه ها میذاشتید
    موفق باشید

  3. Avatar

    مهمان

    علی

    سلام مهدی جان!
    میگم که اولا ممنون از مطلب خوبتون!
    دوما:
    من خودم خیلی انقلابی و اسلامی ام smile ولی یه نکته به نظرم رسید! گفتم بگم شاید به دردت بخوره!
    ببین این عکسی که آخر مطلب گزاشتی، درسته. اما ببین این آقای ظریف هم که گناهی نداره که اینجوری نوشتی! ایشون قصدشون خیر بود! رهبر هم که خودشون اینو گفتن! آقای ظریف فقط یک واسطه بود که مذاکره کنه و شایدم الان خودشون از کارشون زیاد راضی نباشن
    در کل به نظرم اینکه این عکس شایسته سایت انقلابی شما نیست چون باعث میشه اونایی هم که کمی انقلابی هستن و دچار شک هستند رو اینجوری از دست بدیم!
    بازم نمیدونم چی بگم!
    ببخشید
    موفق باشید
    یا علی مدد…!

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      من از نیت افراد خبر ندارم و حرفی هم در این باره نزدم.
      اگه آقای ظریف و دولت آقای روحانی کلا، رو مردم تکیه میکردن الان دولت خیلی موفق میشد، به جاش رفتن با آمریکا 3 سال مذاکره کردن و الان آمریکا بامبول در ابرده و ایران رو زرت و زرت به هر بهانه ای تحریم میکنه – رهبر هم اون موقع گفت ولی آقایون گوش نکرن – خب این کار درست نیست – دولت باید به ملت اتکا کنه ——— به قول امام آمریکا شیطان بزرگه.

      • Avatar

        مهمان

        fer

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