بسم الله الرحمن الرحیم
آزمایشگا ریزپردازنده
استاد : آقای یعقوبی تبار
دانشجو : مهدی فکوروند
دیماه سال 1399
پروژه پیش رو مربوط به درس آزمایشگاه ریزپردازنده است. در این پروژه ابتدا به معرفی میکروکنترلر ATMEGA 32 میپردازیم. سپس قرار است این میکروکنترل را برنامه نویسی کنیم تا چند LED را خاموش و روشنکند.
در نهایت نتیجه کار را در برنامه پروتئوس به صورت عملی نشان می دهیم.
برای انجام این پروزه به موارد زیر نیاز داریم:
· آشنایی با برنامه CodVision AVR
· آشنایی با برنامه Proteus
· آشنایی با زبان C
· آشنایی با میکروکنترولر ها
معماری پیشرفته RISC
کارایی بالا و توان مصرفی کم
دارای 32 رجیستر 8 بیتی
سرعت تا 16 مگاهرتز
انواع حافظه ها در ATMEGA32
kb 32 حافظه flash با قابلیت برنامه ریزی
1024 بایت حافظه EEPROM با قابلیت برنامه ریزی
kb 2 حافظه SRAM داخلی
برای جلوگیری از کپی شدن برنامه قابلیت قفل کردن حافظه های فلش و EEPROMهم در این میکروکنترل وجود دارد.
این میکروکنترل دارای یک سری خصوصیات جانبی نیز میباشد که شامل :
· 2 تایمر/کانتر 8 بیتی
· 1 تایمر/کانتر 16 بیتی
· 4 کانال PWM
· ارتباط سریال 2 سیمه
· 8 کانال مبدل آنالوگ به دیجیتال 10 بیتی
· مقایسه کننده آنالوگ داخلی
· ارتباط USART
· 6 مد حالت خواب برای کم کردن مصرف میکروکنترلر
قابلیت ارتباط JTAG
این قابلیت برای دیباگ کردن و اشکال زدایی برنامه و تراشه استفاده میشود.
قابلیت برنامه ریزی حافظه های میکروکنترلر را دارد و یا اینکه می شود فیوز بیت را با آن تنظیم کرد.
مشاهده میکنید که 4 سری نام گذاری وجود دارد .(A,B,C,D) هر سری از این پایه ها از صفر تا 7
(8 پایه) نام گذاری شدند ، به هرکدام از این 8 پایه یک پورت میگویند که میشه آنها را بعنوان ورودی/خروجی تعریف کرد.
همانطور که گفتم هر پایه اسم خاصی دارد( داخل پرانتز قابلیت هر پایه مشخص شده است) ، مثلا پورت) A پایه های 33 تا 40 که با اسم PA و مخفف Port A مشخص شدهاند(. قابلیتADC (مبدل آنالوگ به دیجیتال) شدن رو دارند و یا برخی از پایه ها چند قابلیت دارند که میشود نسبت به پروژه قابلیت مورد نظر خودمون رو انتخاب کنیم و از اون پایه ها استفاده کنیم.
فرکانس کاری این میکروکنترلر حداکثر 16 مگاهرتز است البته در سری ATMEGA32L این مقدار 8 مگا هرتز میباشد. توجه کنید که میتوانیم فرکانس های پایین تر ، مثل 1مگاهرتز رو هم انتخاب کنیم(متناسب با پروژه).1
در این قسمت می خواهیم مرحله به مرحله تمام کارهایی که قرار است در برنامه کدویژن انجام دهیم را شرح دهیم ( بصورت تصویری) .
در ابتدا وارد نرم افزار CodeVision AVR شده و از منوی بلای صفحه سمت چپ New Project را انتخاب میکنیم.
در قسمتی که از ما پرسیده می شود می خواهید از CodeWizard Avr استفاده نمائید، ما No را انتخاب میکنیم.
در مرحله بعد محل ذخیره پروژه را با نام دلخواه وارد میکنیم و روی گزینه Saveکلیک میکنیم.
در مرحله بعدی باید نوع میکروکنترلر را انتخاب کنیم. ما در این پروژه از Atmega32 استفاده کردهایم پس این میکروکنترلر رو انتخاب میکنیم و نام فایل را Led میگذاریم.
در مرحله بعد در قسمت C Compiler نوع chip را Atmega32 و Clock را بر روی 8MHz می گذاریم و بر روی OK کلیک می نمائیم.
حال پنجرهای باز میشود که کدهای مربوطه را در آن می نویسیم.
در ابتدا کتابخانه های مورد نیازمان را اضافه میکنیم :
#include <io.h>
#include <mega32.h>
#include <delay.h>
void main(void)
{
{
سپس در بدنه اصلی (main) کدهای برنامه را مینویسیم:
ابتدا باید یک پورت را برای اتصال به ال ای دی ها فعال کنیم و ما پورت B را فعال می کنیم و متغییر a را برای شمارش حلقه تعریف می کنیم:
void main(void)
{
int a;
DDRB=0b11111111;
{
برای روشن شدن ال ای دی ها باید مقدار آنها را 1 کنیم و اگر بخواهیم ال ای دی ها به ترتیب از چپ به راست یا بلعکس روشن و خاموش شوند باید برای هر وضعیت مقدار آن را مشخص کنیم و چون ما 8 ال ای دی داریم و می خواهیم در هر لحظه فقط یک ال ای دی روشن شود پس باید یک آرایه تعریف کرده و وضعیت ها را در آن مشخص نمائیم:
char led[]={0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
حال باید در یک حلقه for روشن و خاموش شدن ال ای دی ها را تعریف کنیم:
for (a=0; a<=7; a++) {
PORTB=led[a];
delay_ms(50);
};
برای روشن شدن ال ای دی ها از چپ به راست مانند بالا عمل می کنیم فقط در حلقه for باید ترتیب فراخوانی متغییرها برعکس شود و کد به شکل زیر می شود:
for (a=6 ;a>=0; a--) {
PORTB=led[a];
delay_ms(50);
};
حال اگر بخواهیم همه ال ای دی ها با هم روشن و خاموش شوند ابتدا باید همه ال ای دی ها را در حالت روشن قرار داد سپس یک وقفه داد تا نمایش داده بشوند و پس از آن همه ال ای دی ها را در حالت خاموش قرار داد و دوباره وقفه برای نمایش. برای تکرار این عملیات هم می توان این کار را در یک حلقه for قرار داد:
for(a=0; a<4; a++)
{
PORTB=0b11111111;
delay_ms(50);
PORTB=0b00000000;
delay_ms(50);
};
حال می خواهیم ال ای دی ها را یک در میان روشن و خاموش کنیم برای این کار ابتدا وضعیت هر پایه ال ای دی را یکی در میان 01 می کنیم و بعد 10 به صورت زیر:
for(a=0; a<4; a++) {
PORTB=0b01010101;
delay_ms(50);
PORTB=0b10101010;
delay_ms(50);
};
در دو حالت بالا که می خواستیم ال ای دی ها همزمان یا یک در میان روشن شوند ما در شرط حلقه a<4 قرار دادیم که این یک مقدار دلخواه میباشد و تعداد تکرار عملیات را مشخص میسازد و.
در مثال یکی مانده به آخر ال ای دی ها 4 بار خاموش و روشن میشوند و در مثال آخر هم 4 بار یکی در میان روشن و خاموش میشوند.
در این حالت نیز ال ای دی ها دوتا درمیان خاموش و روشن میشوند:
for(a=0;a<4;a++)
{
PORTB=0b11001100;
delay_ms(50);
PORTB=0b00110011;
delay_ms(50);
};
اکنون کار کدنویسی تمام شده است و اگر بخواهیم همه کد های بالا را به ترتیب پشت سر هم اجرا کنیم قطعه کد ما در نهایت به شکل زیر میباشد:
#include <io.h>
#include <mega32.h>
#include <delay.h>
void main(void)
{
int a;
char led[]={0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
DDRB=0b11111111;
while (1)
{
for (a=0;a<=7;a++) //در اين حلقه ال اي دي ها از راست به چپ شروع به روشن و خاموش شدن مي کنند
{
PORTB=led[a];
delay_ms(50);
};
for (a=6;a>=0;a--) // در اين حلقه ال اي دي ها از چپ به راست شروع به روشن و خاموش شدن مي کنند
{
PORTB=led[a];
delay_ms(50);
};
for(a=0;a<4;a++) //در اين حلقه ال اي دي ها هم زمان با هم روشن و خاموش مي شوند
{
PORTB=0b11111111;
delay_ms(50);
PORTB=0b00000000;
delay_ms(50);
};
for(a=0;a<4;a++) //در اين حلقه ال اي دي ها به صورت يک در ميان روشن و خاموش مي شوند
{
PORTB=0b01010101;
delay_ms(50);
PORTB=0b10101010;
delay_ms(50);
};
for(a=0;a<4;a++) //در اين حلقه ال اي دي ها دو تا درميان روشن و خاموش مي شوند
{
PORTB=0b11001100;
delay_ms(50);
PORTB=0b00110011;
delay_ms(50);
};
}
}
بعد از اتمام کد نویسی در نوار بالای صفحه روی گزینه Build All Project file را کلیک میکنیم اگر کدها را درست وارد کرده باشیم در پایین صفحه هیچ پیغام خطایی وجود نخواهد داشت در غیر این صورت باید خطا را رفع کنیم.
حالا نوبت به کار با Proteus می رسد و ما باید مدار را شبیه سازی کنیم.
نرم افزار Proteus را اجرا میکنیم و از قسمت بالای صفحه سمت چپ روی File => New Project کلیک میکنیم و در پنجره باز شده نام پروژه و محل ذخیره سازی پروژه را مشخص میکنیم .
مراحل بعدی را بدون تغییر بر روی next کلیک میکنیم.
و در نهایت بر روی finish کلیک میکنیم.
داخل برنامه بر روی p کلیک می کنیم.
حال در پنجره باز شده در قسمت keywords نام قطعاتی که لازم داریم را جستجو کرده و به پروژه اضافه می کنیم. ما باید میکرو Atmega32، Res، Led را همانند شکل زیر به پروژه اضافه نمائیم.
حال نوبت به بستن مدار می باشد که اتصالات به شکل زیر هستند.
بر روی میکروکنترلر atmega32 دابل کلیک میکنیم، پنجره زیر باز میشود و در آنجا فایل برنامه نویسی شده را به آن معرفی میکنیم تا برنامه اجرا شود: