آی پی امداد
abtahi

مدارهای ساده با اتمل استادیو

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
سلام
در این تایپیک قصد دارم مدارات ساده را با اتمل استادیو را ارسال کنم این پست ها بیشتر جنبه آموزشی داره و در حد توان خودم دوست دارم اطلاعاتی ناچیزم رو به اشتراک بگذارم و اگه دوستان لطف کنند تجربیات خودم رو هم افزایش بدم
اولین مدار نمایش اعداد روی seven segment
بعد از باز کردن اتمل استادیو جهت ایجاد پروژه جدید گزینه new project را انتخاب می‌کنیم:
در صفحه دوم گزینه GCC C Executable project را انتخاب کرده و در کادر پایین نام دلخواه خود را می نویسیم
در صفحه سوم میکرو مورد نظر را انتخاب میکنیم ما در این مدار از اتمگا 8 استفاده کردیم شپس محیط برنامه نویسی باز شده که برنامه را در ان تایپ میکنیم

/*
* 7segment.c
*
* Created: 02/17/2025 03:00:15 ب.ظ
* Author : brv
*/



#include <avr/io.h>
#include <util/delay.h> // کتابخانه تاخیر زمانی
#define F_CPU 8000000UL // تنظیم کریستال
#define SegOne 0xFE//پین شماره 1 صفر شود
#define SegTwo 0xFD//پین شماره 2 صفر شود
#define SegThree 0xFB//پین شماره 3 صفر شود
#define SegFour 0xF7//پین شماره 4 صفر شود



int main() {
char seg_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//کد نمایش عددها در نمایشگر 7 قطعه
int num,i,num1;

/* تنظیم پورت خروجی */
DDRB = 0x0F; // پین 0تا 3
DDRD = 0xff; // کنترل 7 قطعه ای

while (1)
{
for (num = 0x00; num <= 9999; num++) // نمایش 0 تا 9999
{if (num==9999){num=0;}
for (i = 0; i < 100; i++)// نمایش هر عدد به مدت 400 میلی ثانیه 100 ضرب در4
{
num1 = num/1000;// نمایش هزارگان


PORTB = SegOne;
PORTD = seg_code[num1];
_delay_ms(1);// تاخیر یک میلی ثانیه

num1=(num%1000) ;
num1=num1/100;//نمایش صدگان
PORTB = SegTwo;
PORTD = seg_code[num1];
_delay_ms(1);// تاخیر یک میلی ثانیه

num1 =(num%100);// نمایش دهگان
num1=num1/10;
PORTB = SegThree;
PORTD = seg_code[num1];
_delay_ms(1);// تاخیر یک میلی ثانیه

num1= num%10;// نمایش یکان
PORTB = SegFour;
PORTD = seg_code[num1];
_delay_ms(1);// تاخیر یک میلی ثانیه

}
}
}
}
 

پیوست‌ها

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
1 برای تنظیم پایه های میکرو به عنوان خروی یا ورودی از دستور DDR +پورت مورد نظر استفاده میکنیم
مثال DDRB=0xFF; تمام پایه های پورت B به عنوان خروجی تعریف شده است
یا به صورت باینری به صورت DDRB= 0b0011011; پایه های 0 و 1 و 3و 4 خروجی و بقیه ورودی تعریف شده است
برای صفر و یک کردن پایه ها از دستور port استفاده میشود مثل
PORTB=0b00001011; یا PORTB=0x0B;

برای الحاق کتابخانه از فرمان #include استفاده می شود مانند
#include <util/delay.h>

برای تعریف ثوابت از دستور define# به صورت زیر عمل می شود :

#define SegOne 0xFE مانند #define مقدار نام ثابت
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
seven segment چیست
نمایشگر سون سگمنت، از هفت LED تشکیل شده هر یک از این LEDها یک قسمت یا سگمنت نامیده می‌شوند، زیرا وقتی هر یک از آن‌ها روشن می‌شود، بخشی از یک عدد یا حرف را روشن می‌کند. گاهی اوقات یک LED هشتم نیز در سون سگمنت وجود دارد که نقطه دسیمال (DP) را مشخص می‌کند. واضح است که این نقطه وقتی کاربرد دارد که دو سون سگمنت در کنار یکدیگر قرار گیرند.همان‌طور که در شکل زیر مشاهده می‌کنید اگر هرکدام از این هفت قسمت را با حروف a b c d e f g در جهت عقربه‌های ساعت نام‌گذاری کنیم، آنگاه مثلاً برای نمایش عدد"۱" کافیست که فقط حرفهای b وc روشن بشوند: سون سگمنت ها به دو صورت اند مشترک و کاتد مشترک ساخته میشوند
articles-segment1.gif
articles-segment2.gif

