نمونه کد راه اندازی USART در AVR، روش Polling
برنامۀ زیر، نمونه کد USART در AVR با روش Polling در نرم افزار
اتمل استودیو است. ابتدا تعیین کرده ایم که فرکانس کاری CPU برابر 8 مگاهرتز است. سپس کتابخانۀ io.h را فراخوانی کرده ایم. در تابع main متغیر data را از نوع char تعریف کرده ایم. در سطر بعد با یک کردن بیت های 3 و 4 رجیستر UCSR0B، فرستنده و گیرندۀ واحد USART را فعال کرده ایم. تعداد بیت های دادۀ فریم را با یک کردن بیت های 2 و 1 رجیستر UCSR0C برابر 8 قرار داده ایم. در مد آسنکرون وقتی بیت U2X0 صفر است و می خواهیم Baud rate برابر 9600 باشد، مقدار UBRR0 برابر است با:
UBRR0 = (F_CPU / (16 * BAUD)) - 1 = (8000000 / (16 * 9600)) - 1 = 51
این مقدار را در رجیستر های UBRR0 قرار داده ایم. چون مقدار 8 بیتی است، تنها به UBRR0L مقدار داده ایم. بقیۀ تنظیمات واحد USART در حالت پیش فرض هستند. یعنی مد آسنکرون، تعداد یک بیت Stop و Parity هم غیر فعال.
در ادامه در حلقۀ while، وضعیت بیت RXC0 را بررسی می کنیم. هر گاه بایتی دریافت شود، این بیت 1 می شود و دستورهای درون if اجرا می شوند. درون if، بایت دریافت شده را از رجیستر UDR0 می خوانیم و در متغیر data قرار می دهیم. سپس در یک حلقۀ while بدون دستور، بیت 5 رجیستر UCSR0A را بررسی می کنیم. هر گاه رجیستر داده خالی شود، این بیت 1 می شود و می توانیم در رجیستر داده بنویسیم. هرگاه رجیستر داده خالی شد، برنامه از حلقۀ while خارجی می شود.
سپس مقدار دریافتی را که در متغیر data قرار داده بودیم، دوباره در UDR0 قرار می دهیم تا ارسال شود. بنابراین انتظار داریم هر کاراکتری که از کامپیوتر به میکروکنترلر ارسال می کنیم، میکروکنترلر همان را برای کامپیوتر ارسال کند.
PHP:
#define F_CPU 8000000UL
#include <avr/io.h>
int main(void)
{
char data=0;
UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Bit 4 and 3 of UCSR0B
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // Bit 2 and 1 of UCSR0C
UBRR0L = 51;
while (1)
{
if ( (UCSR0A & (1<<RXC0)) == (1<<RXC0))
{
data = UDR0;
while((UCSR0A & (1<<UDRE0)) != (1<<UDRE0)); // Bit 5 of UCSR0A
UDR0 = data;
}
}
}
به راه اندازی USART در AVR و ارتباط کامپیوتر با میکروکنترلر AVR می پردازیم. در راه اندازی USART، هم از روش Polling و هم از وقفه استفاده کرده ایم.
uboard.ir