به نام خدا : تو این جلسه از آموزش آرم ( آموزش LPC1768 ) میخوام به آموزش RTC بپردازم، این RTC یه جور ساعت و تاریخ هستش که آلارم داره، کالیبراسیون و … اینو فقط بگم بهتون که چیز خفنی هستش ^_^؛ عرضم به ظهورتون که RTC مخفف عبارت Real Time Clock هستش!؛ تو این مطلب غیر از RTC یه کوچولو ( در حد خود دیتاشیت ) درباره backup registers هم صحبت میکنیم – ( آموزش آرم میکروکنترلر lpc1768 جلسه ۱۲ rtc ) -؛ آخرین مطلب آموزش آرم که من گزاشتم حدود ۱ ماه پیش هستش که دلیل هم داره، دلیلش اینه که من درگیر مطلب آموزش I2C شدم و هنوز که هنوزه تموم نشده و تا الان حدود ۱۲ هزار واژه شده و احتمالا با پروژه ها سر جمع بشه ۲۰ هزار واژه – که هر مطلب رو من ۲ هزار واژه در نظر بگیرم میشه ۱۰ تا مطلب!!! متاسفانه در زمینه ترجمه دیتاشیت هم کسی نیست کمک کنه، لذا مجبورم خودم تکی بشینم و ترجمه کنم، ولی خب باز خدا رو شکر دوستانی همون آقای “محمد رضا سربندی” هستن که اگه سوالی برام پیش بیاد جواب میدن و از هیچ کمکی دریغ نمیکنن، شما هم فقط خواننده مطلب نباشید، در این مورد کمک کنید اگه تواناییشو دارید ^_^
آموزش آرم میکروکنترلر lpc1768 جلسه ۱۲ rtc
کمبودهای این مطلب :
۱) کالیبراسیون
۲) ریست CTC
۳) سال کبیسه
توجه : بعضی قسمت های مطلب صورتی رنگه، تو این موارد برا بحث ترجمه اگه متوجه شدید، بگید تا جایگزین کنم، پیشاپیش ممنون از لطف شما دوستان.
پیکربندی ابتدایی RTC میکرو کنترلر LPC1768
- Power : در رجیستر PCONP، بیت PCRTC رو فعال میکنیم.
توجه : بعد از Reset، واحد RTC فعال میشه. - Clock : واحد RTC از کلاک ۱Hz که توسط اسیلاتور RTC تامین میشه به عنوان منبع کلاک استفاده میکنه.
The peripheral clock rate for accessing registers is CCLK/8 - Interrupts : در ادامه مطلب عنوان "وقفه های RTC" رو بخونید؛ وقفه RTC میتونه دستگاه رو از مدهای deep-sleep یا power-down یا deep power-down بیدار کنه.
خصوصیات RTC میکرو کنترلر LPC1768
- ارائه دادن ثانیه، دقیقه، ساعت، روز از ماه، ماه، سال، روز از سال، هفته، روز از هفته
- توان مصرفی فوق العاده کم که در حالت استفاده از باتری بکاب جریان مصرفی کمتر از ۱uA هستش.
- قابلیت تامین کلاک از یه اسیلاتور ۳۲KHz
- قابلیت تامین توان مصرفی از یه باتری بکاب
- ایزوله بودن منبع تغذیه RTC از سایر قسمت های میکرو، لذا Reset شدن میکرو باعث ریست شدن رجیسترهای اصلی این واحد نمیشه.
- وجود وقفه Alarm که میتونه در زمان/تاریخ مشخصی تولید بشه.
- وجود وقفه های متفاوب که میتونه تولید بشه بر اساس افزایش هر کدوم از رجیستر های زمان.
• Measures the passage of time to maintain a calendar and clock.
• ۲۰ bytes of Battery-backed storage and RTC operation when power is removed from the CPU.
• Calibration counter allows adjustment to better than ±۱ sec/day with 1 sec resolution.
توضیح واحد جانبی RTC
ساعت بلادرنگ ( RTC ) یه دسته شمارنده برای محاسبه زمان هستش وقتی که power فعال هستش، و به صورت اختیاری وقتی که power قطع هستش؛ این واحد توان خیلی کمی مصرف میکنه وقتی رجیسترهاش در دسترس CPU نیستن، مخصوصا در مد کاهش توان؛ در میکروکنترلر LPC176x/5x، واحد RTC کلاکش توسط به اسیلاتر ۳۲KHz مجزا تامین میشه که زمان ۱ ثانیه ( کلاک ۱هرتز رو برای واحد RTC تامین میکنه )؛ واحد RTC پایه ای برای تامین توان مصرفیش با نام VBAT داره که میتونه به یه باتری بکاب ۳ولت وصل بشه یا وصل نشه! و معلق ولش کنید ( یعنی این که به جایی وصلش نکنید ) >>>> لذا دو تا پایه برا اتصال کریستال خارجی ( اختیاری ) و یه پایه برا اتصال باتری بکاب ( اختیاری ) برا این واحد ما داریم.
معماری RTC
توضیح پایه های RTC
RTCX1 و RTCX2 : پایه های مربوط به اتصال کریستال خارجی ۳۲KHz
Vbat : پایه مربوط به اتصال باتری بکاب ۳ ولت
توجه : استفاده ا این پایه ها اختیاری هستش، در حالت پیشفرض این واحد جانبی بدون نیاز به هیچ پایه ای میتونه کار کنه.
نکاتی در باب استفاده از RTC
- استفاده از باتری بکاب و اتصالش به پایه Vbat اختیاری هستش.
- اگه هر دو منبع تغذیه RTC ( باتری بکاب و تغذیه داخلی ) قطع شود، مقدار رجیسترهای RTC هم پاک میشه.
- شمارنده های RTC متوقف میشن یا مقدارشون غیر قابل پیش بینی میشه اگه هر دو "منبع کلاک" گم یشه یا هر مشکل دیگه ای براش رخ بده ( سعی کنید همیشه از اسلاتور ۳۲Khz استفاده کنید تا اگه برا اسیلاتور داخلی مشکلی رخ داد به صورت خودکار رو اسیلاتور خارجی سوییچ کنه میکرو )
- گزاشتن اسیلاتور ۳۲KHz اجباری نیست و نیاز به تنظیم خاصی نداره، چون با گزاشتنش میکرو به صورت خودکار سوییچ میکنه رو اسلاتور خارجی و اگه اسیلاتور خارجی مشکلی براش رخ بده یه وقفه میتونه رخ بده ( رجیستر RTC_AUXEN رو مطالعه کنید از همین مطلب ) و به صورت خودکار سوییچ میکنه رو منبع کلاک داخلی.
- در ته این مطلب یا در مطلب بعدی کتابخونه کار با این واحد رو قرار میدم براتون، بعد از این که یه بار کد تنظیم ساعت رو در اول پروژه گزاشتین، بعدش اون کد رو حذف کنید و دوباره برنامه رو پروگرام کنید رو میکرو، به این دلیل که با ریست شدن میکرو، ساعت به حالت اولیه بر نگرده، گفتم بگم تا یه وقت نرید از این جور سوتی ها بدید ^_^
معرفی مختصر تمام رجیسترهای واحد RTC
واحد RTC دارای یه چند تا دونه ^_^ رجیستر هستش که در جدول زیر مشاهده میکنید؛ در جدول زیر، در قسمت مربوط به "مقدار Reset" برا بعضی رجیسترها نوشته "NC" که یعنی این که این رجیستر با ریست شدن میکرو، مقدارش تغییر نمیکنه؛ رجیسترهای واحد RTC بر اساس عملکردشون به ۵ قسمت تقسیم شدن که در جدول زیر مشاهده میکنید این موضوع رو.
رجیسترهای متفرقه
ILR : رجیستر موضعیت وقفه
CCR : رجیستر کنترل Clock
CIIR : رجیستر وقفه افزایش شمارنده
AMR : رجیستر نقاب گزاری Alarm
RTC_AUX : رجیستر کنترل اضطراری RTC
RTC_AUXEN : رجیستر فعال سازی اضطراری RTC
رجیسترهای یکپارچه زمان
CTIME0 : رجیستر یکپارچه زمان ۰
CTIME1 : رجیستر یکپارچه زمان ۱
CTIME2 : رجیستر یکپارچه زمان ۲
رجیسترهای شمارنده زمان
SEC : شمارنده ثانیه
MIN : شمارنده دقیقه
HOUR : شمارنده ساعت
DOM : روز ماه ( یعنی این که امروز چندم برج هستش ! )
DOW : روز هفته ( یعنی این که امروز چند شنبس! )
DOY : روز سال ( یعنی این که روز چندم از ۳۶۵ روز هستیم)
MONTH : رجیستر ماه
YEAR : رجیستر سال
CALIBRATION : رجیستر کالیبره کردن مقدار
رجیسترهای همه کاره !
GPREG0 : رجیستر همه کاره ۰
GPREG1 : رجیستر همه کاره ۱
GPREG2 : رجیستر همه کاره ۲
GPREG3 : رجیستر همه کاره ۳
رجیسترهای گروه Alarm
ALSEC : مقدار ثانیه Alarm
ALMIN : مقدار دقیقه Alarm
ALHOUR : مقدار ساعت Alarm
ALDOM : مقدار روز از ماه ( روز چندم ماه ) Alarm
ALDOW : مقدار روز از هفته ( روز چندم هفته ) Alarm
ALDOY : مقدار روز از سال ( روز چندم سال ) Alarm
ALMON : مقدار ماه Alarm
ALYEAR : مقدار سال Alarm
وقفه های RTC
تولید وقفه کنترل میشه از طریق "رجیستر مکان وقفه ( ILR )، رجیستر وقفه افزایش شمارنده ( CIIR )، رجیسترهای آلارم و رجیستر نقاب گزاری آلارم ( AMR )"؛ ILR به صورت جداگانه وقفه های AMR و CIIR رو فعال میکنه؛ هر بیت در CIIR متانظر هستش با یکی از شمارنده های زمان؛ اگه CIIR فعال بشه برا یه شمارنده خاص، سپس بعد از هر افزایش شمارنده مد نظر، یه وقفه تولید میشه ( چیزی که من فهمیدم یعنی مثلا بعد هر ثانیه ۱ وقفه تولید بشه یا در هر دقیقه یا در هر ساعت یا روز یا ماه یا سال )؛ رجیسترهای آلارم این اجازه رو به کاربر میدن که یه زمان و تاریخی تعیین کنه تا در اون زمان و تاریخ یه وقفه تولید بشه؛ اگه رجیسترهای ماسک گزاری نشده آلارم با شمارنده زمان برابر بشه یه وقفه تولید میشه.
وقفه RTC میتونه میکروکنترلر رو از مد Power-down خارج کنه وقتی که RTC از اسیلاتور متصل به پایه های RTCX1:2 تغذیه میشه.
رجیستر موقعیت وقفه ( ILR - 0x4002 4000 )
نحوه استفاده از این رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 |
LPC_RTC->ILR |
این رجیستر ۲ بیت داره ( بقیه بیت ها غیر فعال هستن ) که میتونه تعیین کنه که کدوم یک از بلوک های RTC میتونه وقفه تولید کنه.
نحوه مقدار دهی این رجیستر :
۰ : تاثیری ندارد.
۱ : وقفه مربوطه رو غیر فعال میکنه.
بیت ۰ ( RTCCIF ) : وقتی ۱ بشه یعنی وقفه "افزایش شمارنده" رخ داده، با نوشتن ۱ در این بیت، میتونیم مقدارشو پاک کنیم. ( میشه گفت پرچم این وقفه هستش )
بیت ۱ ( RTCALF ) : وقتی ۱ بشه یعنی وقفه "آلارم" رخ داده، با نوشتن ۱ در این بیت، میتونیم مقدارش رو پاک کنیم. ( میشه گفت پرچم این وقفه هستش )
بیت ۲ تا ۳۱ : رزرو شده.
رجیستر کنترل کلاک ( CCR - 0x4002 4008 )
نحوه استفاده از این رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 |
LPC_RTC->CCR |
این رجیستر شامل ۴ بیت هستش که کنترل میکنه عملیات مرتبط با کلاک رو؛ در این رجیستر تمام بیت هایی که NC هستن باید مقدار دهی بشن وقتی که RTC روشن شد.
بیت ۰ ( CLKEN ) : فعال کردن کلاک.
۱ : فعال کردن شمارنده زمان.
۰ : غیر فعال کردن شمارنده زمان.
بیت ۱ ( CTCRST ) : ریست کردن CTC
۱ :
When one, the elements in the internal oscillator divider are reset, and remain reset until CCR[1] is changed to zero.
This is the divider that generates the 1 Hz clock from the 32.768 kHz crystal.
The state of the divider is not visible to software.
۰ : تاثیری ندارد.
بیت ۲ و ۳ ( - ) : کنترل مد تست داخلی؛ این بیت باید ۰ شود برا عملیات RTC عادی. ( کاربرد این دو بیت؟ )
بیت ۴ ( CCALEN ) : فعال کردن کالیبراسیون شمارنده.
۱ : کالیبراسیون شمارنده غیر فعال هستش و مقدارش ۰ هستش.
۰ : کالیبراسیون شمارنده فعال هستش و شمارش میکنه با استفاده از کلاک ۱Hz؛ وقتی که کالیبراسیون شمارنده برابر مقدار رجیستر CALIBRATION میشه، شمارنده Reset میشه و دوباره شروع به شمارش میکنه تا به مقدار رجیستر CALIBRATION برسه.
بیت ۵ تا ۳۱ : رزرو شده.
رجیستر امکانات کمکی کنترل ( RTC_AUX - 0x4002 405C )
نحوه استفاده از این رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 |
LPC_RTC->RTC_AUX |
این رجیستر شامل یه سری پرچم وقفه اضافه هستش که جزئی از واحد RTC نیستن و برای شناسایی شکست در اسیلاتور RTC هستند.
بیت ۰ تا ۳ و ۵ تا ۳۱ : رزرو شده.
بیت ۴ ( RTC_OSCF ) : پرچم تشخیص شکست در اسیلاتور RTC
نوشتن در این بیت : نوشتن ۱ در این بیت، مقدار این پرچم رو پاک میکنه.
خوندن این بیت : این بیت فعال میشه اگه اسیلاتور RTC متوقف بشه و یا وقتی که در ابتدا برق مصرفی RTC وصل میشه؛ وقتی این بیت ۱ بشه، یه وقفه رخ میده.
توجه : برا فعال کردن این پرچم باید بیت RTC_OSCFEN از رجیستر RTC_AUXEN رو یک کنیم و همچین وقفه RTC رو از طریق NVIC فعال کنیم.
توجه ۲ : با توجه به این که در این واحد ( RTC ) ما سه تا وقفه داریم، لذا در تابع وقفه باید بیایم و بررسی کنیم که منبع و علت رخ دادن وقفه چی بوده، که به کمک این بیت در داخل تابع وقفه میتونیم بفهمیم که منبع رخ دادن وقفه این قسمت بوده یا نه.
رجیستر فعالساز امکانات کمکی ( RTC_AUXEN - 0x4002 4058 )
نحوه استفاده از این رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 |
LPC_RTC->RTC_AUXEN |
این رجیستر تعیین میکنه که وقفه کمکی "عدم شناسایی اسیلاتور RTC" فعال باشه و تولید وقفه کنه یا نه.
بیت ۰ تا ۳ و ۵ تا ۳۱ : رزرو شده.
بیت ۴ ( RTC_OSCFEN ) : فعال ساز وقفه تشخیص شکست اسیلاتور.
۰ : غیر فعال کردن این وقفه.
۱ : فعال کردن این وقفه.
رجیسترهای یکپارچه زمان CTIME0:2
نحوه فراخوانی این ۳ تا رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 2 3 |
LPC_RTC->CTIME0 LPC_RTC->CTIME1 LPC_RTC->CTIME2 |
مقدار شمارنده های زمان میتونه به صورت اختیاری خونده بشه از یه فرمت یکپارچه که این اجازه رو به برنامه نویس میده که بخونه مقدار شمارنده های زمان رو به صورت یکجا تنها به کمک ۳ رجیستر یکپارچه زمان؛ اطلاعات از بیت های ۰، ۸، ۱۶ و ۲۴ شروع میشن ( ادامه مطلب و ۳ جدول مربوط به CTIME0:2 رو یکبار ببینید متوجه این حرف من میشید - هر چند که گفتن آنچه عیان هستش چه حاجت به بیانه ولی خب دیتاشیت گفته بود، ما هم گفتیم ^_^ )؛ این ۳ تا رجیستر فقط خوندنی هستن؛ برا تغییر مقدار شمارنده های زمان باید از "رجیسترهای گروه شمارنده زمان و تاریخ" استفاده کرد.
توجه : این که استفاده از این ۳ تا رجیستر چه مزیتی داره نسبت به "رجیسترهای گروه شمارنده زمان و تاریخ" خودم هنوز متوجه نشدم - از نظر سرعت خوبه - از نظر این که کل اطلاعات در ۳ تا رجیستر قرار داره به صورت فشرده - نمیدونم مزیت اصلیش چیه ولی میدونم که استفاده ازش اجباری نیست ^_^؛ کسی اگه مزیت اصلی استفاده از این رجیسترها رو میدونه بگه.
رجیستر زمان یکپارچه ۰ ( CTIME0 - 0x4002 4014 )
این رجیستر حاوی "ثانیه، دقیقه، ساعت و روز از هفته" میباشد :
رجیستر زمان یکپارچه ۱ ( CTIME1 - ۰x4002 4018 )
این رجیستر حاوی "روز از ماه، ماه و سال" هستش.
رجیستر زمان یکپارچه ۲ ( CTIME2 - ۰x4002 401C )
این رجیستر فقط حاوی "روز از سال" هستش :
رجیسترهای گروه شمارنده زمان و تاریخ
جدول زیر اندازه ( تعداد بیت ) هر کدوم از شمارنده های زمان/تاریخ رو نشون میده؛ حداقل و حداکثر مقدار برا هر کدوم از شمارنده ها رو مشاهده میکنید، و در ستون ۳ام هم میبینید که در چه واحدی شمارنده مربوطه افزایش پیدا میکنه، مثلا دقیقه بر مبنای مقدار ثانیه مقدارش زیاد میشه، ساعت بر مبنای دقیقه، روز بر مبنای ساعت، ماه بر مبنای روز و ...
در جدول زیر لیست رجیسترهای شمارنده زمان/تاریخ رو مشاهده میکنید :
توجه : همون طور که مشاهده میکنید، تمام رجیسترهای زیر دسترسیون R/W هستش ( یعنی هم میتونی بخونیش و هم مقدارشو تغییر بدی )
SEC ( اندازه : ۶ بیت ) : مقدار ثانیه بین ۰ تا ۵۹ هستش.
MIN ( اندازه : ۶ بیت ) : مقدار دقیقه بین ۰ تا ۵۹ هستش.
HOUR ( اندازه : ۵ بیت ) : مقدار ساعت بین ۰ تا ۲۳ هستش.
DOM ( اندازه : ۵ بیت ) : مقدار روز از ماه میتونه ۲۸، ۲۹، ۳۰ و یا ۳۱ روز باشه ( که به ماه و این که اون سال کبیسه هستش یا نه، بستگی داره )
DOW ( اندازه : ۳ بیت ) : مقدار روز از هفته بین ۰ تا ۶ هستش.
DOY ( اندازه : ۹ بیت ) : مقدار روز از سال بین ۰ تا ۳۶۵ هستش ( بجز سال کبیسه که بیت ۰ تا ۳۶۶ هستش )
MONTH ( اندازه : ۴ بیت ) : مقدار ماه که بین ۱ تا ۱۲ هستش.
YEAR ( اندازه : ۱۲ بیت ) : مقدار سال که بیت ۰ تا ۴۰۹۵ هستش.
نحوه استفاده از این رجیستر ها در کامپایلر KEIL به صورت زیر هستش :
1 2 3 4 5 6 7 8 |
LPC_RTC->SEC LPC_RTC->MIN LPC_RTC->HOUR LPC_RTC->DOM LPC_RTC->DOW LPC_RTC->DOY LPC_RTC->MONTH LPC_RTC->YEAR |
رجیستر وقفه افزایش شمارنده ( CIIR - 0x4002 400C )
نحوه استفاده از این رجیستر در کامپایار Keil به صورت زیر هستش :
1 |
LPC_RTC->CIIR |
به کمک این رجیستر میتونید تعیین کنیم که یه وقفه تولید بشه وقتی شمارنده زمان/تاریخ مد نظرمون یه واحد زیاد شد؛ این وقفه به صورت صحیح باقی میمونه تا زمانی که با نوشتن مقدار ۱ در بیت ۰ از رجیستر ILR این وقفه رو پاک کنیم.
نکته : برا غیر فعال کردن این وقفه، کافیه که تمام بیت های این رجیستر رو ۰ کنیم.
بیت ۰ ( IMSEC ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده ثانیه، یه وقفه تولید میکنه.
بیت ۱ ( IMMIN ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده دقیقه، یه وقفه تولید میکنه.
بیت ۲ ( IMHOUR ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده ساعت، یه وقفه تولید میکنه.
بیت ۳ ( IMDOM ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده روز از ماه، یه وقفه تولید میکنه.
بیت ۴ ( IMDOW ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده روز از هفته، یه وقفه تولید میکنه.
بیت ۵ ( IMDOY ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده روز از سال، یه وقفه تولید میکنه.
بیت ۶ ( IMMON ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده ماه، یه وقفه تولید میکنه.
بیت ۷ ( IMYEAR ) : وقتی این بیت ۱ بشه، هر افزایش شمارنده سال، یه وقفه تولید میکنه.
بیت ۸ تا ۳۱ : رزرو شده.
محاسبات سال کبیسه
سال کبیسه کی رخ میدهد : در تقویمهای خورشیدی تقریباً هر چهار سال و در تقویمهای قمری تقریباً هر سه سال یک روز کبیسه وجود دارد.
The RTC does a simple bit comparison to see if the two lowest order bits of the year counter are zero.
If true, then the RTC considers that year a leap year.
The RTC considers all years evenly divisible by 4 as leap years.
This algorithm is accurate from the year 1901 through the year 2099, but fails for the year 2100, which is not a leap year.
The only effect of leap year on the RTC is to alter the length of the month of February for the month, day of month, and year counters.
رجیستر کالیبراسیون ( CALIBRATION - 0x4002 4040 )
رجیستر زیر برا کالیبره کردن شماردنه زمان مورد استفاده قرار میگیره :
بیت ۰ تا ۱۶ ( CALVAL ) : اگر این بیت فعال بشه، شمارنده کالیبراسیون از این مقدار شروع به شمارش میکنه؛ حداکثر مقدار ۱۳۱ هستش، اگه این بیت ۰ بشه، کالیبراسیون غیر فعال میشه.
بیت ۱۷ ( CALDIR ) : جهت کالیبراسیون. ( متوجه نشدم کار دقیقش رو )
۱ : کالیبراسیون معکوس؛ وقتی مقدار CALVAL با شمارنده کالیبراسیون برابر بشه، تایمر RTC عمل افزایش دادن رو برای ۱ ثانیه متوقف میکنه.
۰ : کالیبراسیون مستقیم؛ قتی مقدار CALVAL با شمارنده کالیبراسیون برابر بشه، تایمر RTC دو ثانیه پرش میکنه.
بیت ۱۸ تا ۳۱ : رزرو شده ( جدول بالا این ترتیب بیت ها رو اشتب نوشته )
روند ( طریقه، روش ) کالیبراسیون
منطق کالیبراسیون به این صورت هستش که به صورت دوره ای تنظیم میکنه شمارنده زمان رو به وسیله عدم افزایش شمارنده، یا افزایش ۲ تا یکی شمارنده ( یعنی مثلا سرعتش رو کم میکنه تا به جای این که ۲ واحد مقدار شمارنده زیاد بشه، ۱ واحد زیاد میشه )؛
This allows calibrating the RTC oscillator under some typical voltage and temperature conditions without the need to externally trim the RTC oscillator
A recommended method for determining the calibration value is to use the CLKOUT feature to unintrusively observe the RTC oscillator frequency under the conditions it is to be trimmed for, and calculating the number of clocks that will be seen before the time is off by one second.
That value is used to determine CALVAL.
If the RTC oscillator is trimmed externally, the same method of unintrusively observing the RTC oscillator frequency may be helpful in that process.
کالیبراسیون معکوس : فعال کنید تایمر و کالیبراسیون RTC در رجیستر CCR رو ( بیت CLKEN = 1 و CCALEN = 0 کنید )؛ در رجیستر کالیبراسیون ( CALIBRATION )، مقدار کالیبراسیون باید CALVAL ≥ ۱ و انتخاب کنید CALDIR = 1 :
- تایمر SEC و شمارنده کالیبراسیون در هر ۱Hz شمارش میکنن.
- وقتی شمارنده کالیبراسیون میرسه به مقدار ذخیره شده در بیت های CALVAL، یه برابری کالیبراسون رخ میده و تمام تایمر های RTC متوقف خواهند شد برای یک چرخه ساعت ( clock cycle، یک هرتز، یک ثانیه ) بنابراین تایمرها افزایش پیدا نخواهند کرد در کلاک بعدی.
- اگه یه برابری آلارم رخ بده در کلاک مشابه برابری کالیبراسیون، وقفه آلارم یه تاخیر میخوره به اندازه یک کلاک برای جلوگیری از جلوگیری از رخ دادن ۲ بار وقفه آلارم.
کالیبراسیون مستقیم : فعال کنید تایمر و کالیبراسیون RTC رو در رجیستر CCR ( بیت CLKEN = 1 و CCALEN = 0 تنظیم کنید )؛ در رجیستر کالیبراسیون ( CALIBRATION )، مقدار کالیبراسیون باید CALVAL ≥ ۱ و انتخاب کنید کنید CALDIR = 0 :
- تایمر SEC و شمارنده کالیبراسیون در هر ۱Hz شمارش میکنن.
- وقتی شمارنده کالیبراسیون میرسه به مقدار ذخیره شده در CALVAL، یه برابری کالیبراسیون رخ میده و تایمر RTC به اندازه ۲ واحد افزایش پیدا میکنه.
- وقتی رخداد کالیبراسیون رخ میده، بیت کم ارزش رجیستر ALSEC به اجبار ۱ میشه لذا وقفه آلارم از دست نمیره وقتی از یک ثانیه صرف نظر میکنیم ( یعنی فرض کنید آلارم رو رو زمان ساعت ۱۲ و ۶ دقیقه ۸ ثانیه تنظیم کردیم، بعد سر ثانیه ۷ برابری کالیبراسیون رخ میده و تایمر RTC از ۷ میپره رو ۹ لذا در حالت عادی نباید دیگه وقفه آلارم رخ بده، ولی یه ویژگی خوب که این واحد RTC داره اینه که میره و یه ثانیه به زمان آلارم اضافه میکنه و زمان آلارم ثانیه اش میشه ۹ ثانیه، لذا وقفه تایمر RTC بعد از برابری کالیبراسون به جای ۱ واحد، ۲ واحد زیاد میشه و میشه ۹، اون وقت وقفه آلارم هم از دست نمیره و رخ میده؛ چیزی که من فهمیدم این بود، البته یه سری شبهات و سوالات هم تو ذهن خودم در این باب ایجاد شده که به شما انتقال نمیدم، چون قاطی میکنید و اون وقت بیا درستش کن ^_^)
نتیجه گیری : پس در کالیبراسیون معکوس تایمر RTC یک ثانیه متوقف میشه و در کالیبراسیون مستقیم، تایمر RTC به جای ۱ واحد، ۲ واحد زیاد میشه. ( حالا چطوری بفهمیم که کی باید از کدوم استفاده کنیم؟ یعنی چطوری بفهمیم که زمان جلو افتاده یا عقب؟ )
رجیسترهای همه کاره ۰ تا ۴ ( GPREG0:4 )
توجه : آدرس این ۴ تا رجیستر از ۰x4002 4044 تا ۰x4002 4054 هستش.
این رجیسترها میتونن ذخیره کنن اطلاعات مهم رو وقتی که برق قطع هستش ( وقتی که برق میکرو قطع هستش ولی باتری بکاب وجود داره، من تست کردم دیدم که حتما باید باتری بکاب وجود داشته باشه وگرنه اطلاعات این رجیستر پاک میشه ولی دیتاشیت حرفی در این باره نزده بود لذا این مورد رو داخل پرانتز نوشتم )؛ مقدار این رجیسترها به وسیله Reset شدن میکرو تغییر نمیکنه.
توجه مهم : شاید بپرسید کاربرد این ۴ تا رجیستر چیه، چیزی که به ذهن من میرسه اینه که شاید نیاز باشه بعضا میکرو رو برسید تو مد های کاهش مصرف توان، که اون موقع بعضی رجیستر ها مقدارشون پاک میشه، لذا میتونیم مقدار اون رجیستر ها در در این ۵ تا رجیستر به صورت موقع ذخیره کنیم و وقتی میکرو به بیدار شد دوباره ...؛ این چیزی بود که از کاربرد این رجیستر به ذهنم من میرسید و گفتم خدمتتون - شاید اشتباه و شاید درست باشه.
رجیسترهای گروه آلارم
جدول زیر لیست رجیستر ( و نه بیت! ) های مربوط به بحث آلارم رو قرار داده؛ مقدار این رجیسترها مقایسه میشه با شمارنده های زمان؛ با نوشتن ۱ در بیت ۱ام از رجیستر ILR میتونیم پرچم این وقفه رو پاک کنیم؛ اگه تمام رجیسترهای ماسک گزاری نشده آلارم مقدارشون با مقدار مترادف در رجیسترهای شمارنده زمان ( Time Counter Registers ) اون وقت وقفه تولید میشه.
نکته : برای غیر فعال کردن وقفه آلارم، باید تمام رجیسترها رو ماسک گزاری کنیم؛ برا فعال کردنش هم کافیه مقدار بدیم به رجیسترهای آلارم، به همین راحتی ^_^
ALSEC ( اندازه : ۶ بیت ) : مقدار ثانیه آلارم.
ALMIN ( اندازه : ۶ بیت ) : مقدار دقیقه آلارم.
ALHOUR ( اندازه : ۵ بیت ) : مقدار ساعت آلارم.
ALDOM ( اندازه : ۵ بیت ) : مقدار روز از ماه آلارم.
ALDOW ( اندازه : ۳ بیت ) : مقدار روز از هفته آلارم.
ALDOY ( اندازه : ۹ بیت ) : مقدار روز از سال آلارم.
ALMON ( اندازه : ۴ بیت ) : مقدار ماه آلارم.
ALYEAR ( اندازه : ۱۲ بیت ) : مقدار سال آلارم.
نحوه فراخونی رجیسترهای فوق در کامپایلر KEIL به صورت زیر هستش :
1 2 3 4 5 6 7 8 |
LPC_RTC->ALSEC LPC_RTC->ALMIN LPC_RTC->ALHOUR LPC_RTC->ALDOM LPC_RTC->ALDOW LPC_RTC->ALDOY LPC_RTC->ALMON LPC_RTC->ALYEAR |
رجیستر نقاب گزاری آلارم ( AMR - 0x4002 4010 )
نحوه فراخونی این رجیستر در کامپایلر KEIL به صورت زیر هستش :
1 |
LPC_RTC->AMR |
این رجیستر اجازه میده تا کاربر هر کدوم از رجیستر های آلارم رو ماسک گزاری کنه؛ هر کدوم از توابع ( رجیستر ) های آلارم که ماسک گزاری نشدن باید با مقدار مترادف رجیستر شمارنده زمان ( Time Counter Register ) برابر بشن تا وقفه تولید بشه، ( پرچم ) وقفه پاک میشه وقتی که مقدار ۱ رو در بیت ۱ام رجیستر ILR نوشته بشه؛ وقتی که تمام بیت ها نقاب گزاری بشن، آلارم هم غیر فعال میشه اون وقت.
بیت ۰ ( AMRSEC ) : وقتی این بیت ۱ بشه، مقدار "ثانیه" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۱ ( AMRMIN ) : وقتی این بیت ۱ بشه، مقدار "دقیقه" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۲ ( AMRHOUR ) : وقتی این بیت ۱ بشه، مقدار "ساعت" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۳ ( AMRDOM ) : وقتی این بیت ۱ بشه، مقدار "روز از ماه" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۴ ( AMRDOW ) : وقتی این بیت ۱ بشه، مقدار "روز از هفته" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۵ ( AMRDOY ) : وقتی این بیت ۱ بشه، مقدار "روز از سال" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۶ ( AMRMON ) : وقتی این بیت ۱ بشه، مقدار "ماه" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۷ ( AMRYEAR ) : وقتی این بیت ۱ بشه، مقدار "سال" برا بحث آلارم مورد مقایسه قرار نمیگیره.
بیت ۸ تا ۳۱ : رزرو شده.
هزینه این مطلب : دعا برا نابودی فتنه گرهای داخلی، منافقان، اونایی که میخوان بین مردم اختلاف بندازن، مردم رو دو دسته کنن، اونایی که تو لواسووون زندگی میکنن، خونه های میلیاردی، الانم تو این کشور مقام و پستی دارن -_-؛ یعنت بر اون کسایی که به دشمنان ایران لبخند میزنن و به مردم ایران که میرسن اخم میکنن و توهین میکنن o_O؛ دولت حسن کلید ساز که به مردم خوزستان میگه شما گناه کردید و عذاب خدا اومده و ... در حالی نمیگه که این از بی عرضگی وزیر محیط زیست هستش که حتی عارش میاد بره خوزستان ببینن مردم چی تنفس میکنن، حالا از آبش بگذریم که هر کی ندونه فک میکنه با گل قاطی کردن!؛ حالا بگذریم از مذاکره این حسن کلید ساز با صهیونیست ها! که حسن عباسی افشا کردن و روحانی هم شکایت هم کرد و بعد حسن عباسی تبرئه شد!!! حالا ببینید اوضاع کشور چطوری شده که صهیونیست ها دوست دارن روحانی دوباره رئیس جمهور ایران بشه، خبر هاش تو نت هستش، سرچ کنید کاملا دستتون میاد، یا قبلا یکی از سران اسرائیل گفته بود روحانی برنده قطعی انتخابات ۹۶ هستش!؛ یا اون وزیر محیط زیستی که جوونی داشت بهش اعتراض میکرد و میگفت خانم وزیر استعفا بدید رو مسخره میکرد!!! لینک فیلماش رو در زیر میزارم، بله حق دارن، ملت دیگه رای رو بهشون دادن و الان هم پایان کار این دولت خدمت گزار! هستش، رو لینک های زیر کلیک کنید و فیلم ها رو ببینید :
سخنان روحانی در اهواز درباره عذاب الهی! خلاصه داستان: خوزستانی ها گناه کردن و عذاب الهی(گرد خاک، قطع شدن آب و برق) از طرف خدا نازل شده بر اینا! و اصلا هم ربطی به بی عرضگی ما نداره o_O
ابتکار جوان تهرانی رو به سخره گرفت!
این کلیپ رو حتما ببیند، پشیمون نمیشید، منی که کلیپ بالای ۵ دقیقه به زور نگاه میکنم، اینو کامل نشستم نگاه کردم :
محافظان هاشمی درباره مرگ وی به حاج سعید قاسمی چه گفتند؟
دعا برا نابودی و رسوایی اون منافقای بزدلی که هیچ دست آوردی نداشته سعی دارد دستاورد های انقلاب و مردم و بسیج رو به مزاکرات ربط بده میگن ما سایه جنگ رو از سر ایران برداشتیم در حالی که نمیدونن که این قدرت نظامی و مردمی ایران هستش که اجازه این غلط رو به دشمناش نمیده و نه برجام!!! ( صدام میگفت من اگه بسیج رو داشتم؛ دنیا رو فتح میکردم! )، در حالی به تجربه بارها ثابت شده که آمریکا تا دیده کشوری توان دفاع از خودش رو نداره درجا بهش حمله کرده و صبر نکرده تا با اون کشور مذاکره کنه!؛ مطمئن باشید اگه اینا مطمئن بودن میتونن پیروز بشن، تا حالا صد دفه حمله کرده بودن، حالا یه بزدلی رفته تو مذاکرات و خارجی ها چون میدونستن اینا بزدل هستن بهشون گفتن : ما سر حمله به ایران به توافق رسیدیم فقط سر زمان حمله اختلاف داریم، اینا هم ترسیدن و فک کردن با این برجام جنگ رو از سر ایران دور کردن، نمیدونن که قدرت نظامی و مردمی ایران هستش که این اجازه و غلط رو به کسی نمیده و نه برجام؛ تا دیروز میگفتن مذاکره کنیم وضع کشور خوب بشه، مردم وضع زندگیشون خوب بده، حالا که دیدن رسوا شدن و برجام غیر از ضرر برای ما چیزی نداشته میگن : برجام اگه جیزی نداشته باشه حداقل سایه جنگ رو از سر ایران دور کرد!!!
امروز با رفیقم صحبت میکردم، بحث سیاست اومد وسط، گفت من با سیاست کاری ندارم، گفتم برات مهم نیست اشخاص رو بشناسی، منافقای داخلی رو بشناسی گفت من کاری به سیاست ندارم همون نماز برام کافیه!، اینو شنیدم یاد مردم زمان امامان معصوم افتادم، یاد زمان حضرت علی افتادم، مردم اون زمان هم نماز میخوندن، ولی منافقای زمان خوشون رو خوب نشناختن! - تاریخ چرا همش تکرار میشه!
مهمان
سلام..
ممنون بابت تمام زحماتی که کشیدید و مطالب اموزنده که در اختیار ما تازه کارا قرار دادی
من تو بحث rtc به مشکل خوردم ممنون میشم راهنماییم کنید
برنامه ای که شما محبت کردید و در سایت قرار دادید من دانلود کردم
اما متاسفانه دیتایی به سریال ارسال نمیکنه
نمیدونم.مشکلش کجاس
میشه راهنماییم کنید خیلی ضروریه
نویسنده این مطلب
سلام
اتصالاتتونو بررسی کنید – و برید تو کتاب خوبه و با یه led ! باگ گیری کنید.
مهمان
سلام. مرسی دوست عزیز!
تو اینجا اطلاعات به صورت فشرده تو CTIMEقرار میگیره .یه خوبیش این که اگه بخواهیم تاریخ و ساعت رو از طریق یکی از پروتکل ها بفرستیم سه تا رجیستر رو میفرستیم. ولی اگه میخواستیم از طریق رجیسترهای خودش بفرستیم ببین چندتا رجیستر میشد
مهمان
سلام
کدوم ریجیستر فعال کنم که ثانیه شمار فعال بشه هر کار میکنم اعداد روی lcd ثابت هستند
مهمان
واقعا خسته نباشی!!
بهتر نبود یه کتابخونه کامل و جامع ارائه بدی و بعدش رجیسترها رو از روی UM توضیح بدی؟؟
من چند ساله که دارم با ARM کار میکنم و تا حالا چندین پروژه موفق اجرا کردم
تجربه من میگه خودتو زیاد درگیر رجیسترها نکن
اینکه برا خودت یه کتابخونه بنویسی خیلی خوبه
من هم از کتابخونه های خودم استفاده میکنم
راستی من دارم یه برد آموزشی برای کارکردن با STM ها طراحی میکنم
پردازنده STM32f100C8t6
هم ارزونه هم برا شروع خوبه
اگه خواستی بهم پیام بده تا آماده که شد بزاری توی سایت برا بقیه
نویسنده این مطلب
سلام – یه کتابخونه تو نت بود – اونو ویرایش کردم – مشکلاتش رو رفع کردم و کاملش کردم – اونو فردا میزارم تو سایت.
روال کار من اینه که اول آموزش میدم و بعد میرم سراغ کتابخونه و …
جلسات قبلی رو هم دیده باشی – روال کار همینه.
برا بردت هم مورد نیست – خواستی بفرست.
مهمان
سلام
خسته نباشی
حاجی این محمد رضا سربندی فراهانی کیه؟تلگرامی جیزی داره بده ما هم بهره ببریم
کسی جواب سوالای ما رو که نمیده
ممنون
نویسنده این مطلب
سلام-داره ولی نمیتونم بدم! – البته ایشون با کتابخونه سیمیس بیشتر کار کرده تا دیتاشیت محور – بدرد شما نمیخوره
بی معرفت تا جالا سوال پرسیدی جواب ندادم؟
مهمان
نه حاجی ما مدیون شما هستیم همیشه
اونم که میگم کسی جواب نمیده سوالایی هستش که خودتم با صورتی نوشتی
یه دلیل دیگشم اینه که با جوابای مختلف و ادبیاتای دیگه آشنا باشم
یه دلیلشم اینه که کمتر مزاحم حضور ارزشمندت بشم
ما مخلص شما هستیم
مهمان
با سلام
از شما بابت سایت خوبتون تشکر می کنم .
اللهم عجل لولیک الفرج