کدنمایش اعداد در نمایشگر اند مشترک
Numberg f e d c b aHex code
01000000C0
11111001F9
20100100A4
30110000B0
4001100199
5001001092
6000001082
71111000F8
8000000080
9001000090
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
کد نمایش اعداد در نمایشگر کاتد مشرک
Numberg f e d c b aHex Code
001111113F
1000011006
210110115B
310011114F
4110011066
511011016D
611111017D
7000011107
811111117F
910011114F

برای راحتی کار ما اعداد را در یک آرایه تعریف می کنیم و بعد در هرکجای برنامه بخواهیم از آن استفاده می کنیم
کد برای نمایشگر کاتد مشترک char cathode_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
کد برای نمایشگر اند مشترک
char seg_code[]={0xFA,0x82,0xD9,0xCB,0xA3,0x6B,0x7B,0xC2,0xFB,0xEB};
برای نمایش عدد 7 کد زیر را می نویسیم
PORTD = seg_code[7];
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
در صورتی که بخواهیم عدد چند رقمی نمایش دهیم، می توانیم چند نمایشگر هفت قسمتی تکی را در کنار هم بچینیم. ولی با توجه به این که هر کدام از آنها دارای تعدادی پایه هستند، حجم سیم کشی مدار زیاد می شود. فرض کنید بخواهیم به جای استفاده از سون سگمنت 4 تایی از چهار تا تکی استفاده کنیم. در این صورت فقط برای پایه های a تا g، در مجموع تعداد 28 پین وجود خواهد داشت. پس استفاده از انواع چند رقمی که به آنها سون سگمنت مالتی پلکس نیز می گویند، بهتر است. در این روش از خطای دید استفاده میشود در این نوع پایه های a تا g ارقام به صورت داخلی به همنام خود متصل اند. پایه های مشترک هر رقم نیز به صورت جداگانه بیرون کشیده شده است. بنابراین برای راه اندازی، باید در یک لحظه یک رقم فعال و عدد آن رقم برای مدتی نمایش داده شود. در لحظۀ بعد، باید رقم بعدی فعال و عدد مربوط به آن نمایش داده شود. یعنی در هر لحظه تنها یک رقم فعال می شود و عدد مربوط به آن نمایش داده می شود. در این لحظه باید رقم های دیگر خاموش باشند.در این صورت چشم قادر به تشخیص روشن و خاموش شدن نمایشگر نخواهد شد و عدد را به صورت پیوسته مشاهده خواهد کرد
4digit7segment-display-1-300x137.jpg
4-digit-7-segment-LED-display-pinout.png
4digit7segment-768x185.jpg
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
معرفی متغیرها در زبان c
متغیرها میتواند به ورت محلی یا سراسری تعریف شوند
متغیر محلی داخل تابع تعریف می شوند و فقط داخل همان تابع اعتبار دارند
متغیرهای سراسری در اول برنامه تعریف میشود و در تمام توابع اعتبار دارند
برای تعریف متغیر ابتدا نوع و بعد نام آن را مینویسیم
int num; یا char name ;
قوانین نامگذاری
  1. برای نام گذاری متغیرها در زبان C می توانیم ازترکیب حروف انگلیسی بزرگ و کوچک یعنی A تا Z و A تا Z و اعداد و همچنین آندرلاین (_) استفاده کنیم؛
  2. نام متغیر نمی تواند با عدد شروع شود؛
  3. حداکثر طول نام متغیرها 31 کاراکتر است؛
  4. نام متغیرها نباید از کلمات رزرو شده باشد؛
  5. میتوان هنگام تعریف متغیر به آن مقدار داد
  6. int num =0;


  7. نوع دادهاندازه حافضهمحدوده
    char1 byte−128 تا 127
    signed char1 byte−128 تا 127
    unsigned char1 byte0 تا 255
    short2 byte−32,768 تا 32,767
    signed short2 byte−32,768 تا 32,767
    unsigned short2 byte0 تا 65,535
    int2 byte−32,768 تا 32,767
    signed int2 byte−32,768 تا 32,767
    unsigned int2 byte0 تا 65,535
    short int2 byte−32,768 تا 32,767
    signed short int2 byte−32,768 تا 32,767
    unsigned short int2 byte0 تا 65,535
    long int4 byte-2,147,483,648 تا 2,147,483,647
    signed long int4 byte-2,147,483,648 تا 2,147,483,647
    unsigned long int4 byte0 تا 4,294,967,295
    float


    4 byte

    مقدار دهی به متغیر



  8. نام متغیر = مقدار متغییر
  9. num =10; یا num =num+1; یا num++; که مقدار num را یک واحد افزایش میدهد
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
حلقه for در زبان c
حلقه for به صورت زیر تعریف می شود
for ( مقدار افزایش یا کاهش ; شرط حلقه ; مقدار اولیه
){ دستورات }
for (int =0; i<10;i++){ PORTB=0b;}
در حلقه بالا ابتدا مقدار i را ۰ در نظر گرفته و گفته تا زمانی که i کمتر از 10 هست حلقه را ادامه بده پ و با هر ارای حلقه i را یک واحد افزایش بده
 
  • Like
