DS3231 - اتصال یک ساعت واقعی. ساعت روی DS3231 و میکروکنترلر AVR پین های SDA و SCL روی بردهای مختلف آردوینو

31.01.2023 مرورگرها

تراشه DS3231 یک ساعت بیدرنگ RTC با دقت بالا است که دارای یک نوسانگر کوارتز جبران شده با دمای داخلی است که منجر به تغییر زمان تنها 2± دقیقه در سال می شود. علاوه بر این، یک تابع زنگ اجرا شده است، و همچنین یک خروجی وقفه وجود دارد. ساعت را می توان به عنوان یک ماژول آردوینو آماده با عناصر تسمه ای و یک محفظه باتری خریداری کرد.

من ماژول را اینجا سفارش دادم. نمودار در تصویر زیر نشان داده شده است:


میکرو مدار از مواردی که به طور گسترده استفاده می شود استفاده می کند. از نرخ داده استاندارد (100 کیلوهرتز) و بالا (400 کیلوهرتز) پشتیبانی می کند. آدرس ریز مدار (7 بیت) در گذرگاه I2C 1101000 است. علاوه بر این، ماژول دارای حافظه I2C (24C32) است که در نمودار نشان داده نشده است.

حالت های قدرت

ولتاژ تغذیه ریز مدار می تواند در محدوده 2.3 ... 5.5 ولت باشد، دو خط برق برای یک منبع خارجی (خط Vcc) و همچنین برای باتری (Vbat) وجود دارد. ولتاژ منبع خارجی به طور مداوم نظارت می شود و هنگامی که از آستانه Vpf=2.5V پایین می آید، به خط باتری سوئیچ می کند. جدول زیر شرایط تعویض بین خطوط برق را نشان می دهد:

دقت ساعت با نظارت بر دمای محیط حفظ می شود. ریز مدار یک روش داخلی را برای تنظیم فرکانس ژنراتور ساعت شروع می کند؛ مقدار تنظیم با استفاده از نمودار خاصی از فرکانس در برابر دما تعیین می شود. این روش پس از اعمال برق شروع می شود و سپس هر 64 ثانیه اجرا می شود.

به منظور صرفه جویی در شارژ، هنگامی که باتری متصل است (ولتاژ به خط Vbat اعمال می شود)، ژنراتور ساعت شروع نمی شود تا زمانی که ولتاژ در خط Vcc از مقدار آستانه Vpf بیشتر شود، یا آدرس صحیح ریز مدار از طریق انتقال داده شود. رابط I2C زمان راه اندازی مولد ساعت کمتر از یک ثانیه است. تقریباً 2 ثانیه پس از اعمال برق (Vcc)، یا دریافت آدرس از طریق رابط I2C، روند تصحیح فرکانس شروع می شود. هنگامی که مولد ساعت شروع به کار کرد، تا زمانی که Vcc یا Vbat وجود دارد به کار خود ادامه می دهد. هنگامی که برای اولین بار روشن می شود، رجیسترهای تاریخ و زمان بازنشانی می شوند و مقادیر زیر را دارند: 01/01/00 – 01 – 00/00/00 (روز/ماه/سال/ – روز هفته – ساعت/دقیقه /ثانیه).

مصرف جریان هنگام تغذیه با باتری 3.63 ولت 3 µA است، در صورت عدم انتقال داده از طریق رابط I2C. با استفاده از منبع تغذیه خارجی 5.5 ولت و سرعت بالای انتقال داده I2C، حداکثر جریان مصرفی می تواند به 300 µA برسد.

عملکرد تنظیم مجدد خارجی

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

شرح رجیسترهای DS3231

جدول زیر فهرستی از رجیسترهای ساعت بلادرنگ را نشان می دهد:

نشانیD7D6D5D4D3D2D1D0تابعمحدودیت ها
0x000 10 ثانیهثانیه هاثانیه ها00-59
0x010 10 دقیقهدقایقدقایق00-59
0x020 12/24 قبل از ظهر بعد از ظهر10 ساعتساعتتماشا کردن1-12 + AM/PM یا 00-23
10 ساعت
0x030 0 0 0 0 روزروز هفته1-7
0x040 0 10عددتاریخ01-31
0x05قرن0 0 10 ماهماهماه/قرن01-12 + قرن
0x0610 سالسالسال ها00-99
0x07A1M110 ثانیهثانیه هاثانیه ها، زنگ اول00-59
0x08A1M210 دقیقهدقایقدقیقه، زنگ اول00-59
0x09A1M312/24 قبل از ظهر بعد از ظهر10 ساعتساعتساعت، زنگ اول1-12 + AM/PM یا 00-23
10 ساعت
0x0AA1M4DY/DT10روزروز هفته، 1 زنگ هشدار1-7
عددتاریخ، زنگ اول01-31
0x0BA2M210 دقیقهدقایقدقیقه، زنگ دوم00-59
0x0CA2M312/24 قبل از ظهر بعد از ظهر10 ساعتساعتساعت، زنگ دوم1-12 + AM/PM یا 00-23
10 ساعت
0x0DA2M4DY/DT10روزروز هفته، زنگ دوم1-7
عددتاریخ، زنگ دوم01-31
0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IEثبت تنظیمات (کنترل)
0x0FO.S.F.0 0 0 EN32 کیلوهرتزBSYA2FA1Fثبت وضعیت
0x10امضا کردنداده هاداده هاداده هاداده هاداده هاداده هاداده هاثبت نام افست پیری
0x11امضا کردنداده هاداده هاداده هاداده هاداده هاداده هاداده هاثبت دما، بایت بالا
0x12داده هاداده ها0 0 0 0 0 0 ثبت دما، بایت کم

اطلاعات زمان در قالب اعشاری باینری ذخیره می شود، یعنی هر رقم از یک عدد اعشاری (از 0 تا 9) به عنوان یک گروه 4 بیتی نشان داده می شود. در مورد یک بایت، نیبل کم یک ها، نیبل زیاد ده ها می شمرد، و غیره. زمان در ثبات هایی با آدرس های 0x00-0x06 شمارش می شود؛ برای شمارش ساعت ها، می توانید حالت 12 یا 24 ساعت را انتخاب کنید. تنظیم بیت ششم ثبت ساعت (آدرس 0x02) حالت 12 ساعته را تنظیم می کند، که در آن بیت 5 زمان روز را نشان می دهد، مقدار 1 مربوط به بعد از ظهر (PM)، مقدار 0 مربوط به بعد از ظهر (AM) است. مقدار صفر بیت ششم مربوط به حالت 24 ساعته است، در اینجا بیت 5 در شمارش ساعت ها نقش دارد (مقادیر 20-23).

ثبت روز هفته در نیمه شب افزایش می یابد، از 1 تا 7 شمارش می شود، ثبت ماه (آدرس 0x05) حاوی بیت قرن (بیت هفتم) است، که وقتی ثبت سال شمارش (آدرس 0x06) سرریز می شود، از 99 به 00 تغییر می کند. .

تراشه DS3231 دو ساعت زنگ دار را اجرا می کند، ساعت زنگ دار اول با استفاده از رجیسترهایی با آدرس های 0x07-0x0A پیکربندی شده است، ساعت زنگ دوم با استفاده از ثبات های 0x0B-0x0D پیکربندی شده است. بیت های A1Mx و A2Mx را می توان برای پیکربندی حالت های مختلف برای آلارم ها استفاده کرد؛ تنظیم بیت، ثبت مربوطه را از عملیات مقایسه حذف می کند. جداول زیر ترکیب بیت ها را برای حالت های مختلف هشدار نشان می دهد:

ترکیبات بیتی که در جداول مشخص نشده اند منجر به عملکرد نادرست آلارم ها می شود. اگر بیت DY/DT پاک شود، مطابقت تاریخ (روز ماه) برای ساعت زنگ دار نظارت می شود؛ وقتی بیت DY/DT تنظیم می شود، مطابقت روز هفته بررسی می شود.

اکثر توابع در رجیستر کنترل پیکربندی شده اند. بیت EOSC شروع مولد ساعت را کنترل می کند، با تنظیم مجدد بیت، مولد ساعت را شروع می کند. تنظیم بیت، ژنراتور را فقط برای حالت باتری (Vbat) متوقف می کند. هنگامی که از یک منبع خارجی (Vcc) تغذیه می شود، نوسانگر بدون توجه به وضعیت بیت EOSC همیشه در حال کار است. وقتی فعال باشد، مقدار بیت پیش‌فرض 0 است.

تنظیم بیت BBSQW به خروجی INT/SQW (پین سوم) اجازه می دهد تا در حالت تغذیه باتری، در غیاب برق خارجی، کار کند. هنگامی که بیت روی صفر تنظیم می شود، اگر ولتاژ منبع خارجی Vcc کمتر از مقدار آستانه Vpf باشد، خروجی INT/SQW به حالت 3 می رود (غیرفعال می شود). پس از اعمال برق، مقدار بیت پیش فرض 0 است.

بیت CONV مسئول اندازه‌گیری دمای اجباری است؛ تنظیم بیت فرآیند تبدیل را آغاز می‌کند، که طی آن فرکانس مولد ساعت نیز تنظیم می‌شود؛ نتیجه اندازه‌گیری در ثبات‌هایی با آدرس‌های 0x11، 0x12 قرار دارد. شروع فقط در صورت اتمام تبدیل قبلی امکان پذیر است ؛ قبل از شروع ، باید پرچم شلوغ را بررسی کنید. تبدیل دمای اجباری بر چرخه تنظیم فرکانس 64 ثانیه داخلی تأثیر نمی گذارد. تنظیم بیت Conv بر پرچم BSY برای 2 میلی ثانیه تأثیر نمی گذارد. بیت های Conv و BSY پس از اتمام تبدیل به طور خودکار پاک می شوند.

BITS RS2 ، RS1 فرکانس پالس های مستطیل (موج مربع) را در خروجی INT/SQW تنظیم می کند. به طور پیش فرض ، هنگامی که فعال می شوند ، بیت ها روی 1 تنظیم می شوند. جدول زیر ترکیبات احتمالی بیت ها را نشان می دهد:

بیت INTCN خروجی INT/SQW را کنترل می کند. اگر بیت مجدداً تنظیم شود ، پالس های مستطیل شکل (امواج مربع) در خروجی ظاهر می شوند که فرکانس آن توسط بیت های RS2 ، RS1 تنظیم می شود. هنگامی که بیت INTCN تنظیم شده است ، از خروجی برای ایجاد وقفه های زنگ استفاده می شود. به طور پیش فرض، مقدار بیت 1 است. نوع خروجی INT/SQW است - تخلیه باز، بنابراین لازم است آن را از طریق یک مقاومت به سطح منطقی بالا بکشید، سطح فعال پایین است.

تنظیم بیت های A1ie ، A2IE به ترتیب وقفه ها را در سیگنال های زنگ 1 و 2 امکان پذیر می کند. بازنشانی بیت ها ، وقفه ها را غیرفعال می کند. مقدار پیش فرض 0 است.

ثبت وضعیت حاوی پرچم های رویداد است و خروجی 32 کیلوهرتز را کنترل می کند. پرچم OSF وضعیت مولد ساعت را نشان می دهد، مقدار 1 به این معنی است که مولد ساعت متوقف شده است، این رویداد می تواند در موارد زیر رخ دهد:

  • برای اولین بار پس از اعمال برق
  • باتری یا ولتاژ خارجی برای کارکردن ژنراتور ساعت کافی نیست
  • با تنظیم بیت EOSC در حالت باتری، ژنراتور خاموش می شود
  • عوامل خارجی موثر بر نوسان ساز کریستالی (صدا، نشت و غیره)

پس از تنظیم، مقدار بیت تغییر نمی کند، بیت باید به صورت دستی تنظیم مجدد شود.

تنظیم بیت EN32kHz اجازه می دهد تا پالس های مستطیلی (امواج مربع) در خروجی 32 کیلوهرتز (پین اول) تولید شود، فرکانس پالس ثابت و برابر با 32.768 کیلوهرتز است. تنظیم مجدد بیت این عملکرد را غیرفعال می کند و خروجی را به حالت سوم (امپدانس ورودی بالا) منتقل می کند. به طور پیش فرض، مقدار بیت 1 است؛ پس از اعمال برق، پالس ها در خروجی ظاهر می شوند. نوع خروجی 32 کیلوهرتز تخلیه باز است، بنابراین نیاز به کشش تا سطح منطقی بالا دارد.

پرچم شلوغ BSY در طی فرآیند تبدیل دما و تنظیم ساعت تنظیم شده است. پرچم پس از اتمام تبدیل دوباره تنظیم می شود.

پرچم های ساعت زنگ A1f ، A2F هنگامی تنظیم می شوند که مقادیر ثبت نام های شمارش زمان و ثبت های ساعت زنگ دار مطابقت داشته باشند. اگر زنگ هشدار A1IE را قطع کند، A2IE فعال شود، و یک خروجی وقفه اختصاص داده شود (بیت INTCN تنظیم شده است)، سپس یک سیگنال وقفه در خروجی INT/SQW ظاهر می شود (انتقال از سطح منطقی بالا به پایین). پرچم ها باید با نوشتن مقدار 0 به صورت دستی تنظیم مجدد شوند.

رجیستر Aging Offset برای تنظیم فرکانس مولد ساعت طراحی شده است. اگر تغییر دما تشخیص داده شود، و همچنین هنگامی که تبدیل دما توسط بیت CONV فعال می شود، مقدار ثبت به فرکانس اسیلاتور در طول فرآیند تنظیم داخلی اضافه می شود. مقدار افست امضا شده است، یعنی مقادیر مثبت (1-127) فرکانس را کاهش می دهد، مقادیر منفی (128-255) آن را افزایش می دهد. برای همان افست، تغییر فرکانس بسته به دما متفاوت خواهد بود. در 25+ درجه سانتیگراد، تغییر فرکانس 0.1 ppm/LSB خواهد بود.

مقدار دمای فعلی در ثبات هایی با آدرس های 0x11 و 0x12 ذخیره می شود، بایت های بالا و پایین به ترتیب، مقدار دما در ثبات ها به طور دوره ای به روز می شود. تراز سمت چپ تنظیم شده است، وضوح 10 بیت یا 0.25 درجه سانتیگراد / LSB است، یعنی بایت بالا شامل قسمت صحیح دما است و بیت های 6 و 7 در ثبات های پایین بخش کسری را تشکیل می دهند. در بایت بالا، بیت 7 نشانه دما را نشان می دهد، به عنوان مثال، مقدار 00011011 01 مربوط به دمای +27.25 درجه سانتیگراد است، مقدار 11111110 10 مربوط به دمای -2.5 درجه سانتیگراد است.

هنگام خواندن رجیسترهای زمان، توصیه می شود از یک بافر اضافی استفاده کنید، یعنی چندین رجیستر را به طور همزمان بخوانید و نه جداگانه، زیرا بین عملیات خواندن فردی، ثبات های زمان می توانند مقدار خود را تغییر دهند. این قانون همچنین توصیه می شود هنگام نوشتن داده های جدید در ثبت حساب ها رعایت شود. نوشتن یک مقدار جدید در ثبات ثانیه، ساعت را به مدت 1 ثانیه مکث می کند، ثبات های باقی مانده باید در این مدت بازنویسی شوند.

اتصال DS3231 به میکروکنترلر

