معماری

پروژه ساخت ساعت دیجیتالی با تایمر صفر

تو این پروژه قراره ساعت دیجیتالی که با دقت دهم ثانیه میشماره رو با هم پیاده کنیم.

برای اینکار ابتدا پروژه جدیدی باز کرده و وارد محیط کدویزارد شده و مطابق زیر عمل میکنیم.

چون تو این پروژه میخوام ساعتم دقت یک دهم ثانیه(۱۰۰ms) هم داشته باشه برای اینکار از فرمول گفته شده در جلسه تایمر/کانتر استفاده میکنم تا تعداد شمارش کلاک رو به دست بیارم.برای اینکار هم ۰٫۱رو به فرکانس کاری(۱۰۰۰۰۰۰/۱۰۲۴=۹۹۷Hz) ضرب و منهای یک میکنم که داریم:

(۰٫۱*۱۰۰۰۰۰۰)/۱۰۲۴-۱=۹۶٫۶۵

یعنی برای ایجاد یک دهم ثانیه باید تقریبن ۹۶تا کلاک بیاد و بعدش سرریز کنه و چون ما میخواییم وقتی مقدار ساعت به یک دهم (یعنی ۹۶)برسه دوباره صفر باشه(سرریز بشه) و یه واحد به رقم پر ارزش خود اضافه کنه درآنصورت باید  از مد CTC استفاده کنیم و مقدار Compare Value رو ۹۶قرار بدیم(که در اینجا این ۹۶رو باید به هگز تبدیل کنیم که هگز اون ۶۰میشه) که در نهایت باید تنظیمات زیر رو در قسمت کدویزارد ظاهر کنیم.

 

 

lcd alphanumeric

port پورت پایه پین

سورس sourcr code

#include "mega32.h"
#include "alcd.h"
#"include "stdio.h
char namayesh[30];
int ten=0,second=0,minute=0,hour=0;
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
ten++;
if(ten==10)
{
second++; ten=0;
if(second==60)
{
minute++;second=0;
if(minute==60)
{
hour++;minute=0;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main(void)
{
DDRA=0X00;
PORTA=0X00;
DDRB=0X00;
PORTB=0X00;
DDRC=0XFF;
PORTC=0X00;
DDRD=0X00;
PORTD=0X00;
   
TCCR0=0X0D;
TCNT0=0x00;
OCR0=0x60;
TIMSK=0X02;
   
lcd_init(16);
#asm("sei")
while (1)
{
sprintf(namayesh,"%02d:%02d:%02d:%d",hour,minute,second,ten);
lcd_gotoxy(0,0);
lcd_puts(namayesh);
}
خطوط ۱ تا ۳:

معرفی کتابخانه های مورد نیاز

خطوط ۴ و ۵:

تعریف متغیر های مورد نیاز

خطوط ۶ تا ۲۵:

تعریف وقفه ی تایمر صفر در حالت تطابق مقایسه

خطوط ۲۸ تا ۳۵:

تعیین ورودی و خروچی بودن پایه ها و پول آپ و تری ایستیت بودن هر کدام

خطوط ۳۷ تا ۴۰:

تنظیمات مربوط به فعال سازی تایمر صفر

خط ۳۷:

تو این خط مد CTC انتخاب شده و کلاک سیستم به ۱۰۲۴ تقسیم شده و استفاده از پایه ی خروجی OC0 غیرفعال شده اس.

خط ۳۸:

تو لین خط به رجیستر TCNT مقدار دهی اولیه صفر داده شده.

خط ۳۹:

این خط هم مقدار مقایسه (مقدار رجیستر OCR) رو نشون میده که برابر ۹۶ هستش.

خط ۴۰:

این دستور مقدار بیت OCIE0 رو یک میکنه که اگه این بیت یک باشه و هم چنین اگه وقفه ی همگانی فعال باشه(که تو خط ۴۳ فعال شده)،وقفه ی مربوط به مقایسه (یعنی خط ۶)رو اجرا میکنه.

خط ۴۶:

این دستور int رو به آرایه ی از کاراکتر تبدیل میکنه تا قابل چاپ روی LCD باشه.

خط ۴۷:

از این دستور با هدف پاک کردن LCD استفاده کردم چون که lcd_clear برای جلوگیری از پاک شدن لحظه ایی محتوای LCD استفاده کردم تا LCDچشمک نزنه.

خط ۴۸:

این دستور هم برای چاپ کردن ساعت روی LCD به کار برده شده.

 

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قالب وردپرس