معماری

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

 

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

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

 

 

 

تو این پروژه میخاستم که کمی بیشتر از ۶میلی ثانیه عدد رو نشون بده و بعد عدد رو یه واحد زیاد کنه که باتوجه به اینکه کلاک سیستم یه مگ بوده،من از مقسم۱۰۲۴ استفاده میکنم که فرکانس کاری میکرو ۹۷۷ هرتز بوده که از طریق محاسبات تعداد تقریبی شمارش رو بدست میارییم که داریم:

۰٫۰۰۶ s*977 Hz-1=4.862

همونطور که مشاهده میکنین تعداد شمارش ۴٫۸۶۲ بدست اومد که به ۵ رند میکنیم یعنی ۵ تا کلاک باید بیاید تا ۶میلی ثانیه طول بکشد.

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

پس TCNT0=250 که برای مقداردهی به این رجیستر از Timer Value  استفاده میکنیم ولی به هگز مینویسیم که هگز ۲۵۰ میشه 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; 
               }
            
      }
}

 

خطوط ۱ تا ۴:

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

خطوط ۸ تا ۱۲:

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

خط ۸ و ۹:

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

خطوط ۱۴ تا ۲۹:

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

خطوط ۳۳ تا ۴۳:

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

خط ۴۴:

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

خط ۴۵ و ۴۶:

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

خط ۴۷:

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

خط ۴۹:

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

خطوط ۵۹ تا ۷۰:

این دستورات برای جداسازی ارقام key هستش که رقم یکان عدد key رو در[۰]m و رقم دهگان رو در  [۱]mو رقم صدگان رو در [۲]mو رقم هزارگان رو در [۴]m ذخیره میکنه که بعدن توسط تابع namayesh  برای چاپ به سون سگمنت ارسال میکنه.

خطوط ۷۲ تا ۷۶:

دستورات موجود در این خطوط برای نمایش رقم یکان در پلکس اول مالتی پلکس به کار برده شدند که تو خط ۷۲ ابتدا آند فعال شده و تو خط  ۷۳ کاتد مقدار گرفته و تو خط ۷۴ به مدت ۵میلی ثانیه همین روندو ادامه داده و تو خط ۸۲ کاتد رو غیرفعال و تو خط ۸۳ آند رو غیر فعال کرده.

خطوط ۸۵ تا ۹۲:

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

خطوط ۹۳ تا ۱۰۰:

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

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

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

قالب وردپرس