من ساعت را به یک میکروکنترلر PIC16F628A وصل کردم و استفاده کردم. نمودار اتصال در زیر نشان داده شده است:


پس از اعمال برق، خط تیره (– – – – – –) روی نشانگرها نمایش داده می‌شود، سپس ساعت اولیه می‌شود، مقدار زمان با تأخیر 1 ثانیه روی نشانگرها ظاهر می‌شود که برای راه‌اندازی مولد ساعت لازم است. نشانگرها ساعت ها، دقیقه ها و ثانیه ها را با یک نقطه اعشار از هم جدا می کنند و فرمت زمان 24 ساعته است. با استفاده از دکمه SB1 "Indication" می توانید فرمت نمایش را تغییر دهید، جایی که نشانگرها دما و همچنین مقدار ساعت و دقیقه را با یک نقطه اعشار از هم جدا می کنند که با فرکانس 2 هرتز چشمک می زند. دما بدون بخش کسری نمایش داده می شود؛ برنامه فقط بایت بالای ذخیره دما را در آدرس 0x11 می خواند.

مقدار زمان از طریق یک وقفه در خط SQW/INT از ساعت خوانده می‌شود، که توسط اولین سیگنال زنگ کنترل می‌شود؛ در طول شروع اولیه ساعت، ساعت زنگ دار روی سیگنال هر ثانیه تنظیم می‌شود. LED HL1 به عنوان یک نشانگر عمل می کند و هر ثانیه در سیگنال وقفه چشمک می زند. در صورت بروز خطا در انتقال داده ها از طریق رابط I2C، LED HL2 روشن می شود.

علاوه بر این، من قابلیت تنظیم ساعت را با استفاده از دکمه های SB2 "Settings"، SB3 "Installation" به برنامه اضافه کردم. با فشار دادن دکمه SB2 به حالت تنظیم وارد می شود؛ نشانگرها به جای دقیقه و ثانیه (00 – – – –) ساعت 00 و خط تیره را نشان می دهند. با استفاده از دکمه SB3، مقدار ساعت را تنظیم می کنید (با هر بار فشار دادن افزایش می یابد)، سپس با فشار دادن دکمه SB2 به ویرایش دقیقه تغییر می کند؛ به جای خط تیره، 00 دقیقه نمایش داده می شود. دکمه SB3 نیز مقدار مورد نیاز و غیره را تنظیم می کند. پس از ویرایش ثانیه ها و فشار دادن دکمه SB2، زمان در ساعت بازنویسی می شود و زمان به روز شده روی نشانگرها نمایش داده می شود.

کد برنامه جزئی در زیر آورده شده است (نسخه کامل را می توانید در انتهای مقاله دانلود کنید):

;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;; ; #عبارتند از لیست P = 16f628a __config H "3F10" ؛ MicroController پیکربندی ErrorLevel -302 ؛ پیام هایی را با خطای 302 در لیست SEC برابر 0020H نمایش ندهید ؛ ثبت حساب کمکی Sec1 Eque 0021H ؛ معادله Sec2 0022h ; SCETBIT برابر 0024H ؛ ثبت نام کمکی برای شمارش تعداد بیت های PEREM برابر 0025H ؛ ثبت نام کمکی برای پذیرش/انتقال بایت از طریق SPI ، TEMP I2C EQUE 0026H ؛ ثبت دما PEREM_1 EVE 0027H ؛ ثبت نام کمکی برای مبدل باینری-دیمال. نتیجه معادله 0028h ;رجیستر کمکی مبدل باینری-اعشاری DAT_IND EQU 0029H ؛ ثبت داده برای انتقال از طریق پروتکل SPI ADR_IND EQUE 002AH ؛ ثبت نام آدرس برای انتقال از طریق پروتکل SPI دوم EQU 002BH ؛ SECONDS ثبت نام برای تنظیم زمان Minut Eque 002CH ؛ ثبت چند دقیقه ثبت ذخیره برای تنظیم ساعت ساعت Eque 002DH ؛ ثبت ساعت ذخیره سازی برای تنظیمات زمان ADR_I2C EVE 002EH ؛ ثبت نام های انتقال داده رابط I2C TMP_I2C TMP_I2C EQU 002FH SLAVE_ADR EQU 0030H DATA_I2C EQU 0031H FLAG EVE 007FH ؛ FLAG Register #define intpp ، 0 ؛ خط مداخله int/sqw ds3232323232323232 3232 3232 3232 SQW DS3232323232323232 3232 SQW DS323232323232323232 323232323232 SQW DS3232323232323232 323232 SQW DS3232323232323232323232 SQW DS32323231 ، 1 ؛ خط SDA برای اتصالات DS3231 #define SCL Portb ، 2 ؛ خط SCL برای اتصال DS3231 #Define SDA_IO TRISB ، 1 ؛ جهت خط SDA #Define SCL_IO TRISB ، 2 ؛ جهت خط SCL #Define Datai Portb ، 5 ؛ خط ورودی داده از درایور MAX7219 #DEFINE CS PORTB ، 6 ؛ خط انتخاب درایور MAX7219 #DEFINE CLK PORTB ، 7 ؛ خط ساعت درایور MAX7219 #DEFINE LED PORTB ، 4 ؛ I2C خطای LED #DEFINE LED_SEC PORTB ، 3 ؛ شاخص پیشرفت ساعت LED 1Hz #Define Regim Porta ، 2 ؛ دکمه نشانه - تغییر حالت نمایش #define nast porta ، 3 ؛ دکمه تنظیم - وارد کردن حالت تنظیم زمان #define UST Porta ، 4 ؛ دکمه تنظیم - تنظیم مقدار ساعت ؛؛؛؛ ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;شروع اجرای برنامه از آدرس 0000h goto Start ;به برچسب شروع بروید ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;; ;برنامه اصلی Start movlw b"00000000" ;تنظیم مقادیر لچ های خروجی پورت A movwf PORTA ; movlw b"01000000" ;مقادیر لچ های خروجی پورت B را تنظیم کنید movwf PORTB. movlw b"00000111" ;غیرفعال کردن مقایسه کننده ها movwf CMCON ; وضعیت BSF ، RP0 ؛ اولین بانک MOVLW B "00000111" را انتخاب کنید ؛ خطوط ورودی/خروجی پورت B MovWF TRISB ؛ RB0 -RB2 - برای ورودی ، بقیه برای خروجی MOVLW B "111111111" ؛ ورودی را تنظیم کنید/تنظیم کنید/ورودی را تنظیم کنید. خطوط خروجی بندر A MOVWF TRISA ؛ کلیه خطوط برای وارد کردن وضعیت BCF ، RP0 ؛ بانک را انتخاب کنید 0 پرچم CLRF ؛ تنظیم مجدد پرچم ثبت نام تماس با نام INIT_LCD ؛ Subroutine اولیه سازی درایور تماس (MAX7219) با VIV_NOT ؛ نمادهای خروجی DASH "------" تماس بگیرید ". ;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;آدرس دستگاه (DS3231) movwf slave_adr ;نوشتن 4 بایت در رجیسترهای دریافت/انتقال از طریق i2c؛ در اینجا اولین آلارم پیکربندی شده است، هر ثانیه movlw data_i2c بوق می‌زند؛ اولین ثبت دریافت/انتقال i2c را تنظیم کنید. ; movlw b"10000000" ;داده های ثبت ثانیه های زنگ اول movwf INDF ; incf FSR,F ; movlw b"10000000" ;داده های ثبت دقیقه زنگ اول movwf INDF ; incf FSR,F ; movlw b"10000000" ;داده های ثبت ساعت ساعت زنگ دار اول movwf INDF ; incf FSR,F ; movlw b"10000000" ;داده های ثبت تاریخ/روز هفته اولین زنگ هشدار movwf INDF ; movlw. 4 ;انتقال 4 بایت از طریق i2c movwf tmp_i2c ; movlw 0x07 ;تنظیم آدرس ثبت ثانیه های ساعت زنگ دار اول movwf adr_i2c ; فراخوانی write_i2c ; فراخوانی زیربرنامه نوشتن از طریق رابط i2c call err_prov ;بررسی خطاهای نوشتن/خواندن I2C movlw .1 ;انتقال بایت اول از طریق i2c movwf tmp_i2c ; movlw 0x0E ;تنظیم آدرس رجیستر کنترل movwf adr_i2c ; movlw data_i2c ;تنظیم اولین ثبت ارسال/دریافت از طریق i2c movwf FSR. movlw b"00000101"؛ مولد ساعت را راه اندازی کنید، عملکرد پین INT/SQW را برای movwf INDF ممنوع کنید؛ حالت برق باتری، فرکانس پالس در خروجی INT/SQW 1 هرتز است، خروجی INT/SQW برای ایجاد زنگ هشدار استفاده می شود. clock interrupts, ;فعال کردن وقفه های ساعت زنگ دار اولین تماس با زنگ write_i2c ; فراخوانی زیر روال ضبط از طریق رابط i2c تماس err_prov ;بررسی خطاهای نوشتن/خواندن I2C met_2 movlw .1 ;انتقال بایت اول از طریق i2c movwf t ; movlw 0x0F ;تنظیم آدرس ثبت وضعیت movwf adr_i2c ; movlw data_i2c ;تنظیم اولین ثبت ارسال/دریافت از طریق i2c movwf FSR. movlw b"00000000"؛ بیت OSF را بازنشانی کنید، تولید پالس ها را در خروجی EN32 کیلوهرتز ممنوع کنید، movwf INDF، پرچم های وقفه آلارم را بازنشانی کنید A2F، A1F call write_i2c؛ فراخوانی زیر روال ضبط از طریق واسط I_2C برای نوشتن تماس err /read errors met_1 btfsc int ؛ نظرسنجی خط وقفه آلارم goto met_3. bsf led_sec ;نشانگر پیشرفت ساعت LED goto met_4 را روشن کنید. met_3 bcf led_sec ; چراغ نشانگر پیشرفت ساعت را خاموش می کند btfsc nast ;دکمه تنظیم ساعت را نظرسنجی می کند goto met_5 ; فراخوانی nast_time ;با زیربرنامه تنظیم زمان تماس بگیرید goto met_2 ; met_5 btfsc regim ;نظرسنجی دکمه حالت نشانگر goto met_1 ; met_6 تماس با paus_knp ؛ رژیم BTFSS ؛ goto met_6 ؛ btfss flag,2 ;مقدار پرچم حالت نشانگر را تغییر دهید goto met_7 ; bcf flag,2 ;بازنشانی پرچم نشانگر، حالت نمایش ساعت goto met_1 ; met_7 bsf flag,2 ;تنظیم پرچم نشانگر، درجه حرارت و حالت نمایش ساعت goto met_1 ; met_4 movlw .1 ;انتقال بایت اول از طریق i2c movwf tmp_i2c ; movlw 0x11 ;تنظیم آدرس رجیستر دمای بالا movwf adr_i2c ; فراخوانی read_i2c ؛ فراخوانی زیر روال خواندن از طریق I2C call err_prov ;بررسی خطاهای نوشتن/خواندن I2C movf INDF,W ;کپی کردن مقدار دما در ثبت دمای movwf temp rd_time movlw .3 ;انتقال 3 بایت از طریق i2c movwf ; movlw 0x00 ;تنظیم آدرس ثبت ثانیه movwf adr_i2c ; فراخوانی read_i2c ; فراخوانی زیربرنامه خواندن از طریق I2C call err_prov ;بررسی خطاهای نوشتن/خواندن I2C btfsc flag,2 ;نظرسنجی از پرچم حالت نشانه goto met_8 ; فراخوانی vivod ; فراخوانی زیربرنامه برای نمایش مقدار ساعت در صفحه نمایش دیجیتال goto met_2 ; met_8 فراخوانی vivod_temp ; فراخوانی زیربرنامه برای نمایش دما و ساعت روی نمایشگر دیجیتال goto met_2 ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#عبارتند از

