آموزش avr بخش چهارم

در این آموزش قصد داریم با پایه ها و پورت های میکروکنترولر avr آشنا شویم و نحوه ی استفاده از آنها به عنوان ورودی و خروجی را فرا بگیریم. همچنین در ادامه با کتابخانه delay.h نیز آشنا می شویم. همانطور که از نام این کتابخانه پیداست، برای ایجاد مکث در روند اجرای برنامه در میکروکنترولر مورد استفاده قرار می گیرد. در پایان نیز به کمک اطلاعات بدست آمده یک فلاشر ساده می سازیم.

[divider]

پایه ها و پورت ها:

همانطور که در تصویر زیر مشاهده می کنید، میکروکنترولر یک تراشه الکترونیکی است که دارای چندین پایه است.

atmega328_MED

برخی از این پایه ها مانند پایه های تغذیه عملکردهای ثابت و معینی دارند و قابل برنامه ریزی نیستند. اما سایر پایه های میکروکنترولر که استفاده های چندگانه و در اصطلاح همه منظوره دارند، به عنوان PIN شناخته می شوند. در اکثر کاربردها نیاز به دسته ای از این پایه ها داریم که با هم مرتبط باشند. به همین منظور این پایه ها در دسته های ۸ تایی دسته بندی شده و نام PORT گرفته اند. در تصویر زیر می توانید پین ها و پورت های میکروکنترولر atmega328 را مشاهده کنید:

 mega328pهمانطور که در تصویر بالا مشاهده می کنید، پورت ها با حروف الفبای انگلیسی، مانند PORTA، PORTB و… نامگذاری می شوند.

[divider]

ورودی/خروجی

برای استفاده از پین ها و پورت های میکروکنترولر در حالت ورودی یا خروجی ابتدا باید رجیستر جهت را برای پورت مورد نظر مقدار دهی کنیم. این رجیستر بصورت DDRX نامگذاری می شود که X نام پورت مورد نظر است. اگر این رجیستر را برابر ۰xFF قرار دهیم تمام ۸ پایه آن خروجی و در صورتی که مقدار آن را ۰x00 قرار دهیم، تمام پایه های آن ورودی می شوند. اگر می خواهید پایه ای خاص از پورت را ورودی یا خروجی کنید، باید ابتدا عدد باینری معادل را بسازید، سپس آن را به مبنای ۱۶ تبدیل کرده و رجیستر جهت مربوطه را با آن عدد مقدار دهی کنید. بطور مثال فرض کنید می خواهیم پین های شماره ۰،۲،۴،۶ پورت B را بصورت خروجی و پین های شماره ۱،۳،۵،۷ این پورت را بصورت ورودی مقدار دهی کنیم. در نتیجه باید مقدار رجیستر DDRB را برابر با ۰x55 قرار دهیم:

DDRB = 0x55; // 0x55 = 01010101

[divider]

مقدار دهی پایه ها
اگر پایه ای به صورت خروجی تعریف شود، می توانیم مقدار برای آن تعیین کنیم. این مقدار برای یک پین می تواند صفر یا یک باشد و برای یک پورت می تواند عددی بین صفر تا ۲۵۵ باشد. وقتی پایه ای که خروجی است مقدار یک بگیرد، دارای سطح ولتاژ ۵ ولت(یک منطقی) و در صورتی که مقدار صفر بگیرد، سطح ولتاژ ۰ ولت(صفر منطقی) را خواهد داشت.
اگر پایه ای بصورت ورودی تعریف شود، مقدار دهی آن مفهوم دیگری دارد. در این حالت وقتی به پایه مربوطه مقدار صفر بدهیم، بصورت امپدانس بالا(قطع) و در صورتی که مقدار یک به آن بدهیم Pull-Up خواهد شد. این موضوع را در آموزش های بعدی بررسی خواهیم کرد.
برای مقدار دهی پورت، تنها کافیست از نمونه کد زیر استفاده کنیم:

PORTB = 0xFF;
PORTB = 255;

و برای مقدار دهی پین می توانیم از این کدها استفاده کنیم:

PORTB.3 = 1;
PINB.3 = 1;

[divider]
ایجاد مکث در روند اجرای برنامه
برای ایجاد مکث به میزان مشخص می توانیم از توابع موجود در کتابخانه delay.h کمک بگیریم. پرکاربردترین توابع این کتابخانه، توابع delay_ms و delay_us هستند که به ترتیب برای ایجاد مکث در بازه زمانی میلی ثانیه و میکروثانیه مورد استفاده قرار می گیرند. برای استفاده از این توابع تنهای کافیست مدت زمان مورد نظر را به عنوان ورودی به این توابع بدهیم. با رسیدن برنامه به این دستورات، روند اجرای برنامه برای مدت زمان مشخص شده متوقف می شود و پس از این زمان دوباره ادامه برنامه اجرا خواهد شد. به نمونه کدهای زیر دقت کنید:

delay_ms(500); // delay for 500 miliseconds
delay_us(50); //delay for 50 microseconds

[divider]
ساخت چشمک زن ساده
در انتها می خواهیم مواردی را که تاکنون آموخته ایم را با هم ادغام کرده و یک چشمک زن ساده بسازیم. طرز کار این برنامه به اینصورت است که پایه های مربوط به PORTB را بصورت یکی در میان صفر و یک می کند و پس از هر ۵۰۰ میلی ثانیه ترتیب صفر و یک آنها را تغییر می دهد. به نمونه کد زیر توجه کنید:

#include <mega8.h>
#include <delay.h>

void main(void)
{
DDRB = 0xFF;
while (1)
    {
        PORTB = 0x55;
        delay_ms(500);
        PORTB = 0xAA;
        delay_ms(500);
    }
}

خروجی برنامه بالا بصورت زیر خواهد بود:
ezgif-1954060935

در آموزش بعدی در مورد نحوه شبیه سازی میکروکنترولرهای AVR در شبیه ساز Proteus بحث خواهیم کرد.
موفق و پیروز باشید…

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

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