خانه / AVR / ساعت دیجیتال روی سون سگمنت + قابلیت تنظیم
ساعت دیجیتال با سون سگمنت
ساعت دیجیتال با سون سگمنت

ساعت دیجیتال روی سون سگمنت + قابلیت تنظیم

آموزش ساخت ساعت دیجیتال با avr بر روی سون سگمنت :

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

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

در این پروژه قصد داریم توسط (RTC(Real Time Clock میکروکنترلر avr  با کامپایلر codevision یک ساعت دیجیتال بسازیم و آن را روی سون سگمنت به روش مولتی پلکس به نمایش در آوریم . در اکثر میکروکنترلرهای avr   ، تایمر دو می تواند به عنوان rtc عمل کند که در اینصورت کلاک مورد نیاز آن به صورت آسنکرون از طریق یک کریستال ساعت خارجی با فرکانس ۳۲٫۷۶۸KHZ تامین می گردد .

روش مولتی پلکس برای نمایش ساعت دیجیتال روی سون سگمنت:

برای نمایش اعداد در روش معمولی ما باید برای هر سون سگمنت یک پورت یا یک آی سی لچ به کار ببریم . اما در روش مولتی پلکس نیاز ما به سخت افزار به شدت کاهش می یابد . در روش نمایش به صورت مولتی پلکس تمامی سون سگمنت ها به صورت موازی به یکدیگر اتصال داده شده و یک دیتاباس را تشکیل می دهند . بنابراین تنها یک پورت از میکروکنترلر ما اشغال می شود .

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

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

تایمر دو در میکروکنترلر avr :

به طور کلی عملکرد تایمر دو مشابه عملکرد تایمر صفر در میکروکنترلر avr می باشد ؛  با  این تفاوت که نمی توان به عنوان کانتر از آن استفاده نمود ؛ اما  می توان با اتصال  یک  کریستال خارجی  ۳۲٫۷۶۸KHZ   به پایه های  ,TOCS1 TOCS2  از آن در وضعیت آسنکرون جهت rtc استفاده نمود . تایمر دو خود دارای یک prescaler   مجزا از بقیه  تایمرها  می باشد ؛ که  با  تقسیم  فرکانس  ایجاد  شده  توسط  کریستال ۳۲٫۷۶۸KHZ  بر ۱۲۸ می توان به زمان سرریز یک ثانیه که مناسب برای عملکرد ساعت است دست پیدا کرد .

پیکربندی تایمر دو توسط Codewizard :

بزرگترین مزیت کامپایلر codevision   نسبت به بقیه کامپایلرهایی که برنامه نویسی در محیط آنها به زبان c   می باشد وجود codewizard یا جادوگر می باشد . زیرا شما بدون نیاز به دانش زیاد از رجیسترهای میکرومنترلر avr می توانید تمامی بخش های سخت افزاری میکروکنترلر avr را به راحتی پیکربندی کنید . که در اینجا ما نیز می خواهیم تایمر دو را در مد آسنکرون توسط Codewizard پیکربندی کنیم .
ابتدا وارد محیط جادوگر شده سپس وارد زبانه Timer2  شوید و clock source  را از system clock  به TOSC1 pin تغییر دهید که در اینصورت کلاک تایمر دو جدا از کلاک سیستم و به صورت آسنکرون از روی پایه های  TOSC1 , TOSC2 تامین می گردد .

ساعت دیجیتال با avr
ساعت دیجیتال با avr

حال باید مقدار clock value را روی PCK2/128  قرار دهیم .که در صورت استفاده از کریستال ۳۲٫۷۶۸ کیلو هرتز روی پایه های TOSC1,TOSC2  می توان به سرریز یک ثانیه دست پیدا کرد و تایمر دو را به rtc یا ساعت زمان واقعی تبدیل کرد و با انتخاب تیک  overflow interrupt می توان وقفه تایمر دو را فعال کرد که پس از سر ریز یک ثانیه وقفه اتفاق می افتد .

ساعت دیجیتال با avr
ساعت دیجیتال با avr

شرح سخت افزار :
در این مدار atmega8 هسته اصلی می باشد و وظیفه تمامی محاسبات را بر عهده دارد . ۷۴HC245 آی سی بافر است و نقش ایزوله کردن  و تقویت جریان را دارد  ،  البته خروجیهای  AVR  توانایی روشن کردن LED را به صورت مستقیم دارند اما در صورت استفاده از سون سگمنت در ابعاد بزرگتر باید از  بافر استفاده شود . مقاومتهای   ۲۲۰ اهم برای محافظت از سون سگمنتها در برابر اضافه جریان قرار داده شده است . کریستال ۳۲٫۷۶۸ khz   کلاک تایمر دو  را  بصورت آسنکرون برای رسیدن به سرریز  یک  ثانیه  تامین می کند و کلاک اصلی برنامه توسط نوسانساز  RC  داخلی که روی  ۸Mhz  قرار داده شده  تامین می گردد.

برای نمایش اعداد از یک سون سگمنت شش تایی از نوع کاتد مشترک استفاده شده است . همچنین برای کاهش سخت افزار می توان از قسمت نمایش ثانیه صرف نظر کرده و از یک سون سگمنت چهارتایی استفاده نمود .

برای نمایش ساعت نیاز است که اعداد به کد معادل برای سون سگمنت تبدیل شوند به این منظور آی سی های  دیکودر  BCD TO 7S  با نام های ۷۴۴۸ برای سون سگمنت های کاتد مشترک و ۷۴۴۷  برای سون سگمنت های آند مشترک بکار برده می شود ، برای کاهش سخت افزار به صورت نرم افزاری کدهای معادل برای سون سگمنت را تبدیل کرده ایم  و دیگر  نیازی  به  استفاده از  آی سی های دیکودر نمی باشد . برای تنظیم کردن مقادیر ساعت  از سه سوئیچ استفاده شده است .

ساعت دیجیتال با avr
ساعت دیجیتال با avr

شرح نرم افزار :
به طور کلی برنامه از چهار قسمت اصلی تشکیل شده :

 تابع main که پیکره اصلی برنامه است .
زیربرنامه وقفه تایمر دو که هر ثانیه یک بار اتفاق می افتد .
تابع set_time که وظیفه کلید خوانی و تنظیم مقادیر ثانیه ، دقیقه و ساعت را بر عهده دارد .
تابع display که وظیفه نمایش و اسکن اعداد را بر عهده دارد .

 

زیر برنامه تابع set_time  :

در این قسمت زیر برنامه تابع set_time   قرار دارد که عمل کلیدخوانی در آن صورت می پذیرد و شامل سه بخش اصلی می شود :
۱٫ فشرده شدن کلید set  که با هر بار فشرده شدن هر کدام از قسمتهای ثانیه ، دقیقه یا ساعت را قابل تنظیم می کند .
۲٫فشرده شدن کلید  up   در صورتی عمل می کند که قبل از آن توسط کلید set یکی از قسمتهای ثانیه ، دقیقه یا ساعت را انتخاب کرده باشیم و با هر بار فشرده شدن یک واحد به مقادیر ثانیه ، دقیقه یا ساعت می افزاید .
۳٫ فشرده شدن کلید  down   در صورتی عمل می کند که قبل از آن توسط کلید set یکی از قسمتهای ثانیه ، دقیقه یا ساعت را انتخاب کرده باشیم و با هر بار فشرده شدن یک واحد از مقادیر ثانیه ، دقیقه یا ساعت می کاهد .

زیر برنامه تابع display  :

در این قسمت ، زیر برنامه تابع display  قرار دارد که وظیفه آن نمایش اعداد ثانیه ، دقیقه و ساعت بر روی سون سگمنت است . در آن سعی شده تمامی دستورات مربوط به نمایش هر عدد در یک خط نوشته شود تا به خوانایی و سادگی  برنامه بیافزاید .

در اینجا برای نمایش هر یک از اعداد ثانیه ، دقیقه و ساعت نیاز است که قسمتهای یکان و دهگان هر عدد بصورت مجزا از یکدیگر تفکیک شوند که جهت این امر از الگوریتمی بسیار ساده استفاده شده به عنوان مثال اگر مقدار ساعت برابر با عدد۲۳   باشد  برای جدا کردن رقم دهگان آن کافی است تا عدد ۲۳ را توسط عملگر /    بر عدد ۱۰  تقسیم کنیم  ۲۳ /۱۰=۲٫۳   و چون متغییر hour از نوع flout تعریف نشده فقط مقدار صحیح آن که عدد  ۲  باشد برگردانده می شود .

برای جدا کردن رقم یکان  کافی است تا عدد ۲۳  را  توسط عملگر % بر عدد ۱۰   تقسیم کنیم  ۲۳%۱۰=۲٫۳  که در اینصورت فقط مقدار باقیمانده تقسیم که عدد ۳ است برگردانده می شود و اعداد حاصل از تقسیم به عنوان عدد آرایه cathode_seg  به کاربرده می شوند به این دستور data_port=cathode_seg [hour/10]  دقت کنید .  با توجه به مثال فوق خواهیم داشت  data_port=cathode_seg [2]  و این دستور دومین عدد از آرایه cathode_seg را که کد عدد دو (۰X5B)  برای سون سگمنت است به data_port   ارسال می کند .

در ادامه برای نمایش عدد ۲  بر روی سون سگمنت  باید توسط دستور comm_port=0b11111110  سون سگمنت متناظر با رقم دهگان ساعت روشن شود و توسط دستور  delay_ms(4) برای مدت چهار میلی ثانیه عدد ۲ روی سون سگمنت نمایش داده می شود . در نهایت توسط دستور comm_port=0xff سون سگمنت خاموش شده و آماده نمایش عدد بعد می شود .

اگر ما توسط دستور comm_port=0xff  سون سگمنت را خاموش نکنیم و عدد بعد را ارسال کنیم چون هنوز comm_port   ما برای نمایش عدد قبلی روشن است برای لحظات کوتاهی عدد جدید را نشان خواهد داد و در عمل باعث می شود یک سایه از عدد قبل را بر روی سون سگمنتها داشته باشیم ؛ که این امر هنگام شبیه سازی در نرم افزار  پروتئوس مشهود  نمی باشد.
حلقه for   در زیر برنامه display روی نمایش اعداد بی تاثیر است و برای ایجاد یک تاخیر در عمل کلید خوانی بکار برده شده اگر این تاخیر ایجاد نشود چون زیر برنامه های set_time و   display  به صورت مداوم و با سرعت بالایی در حال اجرا هستند وقتی ما کلیدی را بفشاریم تا زمانی که کلید را رها کنیم چندین بار زیر برنامه set_time   اجرا می شود و کنترل دقیقی روی تنظیم مقادیر ساعت را نخواهیم داشت به همین منظور می توان با مقدار دهی متغییر  i  در حلقه  for  میزان تاخیر در کلید خوانی را تغییر داد .

رمز فایل : www.avr-city.ir
حجم فایل : 2 مگا بایت
محیط برنامه نویسی : Codevision AVR
نویسنده : حسین غیاثوند
تاریخ انتشار: 1396-12-18
لینک دانلود :
[ برای دریافت فایل وارد شوید و یا ثبت نام کنید! ]

در این مقاله خواهید آموخت :
.عملکرد روش مولتی پلکس
.عملکرد تایمر دو
.پیکربندی تایمر دو توسط جادوگر
.شرح سخت افزار
.شرح نرم افزار به صورت خط به خط
.تنظیم ساعت توسط سوئیچ
.تنظیم ساعت توسط کیپد ۴*۴
.عملکرد روش wakeup در کلید خوانی
.فایل شبیه سازی شده با پروتئوس
.سورس کد برای سون سگمنت آند مشترک و کاتد مشترک
.سورس کد برای سون سگمنت 4 رقم و 6 رقم

اشتراک گذاری :

19 نظر

  1. سلام من همین مدارو بستم مدارش خوبه کار میکنه ولی سون سگمنت چشمک میزنه و میشماره مشکل از چی میتونه باشه؟

    • سلام
      مشکل شما بخاطر سرعت رفرش پایین هست ، مقدار تاخیر delay_ms(4) در تابع display را کاهش دهید ، تا بدون پرش مقادیر نمایش داده بشوند.

  2. **سلام و عرض ادب بابت سایت عالیتون**

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

    • سلام و تشکر
      احتمالا تایمر دو که وظیفه سرریز یک ثانیه و شمارش ساعت را بر عهده دارد ، درست عمل نمی کند . توجه داشته باشید در این پروژه منبع کلاک cpu از نوسانساز rc داخلی تامین شده و منبع کلاک تایمر دو به یک کریستال ساعت جداگانه با فرکانس ۳۲۷۶۸ هرتز متصل شده است .

      • یعنی به نظرتون کریستال خارجی درست اتصال نداره؟؟
        من از قسمت ثانیش صرف نظر کردم،و وقتی ساعت وصل میشه نقطه های نشان ثانیه دقیقه ای یک بار خاموش و روشن میشه،و رقم دقیقه ساعتی یکی بهش اضافه میشه،رقم ساعتم که اصلا شمارش نداره،
        مشکلش از زمان کلاک ۲/۱۲۸
        میتونه باشه؟؟
        اگه هست چطوری تو کد هایی که زحمت کشیدید قرار دادید،میشه تغییرش داد؟

        باز هم ممنون به خاطر سایت خوبتون و زحمات شما.

  3. مقادیر رجیستر تایمر برای سرریز یک ثانیه بر اساس فرکانس داخلی ۸ مگا هرتز تنظیم شده ، اگر فرکانس دیگری انتخاب کنید ، زمانبندی ساعت درست عمل نخواهد کرد .
    از طریق فیوزبیت ها مقدار فرکانس داخلی را بر روی ۸ مگا هرتز قرار دهید .
    برای راهنمایی بهتر ، لطفا با ای دی تلگرام اینجانب ارتباط برقرار کنید .
    @avrcity

  4. سلام
    با تشکر از سایت خوبتون و مطالب عالیش
    میخواستم ببینم چطور میشه سون سگمنت چهارتایی رو تهیه کرد
    ممنون

    • سلام
      همه فروشگاه های قطعات الکترونیکی دارند ، با نام سون سگمنت چهار دیجیت ، فقط به آند مشترک یا کاتد مشترک توجه کنید .

  5. سلام
    میخواستم بدونم برای نمایش ثانیه و دقیقه رو سون سگمنت چهار دیجیت باید کدوم بخش‌ کد رو عوض کنم؟

    • سلام
      معمولا در ساعت های دیجیتال قسمت نمایش ثانیه صرف نظر میشه . در برنامه سه متغییر با نام های secend , minute , hour تعریف شده که هر کدام بیانگر ثانیه و دقیقه و ساعت می باشند . برای حذف هر قسمت کافیه تمامی مقادیر و شرط هایی که در طول برنامه به هر کدام نسبت داده شده پاک کنید .

      • ببخشيد اگه كد رو كلا عوض نكنم ولي روي مدار سون سگمنت چهار ديجيت ببندم ممكنه كار كنه؟

  6. بله ، حتی اگر سون سگمنت چهار دیجیت استفاده کنید ، عملکرد مدار صحیح خواهد بود . داخل فایل pdf پیوست شده ، عملکرد مدار و هر بخش به صورت کامل تشریح شده . اگر این موضوع برای شما سخته به تلگرام من @avrcity پیغام بدید تا برنامه را برای شما تغییر بدم .

    • ببخشید این آدرسی که نوشتین کانال تلگرامیتونه من نتونستم اونجا پیام بدم میشه لطفا بگین برای این ک برنامه رو آند مشترک بنویسیم باید کجاهارو نات کنیم؟

      • ببخشید تصحیح میکنم ، آدرس @avr_city هست ، برای تغییر سون سگمنتها به آند مشترک باید مقاذدیر آرایه cathod_seg و comm_port نات شوند .

  7. سلام
    شما دارید میگید کریستال داخلی روی هشت مگاهرتز تنظیم کنید از اونور دارید میگید که کریستال خارجی بهش وصل کنید(کریستال ساعت) .این دوتا همزمان چجوری ممکنه؟!؟ میشه این دوگانگی و تناقض رو توضیح بدید؟!

    • سلام
      منبع کلاک اصلی میکرو ،توسط اسیلاتور rc داخلی بر روی 8 مگا هرتز قرار داده شده ، که وظیفه تعمین کلاک cpu و دیگر بخش های میکرو را بر عهده دارد ، و اما طبق توضیحاتی که در آموزش داده شد ، منبع کلاک تایمر دو را به صورت آسنکرون یا غیر همزمان تنظیم کردیم ، بنابراین کلاک تایمر دو دیگر از طریق اسیلاتور داخلی 8 مگا هرتز تعمین نمی شود و برای تعمین کلاک تایمر دو از یک کریستال خارجی 32768 هرتز استفاده شده .

      • ممنون از پاسختون. پس یعنی نیازی نیست من فیوزبیتهای cksell رو تغییر بدم؟!

  8. فیوزبیتها را برای اسیلاتور rc داخلی 8 مگا هرتز تنظیم کنید .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.