CONFIG H"3F10" ؛ پیکربندی میکروکنترلر

errorlevel -302 ;پیام های خطای 302 را در لیست نشان ندهید

Sec equ 0020h ;رجیسترهای حساب کمکی

معادله Sec1 0021h ;

معادله Sec2 0022h ;

scetbit equ 0024h ؛ شمارش تعداد بیت های ثبت کمکی

perem equ 0025h ;ثبت دریافت/انتقال بایت کمکی از طریق spi, i2c

دمای equ 0026h ;رجیستر دما

رجیستر کمکی perem_1 equ 0027h ;BCD

نتیجه معادله 0028h ;رجیستر کمکی مبدل باینری-اعشاری

dat_ind equ 0029h ؛ ثبت داده برای انتقال از طریق پروتکل spi

adr_ind equ 002Ah ;رجیستر آدرس برای انتقال از طریق پروتکل spi

معادله دوم 002Bh ;ثانیه ثبت ذخیره برای تنظیم زمان

minut equ 002Ch ;ثبت ذخیره دقیقه برای تنظیم زمان

ساعت معادل 002Dh ;ثبت ذخیره سازی ساعت برای تنظیم زمان

adr_i2c equ 002Eh ;ثبت کننده زیربرنامه انتقال داده رابط i2c

tmp_i2c معادل 002Fh

slave_adr equ 0030h

data_i2c معادله 0031h

flag equ 007Fh ; ثبت پرچم

#تعریف int PORTB,0 ؛ خط وقفه INT/SQW DS3231

#DEFINE sda PORTB,1 ;خط SDA برای اتصال DS3231

#تعریف scl PORTB,2 ;خط SCL برای اتصال DS3231

#DEFINE datai PORTB,5؛ خط ورودی داده از درایور MAX7219

#DEFINE cs PORTB,6 ;خط انتخاب راننده MAX7219

#تعریف clk PORTB,7 خط ساعت از درایور MAX7219

#DEFINE led PORTB,4 ;i2c خطا LED

#DEFINE led_sec PORTB,3؛ نشانگر پیشرفت ساعت LED 1Hz

#Define Regim Porta ، 2 ؛ دکمه نشانه - حالت نمایش را تغییر می دهد

#DEFINE nast PORTA,3؛ دکمه تنظیمات - وارد حالت تنظیم زمان می شود

#define UST Porta ، 4 ؛ دکمه تنظیم - مقدار ساعت را تنظیم کنید

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ؛ شروع برنامه را از آدرس 0000H شروع کنید

goto Start ؛ به برچسب Start بروید

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

؛ برنامه اصلی

Movlw B "00000000" را شروع کنید ؛ مقادیر قفل خروجی بندر A را تنظیم کنید

Movlw B "01000000" ؛ مقادیر قفل خروجی بندر B را تنظیم کنید

movlw b"00000111"؛ مقایسه کننده ها را خاموش کنید

bsf STATUS,RP0 ؛ بانک اول را انتخاب کنید

MOVLW B "00000111" ؛ پیکربندی خطوط ورودی/خروجی پورت B

MOVWF TRISB ؛ RB0 -RB2 - به ورودی ، بقیه به خروجی

MOVLW B "111111111" ؛ تنظیم خطوط ورودی/خروجی بندر A

movwf TRISA ;همه خطوط برای ورودی

bcf STATUS,RP0 ؛ بانک 0 را انتخاب کنید

clrf flag ;رجیستر پرچم را بازنشانی کنید

با init_lcd تماس بگیرید ؛ با روال اولیه سازی راننده تماس بگیرید (MAX7219)