واکنش‌ها[ی پسندها]: jfrras

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
حلقه while در زبان c
while ( شرط حلقه){ دستورات }
while(a<10){a++;}
برای حلقه بی نهایت از دستور زیر استفاده میکنیم
while(1){ دستورات}
برای خروج از حلقه می توان از دستور break; استفاده کرد
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
دستور شرطی if
if ( دستور شرطی){ دستورات در صورت صحیح بودن شرط}
else { دستورات در صورت درست نبودن شرط}
if (i==1){portb=ox0}
else {portb=0x00;}
ابتدا دستور شرطی چک میشود اگر دستور درست بود دستور داخل پرانتز را انجام می دهد در غیر این ورت دستور else را انجام میدهد
 

mohammadmoha

کاربران vip(افتخاری)
کاربر
2011-02-19
89
123
رجیسترهای تایمر صفر در اتمگا 8

رجیستر Timer Interrupt Mask)TIMSK


BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1-TOIE0

Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable​

toie0 جهت فعال سازی وقفه تایمر کانتر صفر(باید وقفه همگانی فعال باشد با دستور sei();
رجیستر TIFR

BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
OCF2TOV2ICF1OCF1AOCF1BTOV1-TOV0

Bit 0 – TOV0: Timer/Counter0 Overflow Flag​

با اتفاق افتادن وقفۀ سرریز تایمر صفر، این پرچم 1 می شود.
  • TCNT0 (Timer/Counter 0)​


    This 8-bit register holds the current count value of Timer 0.
این رجیستر 8 بیتی مقدار فعلی تایمر را نگه میدارد
رجیستر ،TCCR0

BIT 7BIT 6BIT 5BIT 4BIT 3BIT 2BIT 1BIT 0
-----CS02CS01CS00

This register is used to configure the Timer 0 prescaler value.

واحد تقسیم کنندۀ فرکانس تایمر صفر

CS02CS01CS00توضیحات
000تایمر خاموش
001 بدون تقسیم clkI/O/(No prescaling)
010clkI/O/8 (From prescaler) فرکانس /8
011 فرکانس / 64 clkI/O/64 (From prescaler)
100 فرکانس تقسیم بر 256 clkI/O/256 (From prescaler)
101 فرکانس تقسیم بر 1024 clkI/O/1024 (From prescaler)
110 حساس به لبه پاییین رونده کلاک متصل به پایه - t0 میکرو - External clock source on T0 pin. Clock on falling edge
111 حساس به لبه بالا رونده کلاک متصل به پایه - t0 - میکروExternal clock source on T0 pin. Clock on rising edge
 
بالا