میکروکنترلر AVR راه های ارتباطی زیادی از جمله USART , SPI , TWI , USI و USB دارد که هر کدام کاربرد خاص خود را دارند.
امروز ما میخوایم رابط ارتباطی USART رو مورد بررسی و آموزش قرار بدیم.
سریال در لغت به معنی پشت سر هم , ما دو نوع کلی روش ارتباطی داریم یکی سریال و یکی دیگه موازی , در ورش موازی معمولا برای هر بیت یک سیم در نظر گرفته میشه مثلا اگه بخوایم یک بایت رو ارسال کنیم باید از 8 سیم استفاده کنیم. اما در روش سریال انتقال داده توسط 1 سیم انجام میشه , مثلا اگه دادهها در قالب یک بایت باشن، برای انتقال هر بایت، بیتها با ترتیب و قالب مشخصی بر روی سیم قرار میگیرن.

سریال USART در AVR:
انتقال داده داخل AVR به سه روش میتونه باشه:
1- یک طرفه
در این روش دیتا فقط ارسال یا دریاف میشود.
2- تمام دوطرفه
در این روش دیتا در هر زمانی هم میتونه ارسال و هم دریافت بشه.
3- نیمه دوطرفه
در این روش دیتا در زمان مشخص میتونه ارسال یا دریافت بشه.

پین های USART در ATMEGA16:

رجیستر های USART در AVR:
1-UDR
2.UCSRA
3.UCSRB
4.UCSRC
5.UBRR
در USART پنج رجیستر وجود داره که به اونا میپردازیم.
اولین رجیستر رجیستر UDR که مخفف USART DATA REGISTER این رجیستر یه رجیستر 8 بیتی که دیتای ارسالی و دریافتی یوزارت داخلش ذخیره میشه.
برای مثال:
;’UDA=’1
دستور بالا کاراکتر ‘1’ رو ارسال میکنه
رجیستر بعدی UCSR که مخفف USART Control and Status Register این رجیستر برای کنترل و تنظیمات یوزارت که از سه بخش UCSRA , UCSRB , UCSRC تشکیل شده و دستورات مهمش رو میگیم.
UCSRA:

بیت RXC: این بیت پرچم دریافت اطلاعات , یعنی هر وقت داده ای دریافت بشه این بیت 1 میشه.
بیت TXC: وقتی داده ای ارسال میشه این بیت 1 میشه.
بیت UDRE: این بیت وضعیت پر بودن یا خالی بودن بافر رو نشون میده.
بیت FE: اگه خطایی در دریافت یا ارسال اطلاعات بوجود بیاد این بیت 1 میشه.
بیت U2X: این بیت سرعت انتقال داده رو دوبرابر میکنه.
UCSRB:

بیت RXCIE: با 1 شدن این بیت وقفه دریافت فعال میشه.
بیت TXCIE: با 1 شدن این بیت وقفه ارسال فعال میشه.
بیت RXEN: این بیت گیرنده ارتباط سریال رو فعال میکنه.
مثال:
;UCSRB=0b00010000
بیت TXEN: این بیت فرستنده ارتباط سریال رو فعال میکنه.
مثال:
;UCSRB=0b00001000
UCSRC:

بیت URSEL: برای تنظیم رجیستر UCSRC این بیت رو باید 1 کنیم.
بیت UMSEL: این بیت مد ارتباط سریال رو مشخص میکنه , اگه بیت 1 باشه میره روی مد سنکرون و اگه 0 باشه آسنکرون.
بیت های UCSZ2 و UCSZ1 و UCSZ0: این بیت ها برای تایین سایز کاراکتر ها هستن.
نکته: بیت UCSZ2 در رجیستر UCSRB قرار داره.

رجیستر UBRR:
رجیستر UBRR که مخفف (USART BUAD RATE REGISTER) برای تنظیم سرعت ارسال اطلاعات استفاده میشه که به اصلاح به اون (Baud Rate) میگن , رجیستن UBRR یه رجیستر 16 بیتی که از دو رجیستر UBRRL و UBRRH تشکیل شده.

بیت های 0 تا 11: تو این بیت ها اعدادی متناسب با باود ریت نوشته میشه که از فرمول زیر بدست میان.