با VIV_NOT تماس بگیرید ؛ نمادهای خروجی Dash "------" به شاخص ها

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

آدرس دستگاه movlw b"11010000" (DS3231)

؛ 4 بایت را برای ثبت/انتقال از طریق I2C بنویسید

MOVLW DATA_I2C ؛ تنظیم اولین ثبت دریافت/انتقال از طریق I2C

Movlw B "10000000" ؛ داده برای ثبت ثانیه های زنگ 1

MOVLW B "10000000" ؛ داده برای ثبت نام دقایقی از زنگ 1

MOVLW B "10000000" ؛ داده برای ثبت ساعت زنگ 1

MOVLW B "10000000" ؛ داده برای تاریخ/روز ثبت نام هفته زنگ هشدار 1

movlw .4 ;انتقال 4 بایت از طریق i2c

movlw 0x07 ;تنظیم آدرس ثبت ثانیه های ساعت زنگ دار اول

ویژگی های متمایز کننده:

  • دقت ± 2 ppm در محدوده دمایی 0 تا +40 درجه سانتی گراد
  • دقت 3.5 ± ppm در محدوده دمایی -40 درجه سانتیگراد تا +85 درجه سانتیگراد
  • ورودی برای اتصال یک منبع تغذیه مستقل برای اطمینان از عملکرد مداوم
  • محدوده دمای عملیاتی تجاری: از 0 درجه سانتی گراد تا +70 درجه سانتی گراد صنعتی: -40 درجه سانتی گراد تا +85 درجه سانتی گراد
  • کم مصرف
  • ساعت واقعی شمارش ثانیه، دقیقه، ساعت، روزهای هفته، روزهای ماه، ماه و سال با تصحیح سال کبیسه تا 2100
  • دو زنگ هشدار روزانه
  • خروجی موج مربعی با فرکانس قابل برنامه ریزی
  • رابط سریع (400 کیلوهرتز) I 2 C
  • برق 3.3 ولت
  • سنسور دما دیجیتال با دقت اندازه گیری ±3 درجه سانتی گراد
  • ثبت نام حاوی اطلاعات مربوط به تنظیم مورد نیاز
  • ورودی/خروجی nonRST تنظیم مجدد

کاربرد:

  • سرورها
  • کنتور برق الکترونیکی
  • تجهیزات تلماتیک
  • سیستم های GPS

نمودار اتصال معمولی برای DS3231:

توضیحات کلی:

DS3231 یک ساعت بیدرنگ (RTC) با دقت بالا با رابط داخلی I 2 C، نوسانگر کریستالی جبران شده با دما (TCXO) و تشدید کننده کوارتز است. این دستگاه دارای ورودی برای اتصال یک منبع تغذیه خودکار پشتیبان است که امکان اندازه گیری زمان و دما را حتی زمانی که ولتاژ منبع تغذیه اصلی خاموش است را می دهد. تشدید کننده کوارتز داخلی عمر مفید دستگاه را افزایش می دهد و تعداد عناصر خارجی مورد نیاز را کاهش می دهد. DS3231 در نسخه های دمایی تجاری و صنعتی موجود است و در بسته بندی 300 میل 16 پین SO بسته بندی می شود.

RTC شمارش ثانیه ها، دقیقه ها، ساعت ها، روزهای هفته، روزهای ماه و سال را فراهم می کند. تاریخ پایان ماه به طور خودکار با در نظر گرفتن سال های کبیسه تعیین می شود. ساعت واقعی در قالب 24 یا 12 ساعت با نشان دادن نیمه فعلی روز (AM/PM) کار می کند. دستگاه دارای دو آلارم روزانه و خروجی موج مربعی با فرکانس قابل برنامه ریزی می باشد. تبادل داده با دستگاه از طریق رابط داخلی سازگار با سریال I 2 C انجام می شود.

". بیایید با ماژول ساعت بیدرنگ DS3231 آشنا شویم. این مقاله حاوی دستورالعمل های ویدئویی، لیست برنامه ها، هدف و روش های اتصال ماژول ها از خانواده DS به آردوینو است.

ماژول ساعت واقعی DS3231

ماژول ساعت واقعی DS3231 چیست؟

ماژول ساعت زمان واقعی- این یک مدار الکترونیکی است که برای ثبت داده های زمان سنجی (زمان فعلی، تاریخ، روز هفته و غیره) طراحی شده است و سیستمی متشکل از یک منبع برق مستقل و یک دستگاه ضبط است.

ماژول DS3231در اصل یک ساعت معمولی است. بردهای آردوینو قبلاً دارای سنسور زمان داخلی هستند میلیسبا این حال، فقط زمانی کار می کند که برق به برد اعمال شود. اگر آردوینو را خاموش و سپس روشن کنید، زمان میلیس به صفر می رسد. و DS3231 دارای یک باتری روی برد است که حتی زمانی که برد آردوینو قطع می‌شود، ماژول را "تغذیه" می‌کند و به آن امکان اندازه‌گیری زمان را می‌دهد.

این ماژول می تواند به عنوان ساعت یا ساعت زنگ دار بر اساس بردهای آردوینو استفاده شود. یا به عنوان یک هشدار برای سیستم های مختلف، به عنوان مثال در یک خانه هوشمند.

مشخصات DS3231:

  • ماژول ساعت، دقیقه، ثانیه، تاریخ، ماه، سال را محاسبه می کند (سال های کبیسه تا 2100 در نظر گرفته می شود).
  • برای اتصال به دستگاه های مختلف، ساعت از طریق رابط I2C متصل می شود.

32 هزار- خروجی طراحی شده برای تامین برق خارجی >12 ولت.

S.Q.W.- خروجی سیگنال موج مربعی قابل برنامه ریزی

SCL– از طریق این پین، داده ها با ساعت از طریق رابط I2C رد و بدل می شوند.

S.D.A.- داده های ساعت از طریق این پین منتقل می شود.

VCC- منبع تغذیه برای ساعت واقعی، 5 ولت مورد نیاز. اگر ولتاژی به این پین داده نشود، ساعت به حالت خواب می رود.

GND- زمین.

نمودار اتصال برای ساعت بیدرنگ DS3231 و یک برنامه ساده

پین های SDA و SCL در بردهای مختلف آردوینو:

S.D.A. SCL
سازمان ملل متحد A4 A5
مینی A4 A5
نانو A4 A5
Mega2560 20 21
لئوناردو 2 3

بیایید ماژول ساعت بلادرنگ را به Arduino UNO متصل کنیم. SDA - پین A4، SCL - پین A5.

برنامه زیر برای کارکرد مدل مناسب است (به سادگی می توانید برنامه را در Arduino IDE کپی کنید):

#عبارتند از

void setup() (
تاخیر(300);
Serial.begin(9600);
time.begin();
}
حلقه خالی()



}
}

در این طرح، زمان به سادگی در حال شمارش معکوس است.

اول از همه، در sktech، کتابخانه را متصل کنید iarduino_RTC.h.

در آنجا نام دقیق ماژول خود را برای کار صحیح با آن مشخص کنید.

در نتیجه، خروجی زمان را از ماژول DS3231 به نمایشگر پورت دریافت می کنیم. ساعت، دقیقه، ثانیه نمایش داده می شود.

در طرح بعدی یک تابع اضافه می کنیم مدت زمان معینی، که به شما امکان می دهد زمان شمارش معکوس اولیه را تنظیم کنید.

#عبارتند از
زمان iarduino_RTC (RTC_DS3231)؛
void setup() (
تاخیر(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 ثانیه، 0 دقیقه، 18 ساعت، 24 آوریل 2017، دوشنبه
}
حلقه خالی()
if(millis()%1000==0)( // اگر 1 ثانیه گذشته باشد
Serial.println(time.gettime("d-m-Y، H:i:s، D")); // نمایش زمان
تاخیر (1); // 1 میلی ثانیه مکث کنید تا زمان چندین بار در 1 میلی ثانیه نمایش داده نشود
}
}

