پروژه شمارنده چهار رقمی با تایمرصفر(7seg)

 

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

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

 

 

 

تو این پروژه میخاستم که کمی بیشتر از 6میلی ثانیه عدد رو نشون بده و بعد عدد رو یه واحد زیاد کنه که باتوجه به اینکه کلاک سیستم یه مگ بوده،من از مقسم1024 استفاده میکنم که فرکانس کاری میکرو 977 هرتز بوده که از طریق محاسبات تعداد تقریبی شمارش رو بدست میارییم که داریم:

0.006 s*977 Hz-1=4.862

همونطور که مشاهده میکنین تعداد شمارش 4.862 بدست اومد که به 5 رند میکنیم یعنی 5 تا کلاک باید بیاید تا 6میلی ثانیه طول بکشد.

برای اینکار هم من مد Normal رو استفاده میکنم  و مقدار اولیه رجیستر TCNT0 رو برابر 250 قرار میدم تا وقتی 5واحد بیشتر شد و سریز شد بتونم از وقفه اورفلو استفاده کنم.(البته به جای اینکار میتونستیم از مد CTC استفاده کنیم و مقدار TCNT0رو صفر و مقدار رجیستر OCR0 رو 5در نظر بگیریم و هر وقت این دو تا رجیستر باهم برابر شدن در اونصورت وقفه تطابق مقایسه رخ بده)

پس TCNT0=250 که برای مقداردهی به این رجیستر از Timer Value  استفاده میکنیم ولی به هگز مینویسیم که هگز 250 میشه FA.

تو شکل پایین هم،جهت پایه های که به مالتی پلکس وصلن رو مشخص میکنیم.

 


#include <mega32.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>

int key=0,p;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xFA;
key++;
}

void namayesh(int n)
{
switch(n)
{
case 0:PORTC=0b11000000;break;
case 1:PORTC=0b11111001;break;
case 2:PORTC=0b10100100;break;
case 3:PORTC=0b10110000;break;
case 4:PORTC=0b10011001;break;
case 5:PORTC=0b10010010;break;
case 6:PORTC=0b10000010;break;
case 7:PORTC=0b11111000;break;
case 8:PORTC=0b10000000;break;
case 9:PORTC=0b10010000;break;
}
}

void main(void)
{
int i;
char m[4];
DDRA=0x00;
PORTA=0x00;
DDRB=0x00;
PORTB=0x00;
DDRC=0xFF;
PORTC=0x00;
DDRD=0xFF;
PORTD=0x00;

TCCR0=0x05;
TCNT0=0xFA;
OCR0=0x00;
TIMSK=0x01;

#asm("sei")

PORTD=0X00;

while (1)
{
p=key;
for (i=0;;i++)
{
if(p<10)
{
m[i]=p;
break;
}
else
{
m[i]=p%10;
p=p/10;
}
}
PORTD.3=1;
namayesh(m[0]);
delay_ms (5);
PORTC=0b11111111;
PORTD.3=0;
if(key>9)
{
PORTD.2=1;
namayesh(m[1]);
delay_ms (5);
PORTC=0b11111111;
PORTD.2=0;
}
else if (key>99)
{
PORTD.1=1;
namayesh(m[2]);
delay_ms (5);
PORTC=0b11111111;
PORTD.1=0;
}
else if(key>999)
{
PORTD.0=1;
namayesh(m[3]);
delay_ms (5);
PORTC=0b11111111;
PORTD.0=0;
}

}
}

 

خطوط 1 تا 4:

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

خطوط 8 تا 12:

تعریف تایمر صفر که در زمان اورفلو  این وقفه اجرا میشه.

خط 8 و 9:

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

خطوط 14 تا 29:

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

خطوط 33 تا 43:

این خطوط برای تنظیم پایه های ورودی و خروجی میکرو به کار برده شده که توسط کدویزارد تنظیمش کردیم.

خط 44:

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

خط 45 و 46:

تو این خطوط  به رجیستر مقدار TCNT0=250 و به رجیستر مقدار OCR0=0 داده شده

خط 47:

این دستور بیت TOIE0 رو یک میکنه که اگه وقفه همگانی هم فعال باشه،این دستور وقفه تایمر صفر رو در زمان اورفلو اجرا میکنه..

خط 49:

فعال سازی وقفه همگانی

خطوط 59 تا 70:

این دستورات برای جداسازی ارقام key هستش که رقم یکان عدد key رو در[0]m و رقم دهگان رو در  [1]mو رقم صدگان رو در [2]mو رقم هزارگان رو در [4]m ذخیره میکنه که بعدن توسط تابع namayesh  برای چاپ به سون سگمنت ارسال میکنه.

خطوط 72 تا 76:

دستورات موجود در این خطوط برای نمایش رقم یکان در پلکس اول مالتی پلکس به کار برده شدند که تو خط 72 ابتدا آند فعال شده و تو خط  73 کاتد مقدار گرفته و تو خط 74 به مدت 5میلی ثانیه همین روندو ادامه داده و تو خط 82 کاتد رو غیرفعال و تو خط 83 آند رو غیر فعال کرده.

خطوط 85 تا 92:

این دستورات برای نمایش رقم دوم تو پلکس دوم به کاربرده شدن

خطوط 93 تا 100:

این دستورات برای نمایش رقم سوم تو پلکس سوم به کاربرده شدن


توسط

برچسب‌ها:

دیدگاه‌ها

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

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