باود ریت: 1200 , 2400 , 4800 , 9600 , 19200 , 38400 , 57600 , 115200
مثال: مقدار UBRR با فرکانس 8 مگاهرتز و باود ریت 9600 را محاسبه کنید:

حالا عدد بدست اومده رو رند و اونو به باینری تبدیل کنید و داخل رجیستر UBRR قرار بدید.

;UBRRH=0b00000000
;UBRRL=0b00110011
خیلی خوب دیگه فکر کنم توضیحات کافیه بهتره بریم سراغ برنامه نویسی در محیط کدویژن.
مثال1: برنامه ای بنویسید که در میکرو اول با زدن کلید یک کاراکتر ‘a’ و با زدن کلید دو کاراکتر ‘b’ رو ارسال کنه و در میکرو دوم اگر ‘a’ دریافت شد LED را روشن و اگر ‘b’ دریافت شد LED را خاموش کند.

کد مربوط به U1 (فرستنده):
#include <mega8.h> // تعریف میکروکنترولر مگا 8
#include <delay.h> // تعریف تابع تاخیر
void main(void) // باز کردن حلقه برنامه اصلی
{
UCSRA=0b00000000;
UCSRB=0b00001000; // فعال سازی مود فرستنده یوزارت
UCSRC=0b10000110; // تنظیم کردن سایز کاراکتر های ارسالی و دریافتی به 8 بیت
UBRRH=0b00000000; // تنظیم باودریت به 9600
UBRRL=0b00110011; // تنظیم باودریت به 9600
DDRB.0=0; // تعریف پین 0 پورت B به عنوان ورودی (کلید شماره 1)
DDRB.1=0; // تعریف پین 1 پورت B به عوان ورودی (کلید شماره 2)
while (1) // باز کردن حلقه تکرار
{
if(PINB.0==0) // اگر پین 0 پورت B صفر شد (اگر کلید شماره 1 زده شد)
{
delay_ms(30); // یک تاخیر 30 میلی ثانیه برای حذف لرزش کلید (Debounce)
UDR='a'; // کاراکتر 'a' را ارسال کن
}
if(PINB.1==0) // اگر پین 1 پورت B صفر شد (اگر کلید شماره 2 زده شد)
{
delay_ms(30); // یک تاخیر 30 میلی ثانیه برای حذف لرزش کلید (Debounce)
UDR='b'; // کاراکتر 'b' را ارسال کن
}
}
}
کد مربوط به U2 (گیرنده):
#include <mega8.h>
#include <delay.h>
void main(void)
{
int d; //تعریف متغیر d
UCSRA=0b00000000;
UCSRB=0b00010000; //فعال سازی مود گیرنده یوزارت
UCSRC=0b10000110;
UBRRH=0b00000000;
UBRRL=0b00110011;
DDRB.0=1; // تعریف پین 0 پورت B به عنوان خروجی (LED)
while (1)
{
d=UDR; // خواندن یوزارت و دادن آن به متغیر d
delay_ms(1);
if(d=='a') // اگر دیتای دریافتی کاراکتر 'a' بود
{
PORTB.0=1; // ال ای دی را روشن کن
}
if(d=='b') // اگر دیتای دریافتی کاراکتر 'b' بود
{
PORTB.0=0; // ال ای دی را خاموش کن
}
}
}
نکته: فرکانس میکرو را روی 8 مگاهرتز قرار بدید …. نیازی به استفاده از کدویزارد نیست
دستور های مهم در یوزارت:
UDR
با استفاده از این دستور میتوانید کاراکتر مورد نظر را ارسال کنید.
مثال: کاراکتر ‘a’ را ارسال کن
;’UDR=’a
()getchar
این دستور منتظر میماند تا دیتایی دریافت شود تا آن را بخواند.
مثال: دیتای دریافتی را دریافت کن و در متغیر a بریز
;()a=getcher
()putsf
با این دستور میتوانید یک رشته ارسال کنید.
مثال: کلمه “PCBdl.ir” را ارسال کنید
;putsf(“PCBdl.ir”)
()puts
توسط این دستور میتوانید یک آرایه را ارسال کنید
مثال:
;{‘P’ , ‘C’ , ‘B’ , ‘d’ , ‘l’}=[]unsigned char i
;puts(i)