در مثال، زمان از 0 ثانیه، 0 دقیقه، ساعت 18، 24 آوریل 2017، دوشنبه شروع به شمارش می کند.

پست های درس:

  1. درس اول: .
  2. درس دوم: .
  3. درس سوم: .
  4. درس چهارم: .
  5. درس پنجم: .
  6. درس ششم: .
  7. درس هفتم: .
  8. درس هشتم: .
  9. درس نهم:

امروز ما به جستجوی خود برای تراشه کامل ساعت واقعی (RTC) ادامه خواهیم داد. ما ساعت هایی را بر اساس . صفحه نمایش برای توسعه راحت تر خواهد بود - یک صفحه نمایش LCD که تمام اطلاعات را به جز تنظیمات یکباره نمایش می دهد. در این فرم، ساعت برای استفاده به عنوان یک گزینه دسکتاپ راحت است.

بنابراین، بیایید به خود تراشه DS3231 نگاه کنیم. DS3231 یک ساعت بی‌درنگ با حرکت بسیار دقیق (سازندگان کلمه را انتخاب کردند) به لطف تشدید کننده کوارتز داخلی با جبران دما است. رابط انتقال داده I 2 C است. این ریزمدار یک ورودی برای ولتاژ باتری پشتیبان نیز دارد؛ هنگامی که برق اصلی قطع می شود، ریز مدار به طور خودکار از باتری پشتیبان به کار می رود، دقت کار از باتری پشتیبان نیست. متأثر، تحت تأثیر، دچار، مبتلا. خیلی خوشایند است، اینطور نیست؟ DS3231 از شمارش ثانیه ها، دقیقه ها، ساعت ها، روزهای ماه (تاریخ)، روزهای هفته، ماه ها و سال ها (شامل سال کبیسه برای ماه ها) پشتیبانی می کند. پشتیبانی از کار در قالب 12 و 24 ساعته. 2 ساعت زنگ دار با قابلیت پیکربندی و نظارت بر وضعیت آنها وجود دارد. تنظیم دقت جبران دما و همچنین دو خروجی - در 32 کیلوهرتز (خروجی 32.768 کیلوهرتز) و یک خروجی قابل برنامه ریزی از 1 هرتز تا 8.192 کیلوهرتز. همچنین یک پین تنظیم مجدد وجود دارد - RST. تراشه ساعت بلادرنگ در بسته بندی SO-16 موجود است. کیس کاملاً بزرگ است ، اما اگر در نظر بگیرید که قبلاً کوارتز در داخل وجود دارد و همچنین دما جبران می شود ، به نظر من همه چیز با ابعاد خوب است. DS3231 یک دوقلو به شکل DS3232 دارد که البته 2 پایه دیگر دارد. همه اینها بسیار یادآور محصولات NXP - تراشه های ساعت PCA2129 و PCF2129 است. تشدید کننده کوارتز داخلی با جبران دما مشابه، هر دو دوقلوهای یکسان فقط با تعداد متفاوت n.c هستند. پین ها و عملکردهای مشابه نسبت به DS3231 علاوه بر زمان سنجی.

RTC DS3231 به صورت ماژول هایی با سیم کشی لازم و همچنین کامل با تراشه EEPROM که اغلب مورد نیاز نیست برای فروش در دسترس است، فقط وزن را اضافه می کند:

بر روی برد ماژول علاوه بر قطعات لازم یک LED نیز تعبیه شده است که وظیفه آن نشان دادن اتصال برق به پایانه ها می باشد. آنها احتمالا آن را فقط برای زیبایی تحویل داده اند.

چیزی که هنگام کار با چنین تراشه ساعت بیدرنگ مهم است این است که چگونه داده ها را از آن استخراج کنید یا در آنجا بنویسید. ساعت دارای یک رابط I 2 C است. برای نوشتن داده ها (و این برای خواندن داده ها نیز ضروری است)، باید شرط شروع را بگذرانید (این دستورات با استفاده از سخت افزار یا نرم افزار I 2 C برای میکروکنترلر)، سپس آدرس تراشه را با رکورد بیت ارسال کنید، سپس آدرس رجیستری را که به آن دسترسی خواهیم داشت ارسال کنید و سپس یک بایت داده را به این ثبات منتقل کنید، اگر بایت دیگری از داده را منتقل کنید، این خواهد شد. به ثبت نام بعدی و غیره نوشته شده است. پس از اتمام، باید شرایط توقف را پشت سر بگذارید. نمایش گرافیکی موارد فوق در شکل:

ضبط داده برای راه اندازی اولیه و همچنین برای تنظیم زمان فعلی مورد نیاز است. در مرحله بعد، ما باید دائماً اطلاعات مربوط به زمان و تاریخ فعلی را دریافت کنیم. برای این کار لازم است از رجیسترهای ذخیره این اطلاعات خوانده شود. خواندن شامل دو روش است - تنظیم یک اشاره گر به ثبات مورد نظر و خواندن آن. برای تنظیم یک اشاره گر به رجیستر مورد نظر، باید شرط شروع را بگذرانید، سپس آدرس تراشه را با بیت نوشتن و یک بایت با آدرس ثبات ارسال کنید. بعد یا یک شرط توقف و سپس یک شرط شروع یا فقط یک راه اندازی مجدد است. اکنون روش دوم خواندن مستقیم از رجیسترها است. استارت ارسال می شود، سپس باید آدرس ریزمدار را با بیت خواندن ارسال کنید و سپس رجیسترها را به تعداد مورد نیاز بخوانید و پس از اتمام، شرط توقف را ارسال کنید. اگر اطلاعات رجیستر خوانده شده باشد، اشاره گر به طور خودکار به رجیستر بعدی بدون اعمال غیر ضروری از طرف میکروکنترلر (دستگاه اصلی) منتقل می شود. شکل هر آنچه در بالا در مورد خواندن ثبات ها با استفاده از رابط I 2 C گفته شد را نشان می دهد:

آدرس تراشه:

  • برای ضبط - 0b11010000
  • برای خواندن - 0b11010001

کد C به شکل زیر خواهد بود:

// توابع با ساعت ============================================ ================================================== ================== ======== // مقداردهی اولیه تنظیمات void RTC_init(void)(i2c_start_cond(); // شروع i2c i2c_send_byte(RTC_adr_write); // انتقال آدرس دستگاه، حالت ضبط i2c_send_byte(0x0E)؛ // انتقال آدرس حافظه i2c_send_byte(0b00100000)؛ // شروع تبدیل دما و خروجی با فرکانس 1 هرتز i2c_send_byte(0b00001000)؛ //kdztop32; // توقف i2c ) // دریافت زمان و تاریخ void RTC_read_time(void)( i2c_start_cond() ؛ // شروع i2c i2c_send_byte(RTC_adr_write)؛ // انتقال آدرس دستگاه، حالت نوشتن i2c_send_byte(0x00)؛ // انتقال آدرس حافظه i2c_stop_cond(); // توقف i2c i2c_start_cond(); // شروع i2c i2c_send_byte (RTC_adr_read)؛ / / آدرس دستگاه ارسال، حالت خواندن sec = bcd(i2c_get_byte(0))؛ // خواندن ثانیه، ACKi2 دقیقه = bc_d (0))؛ // دقیقه خواندن، ساعت ACK = bcd(i2c_get_byte(0))؛ / / ساعت خواندن، ACK wday = bcd(i2c_get_byte(0)); // خواندن روز هفته، روز ACK = bcd(i2c_get_byte(0)); // خواندن عدد، ماه ACK = bcd(i2c_get_byte(0)); // ماه خواندن، سال ACK = bcd(i2c_get_byte(1)); // سال خواندن، NACK i2c_stop_cond(); // stop i2c ) // تنظیم زمان void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_adr_write); // انتقال حالت iby2te_recording 0x00)؛ // انتقال آدرس حافظه i2c_send_byte(bin(sec1))؛ // 0x00 ثانیه (آیا توصیه می شود ثانیه ها را نیز مشخص کنید؟) i2c_send_byte(bin(min1))؛ // 0x01 دقیقه i2c_send_byte(bin(hour1)) ؛ // 0x02 clock i2c_stop_cond(); // stop i2c ) // تاریخ void را تنظیم کنید RTC_write_date(روز نویسه بدون امضا، روز کاراکتر بدون امضا، ماه کاراکتر بدون امضا، سال کاراکتر بدون امضا)( i2c_start_cond(); //cr/ // انتقال آدرس های دستگاه، حالت ضبط i2c_send_byte(0x03)؛ // انتقال آدرس حافظه i2c_send_byte(bin(wday))؛ // 0x03 روز هفته (یکشنبه - 1، دوشنبه 2، سه شنبه 3، چهارشنبه 4، پنج شنبه 5، جمعه 6، شنبه 7 ) i2c_send_byte(bin(day)); // 0x04 روز ماه i2c_send_byte(bin(ماه)); // 0x05 ماه i2c_send_byte(bin(سال)); // 0x06 سال i2c_stop_cond(); // توقف i2c ) // خواندن دمای خالی RTC_read_temper(void)( i2c_start_cond(); // شروع i2c i2c_send_byte(RTC_adr_write)؛ // انتقال آدرس دستگاه، حالت نوشتن i2c_send_byte(0x11)؛ // انتقال آدرس بالای حافظه icon_2c ()؛ // توقف i2c i2c_start_cond()؛ // شروع i2c i2c_send_byte (RTC_adr_read)؛ // آدرس دستگاه انتقال، حالت خواندن t1 = i2c_get_byte(0)؛ // خواندن دمای MSB t2 = i2c_get_byte (1)؛ // خواندن دمای LSB i2c_stop_cond ()؛ // توقف i2c t2=(t2/128)؛ // جابجایی با 6 - دقت 0.25 (2 بیت) // جابجایی با 7 - دقت 0.5 (1 بیت) t2=t2*5؛ )

این تمام کد منبعی است که برای کار با ریزمدار استفاده می شود؛ تنظیم سرعت ساعت تحت تأثیر قرار نگرفت، زیرا ساعت در چند روز یک ثانیه از دست نداده بود.

بله - یک ویژگی عالی DS3231 این است که همان تراشه عملکرد یک دماسنج (در غیر این صورت چگونه جبران دما را انجام می دهد) و توانایی خواندن دمای فعلی را انجام می دهد. حداکثر وضوح دما 0.25 درجه سانتیگراد است. همچنین، دوره به روز رسانی دما بسیار طولانی است - حدود 1 دقیقه. بله، نیازی به آپدیت سریع آن نداریم.

نمودار کل ساختار ساعت به شکل زیر است:

میکروکنترلر توسط Atmega8 به دلیل در دسترس بودن گسترده و قیمت پایین آن انتخاب شده است. این میکروکنترلر هم در پکیج DIP-28 و هم در نسخه SMD در پکیج TQFP-32 قابل استفاده است. مقاومت R3 برای جلوگیری از راه اندازی مجدد خود به خود میکروکنترلر در صورت ایجاد نویز تصادفی روی پین PC6 ضروری است. مقاومت R3 توان اضافه را به این پین می‌کشد و به طور قابل اعتمادی یک پتانسیل در سراسر آن ایجاد می‌کند. برای نمایش از صفحه نمایش کریستال مایع (LCD) استفاده می شود. من از صفحه نمایش 2004A استفاده کردم - 4 خط 20 کاراکتری برای زیبایی بیشتر است، بنابراین می توانید از یک صفحه نمایش آشناتر استفاده کنید - 2 خط 16 کاراکتری. صفحه نمایش LCD با استفاده از یک سیستم چهار بیتی به میکروکنترلر متصل می شود. مقاومت متغیر R2 برای تنظیم کنتراست کاراکترهای نمایشگر ضروری است. با چرخاندن نوار لغزنده این مقاومت، واضح ترین قرائت روی صفحه را برای خود به دست می آوریم. نور پس زمینه صفحه نمایش LCD از طریق پین های "A" و "K" روی صفحه نمایش سازماندهی می شود. نور پس زمینه از طریق یک مقاومت محدود کننده جریان - R1 روشن می شود. هرچه این مقدار بیشتر باشد، نور پس‌زمینه نمایشگر کم‌تر می‌شود. با این حال، برای جلوگیری از آسیب به نور پس زمینه، نباید از این مقاومت غافل شد. دکمه های S1 - S4 تنظیمات ساعت را کنترل می کنند. LED نشان می دهد که آلارم خاموش شده است. LED را می توان با نوعی مدار صوتی جایگزین کرد. مقاومت های R5 - R8 کششی هستند و برای تشکیل پالس های مستطیلی در پایانه های تراشه ساعت ضروری هستند. این نیز برای عملکرد صحیح پروتکل I2C ضروری است. برای تغذیه مدار، از یک تراشه تثبیت کننده خطی L7805 استفاده می شود؛ می توان آن را با یک آنالوگ داخلی تثبیت کننده خطی پنج ولتی KR142EN5A جایگزین کرد، یا می توانید از تراشه تثبیت کننده ولتاژ دیگری مطابق با اتصال آن در مدار استفاده کنید (به عنوان مثال، LM317 یا تثبیت کننده های سوئیچینگ LM2576، LM2596، MC34063 و غیره). سپس، 5 ولت توسط یک ریزمدار دیگر - AMS1117 در نسخه ای که خروجی 3.3 ولت می دهد، تثبیت می شود. تراشه ساعت، طبق اطلاعات برگه، با ولتاژ 3.3 ولت تغذیه می شود. با این حال، حداکثر ولتاژ 5.5 ولت است. بنابراین، این استابلایزر به صلاحدید شما قابل استفاده است یا خیر. تثبیت کننده ولتاژ AMS1117 را می توان با نسخه ADJ (AMS1117ADJ) نیز جایگزین کرد - یعنی یک نسخه قابل تنظیم، با این انتخاب باید ولتاژ مورد نیاز را تنظیم کنید.با استفاده از دو مقاومت متصل به ریز مدار مطابق با دیتاشیت آن.

مدار با استفاده از یک برد توسعه برای میکروکنترلر ATmega8 مونتاژ و رفع اشکال شد:

هدف از دکمه ها:

  • S1 - سیگنال هشدار را خاموش می کند یا از هر منوی تنظیمات به منوی اصلی خارج می شود
  • S2- ریست میکروکنترلر
  • S3 - زمان یا تاریخ را در منوی تنظیمات تغییر می دهد
  • S4 - وارد منوی تنظیمات شوید و در منو حرکت کنید

برای کنترل فرکانس کریستالی می توان از پین 32 کیلوهرتز استفاده کرد. یک فرکانس متر یا اسیلوسکوپ را به این پین وصل می کنیم و فرکانس را کنترل می کنیم:

همانطور که از تصویر اسیلوگرام مشاهده می شود، فرکانس تقریباً با 32.768 کیلوهرتز مطابقت دارد (تقریباً به دلیل محدودیت در وضوح اندازه گیری فرکانس، و تعیین دقیق "با چشم" دشوار است).

نتیجه یک ساعت با مشخصات زیر بود:

  • نشانه زمان
  • نمایش تاریخ
  • نشانه روز هفته
  • نشانگر فعالیت ساعت زنگ دار
  • 1 ساعت زنگ دار با سیگنال خروجی از میکروکنترلر
  • نشانگر دمای محیط (فقط دمای مثبت در نرم افزار پیاده سازی می شود؛ دمای منفی فکر می کنم برای ما فایده ای ندارد)
  • تنظیمات آلارم
  • تنظیمات زمان
  • تنظیمات تاریخ
  • صفحه نمایش LCD با نور پس زمینه
  • صرفه جویی در تنظیمات و ادامه ساعت هنگام خاموش شدن برق

بیایید خلاصه کنیم. تراشه ساعت در زمان واقعی DS3231 یک راه حل عالی است. دقت با برخی DS1307 یا بالاتر قابل مقایسه است ، اما PCA/PCF2129 هنوز هم می تواند با آن رقابت کند. در میان تراشه های ساعت واقعی که من بررسی کرده ام ، این نمونه در حال حاضر از نظر عملکرد و دقت در رده اول قرار دارد.

برای برنامه ریزی میکروکنترلر ATMEGA8 ، باید پیکربندی بیت های فیوز (تصویر گرفته شده در برنامه) را بدانید:

این مقاله با سیستم عامل میکروکنترلر Atmega8، طراحی مدار در برنامه، و همچنین ویدیویی از کارکرد ساعت همراه است (در همان ابتدا زنگ هشدار خاموش می شود - LED روشن می شود).

فهرست عناصر رادیویی

تعیین تایپ کنید فرقه تعداد توجه داشته باشیدخرید کنیددفترچه یادداشت من
IC1 MK AVR 8 بیتی

ATmega8

1 به دفترچه یادداشت
IC2 ساعت واقعی (RTC)

DS3231

1 به دفترچه یادداشت
VR1 تنظیم کننده خطی

L7805AB

1 به دفترچه یادداشت
VR2 تنظیم کننده خطی

AMS1117-3.3

1 به دفترچه یادداشت
VD1 دیود یکسو کننده

1N4148

1 به دفترچه یادداشت
C1 470 µF1 به دفترچه یادداشت
C2، C3، C5، C7 خازن100 nF4 به دفترچه یادداشت
C4 خازن الکترولیتی220 µF1 به دفترچه یادداشت
C6، C8 خازن الکترولیتی10 µF2 به دفترچه یادداشت
R1 مقاومت

22 اهم

1 به دفترچه یادداشت
R2 مقاومت تریمر10 کیلو اهم1 3296W-1-103LF

بسیاری از دستگاه ها نیاز به ثبت مداوم داده های زمان سنجی (تاریخ، زمان) دارند؛ این عملکرد توسط مدارهای الکترونیکی خاصی به نام ساعت های بلادرنگ انجام می شود. در حال حاضر، یک ساعت بیدرنگ به شکل یک ریزمدار مجزا اجرا می شود که باید یک تشدید کننده کوارتز و یک منبع تغذیه مستقل به آن اضافه کنید. در برخی از ریزگردها ، یک طنین انداز کوارتز در داخل ساخته شده است. یکی از این ساعت ها روی یک تراشه DS3231SN من برای خودم خریدمپروژه ها . در مثال من یک ساعت واقعی را به یک آنالوگ چینی وصل می کنمآردوینو UNO.

آنها یک ماژول کامل ZS-042 هستند که می توانند به دستگاه های مختلف و نه تنها به سکوی Arduino وصل شوند.


ماژول بر روی یک میکرو مدار ساخته شده است DS3231SN که در اصل یک ساعت واقعی است. برخلاف مدل قدیمی ساعت، به عنوان مثال در تراشه DS1307، این ساعت دارای یک تشدید کوارتز داخلی است که به دلیل آن ساعت دارای زمان دقیق است.

شما می توانید یک ساعت را در Arduino بدون DS3231SN پیاده سازی کنید ، اما در صورت از بین رفتن قدرت ، مقادیر تایمر تنظیم مجدد می شود.این ساعتهای مشابه دارای قدرت پشتیبان هستند ، بنابراین اگر قدرت از بین برود ، آنها همچنان به کار خود ادامه می دهند.

ساعت می تواند ساعت ، دقیقه ، ثانیه ، تاریخ ، ماهها ، سالها را بشمارد (سالهای جهش تا سال 2100 در نظر گرفته می شود). آنها در حالت 12 یا 24 ساعته کار می کنند، دارای دو ساعت زنگ دار هستند و همچنین دارای دماسنج داخلی با دامنه 40- تا 85+ درجه سانتیگراد هستند. برای اتصال به دستگاه های مختلف، ساعت از طریق متصل می شود.رابط I2C.


موقعیت مکانی و هدف پین در ماژول ZS-042:

S.Q.W.- خروجی سیگنال موج مربعی قابل برنامه ریزی

SCLاز طریق این پین ، داده ها از طریق رابط I2C با ساعت رد و بدل می شوند.

S.D.A.داده های ساعت از طریق این پین منتقل می شود.

VCCمنبع تغذیه برای ساعت زمان واقعی ، 5 ولت مورد نیاز است. اگر ولتاژی به این پین داده نشود، ساعت به حالت خواب می رود.

GND- زمین.

برای اتصال بهآردوینو UNO، پین SDA ساعت را به پین ​​A4 و پین SCL به A5 وصل می کنیم. پین های GND(-) و VCC(+5v) برای منبع تغذیه استفاده می شوند.

پین های SDA و SCL در بردهای مختلف آردوینو:

S.D.A. SCL
سازمان ملل متحد A4 A5
مینی A4 A5
نانو A4 A5
Mega2560 20 21
لئوناردو 2 3

بیایید یک باتری CR2032 را در ساعت نصب کنیم؛ چنین عناصری برای تغذیه بایوس در رایانه ها استفاده می شود.

هنگامی که کابل USB را به آردوینو وصل می کنید، LED روی ساعت باید روشن شود قدرت"(LED قرمز).

برای برنامه ریزی ساعت از طریق Arduino IDE، باید کتابخانه ها را نصب کنید.

دانلود کتابخانه زمان و DS1307RTC.

آخرین کتابخانه برای یک ساعت بر روی تراشه DS1307 نوشته شده است، اما پروتکل های تعامل آن با DS3231 سازگار است، بنابراین کتابخانه متناسب با ساعت ما خواهد بود.

کتابخانه ها باید دانلود شوند، بسته بندی شوند و در پوشه قرار گیرند.کتابخانه ها" هنگام راه اندازی Arduino IDE، آنها با مثال باید در " نمونه ها».

تاریخ و زمان را تنظیم کنید.

برای انجام این کار، این کد را در Arduino IDE کپی کنید.

برای تنظیمات صحیح باید داده ها را در خط تغییر دهید

setTime(13,35,0,22,12,2016);



در پرانتز، که با کاما از هم جدا شده اند، موارد صحیح را تنظیم کنید: ساعت، دقیقه، ثانیه، روز، ماه، سال. در مثال من، روی 13 ساعت و 35 دقیقه و 0 ثانیه، 22 دسامبر 2016 تنظیم شده است. طرح را در آردوینو آپلود کنید.

اکنون برای خواندن خوانش های ساعت می توانید از مثال استفاده کنید: فایل» - « نمونه ها» - « DS1307RTC» - « ReadTest" وپشت آن را در آردوینو آپلود کنید.

پنجره ای که باز می شود تاریخ و زمان فعلی را نمایش می دهد. اگر برق ماژول ساعت را از آردوینو خاموش کنید، آردوینو قادر به ردیابی مقادیر و پس از مدتی پیام " نخواهد بود. ... خطای خواندن!"(با رنگ قرمز مشخص شده است). پس از برقراری مجدد برق، تاریخ و زمان به شمارش معکوس ادامه خواهند داد. تاریخ و زمان بازنشانی نشد زیرا ساعت از باتری CR2032 تغذیه می کرد.