انتقال اطلاعات با usart

saalek110

Well-Known Member
ارسال یک عبارت متنی با usart ، فیلم فارسی
تشکر از جناب مجید یاسینی بابت زحمتی که بابت این فیلم کشیده اند.



youtu.be/3N3HM9pmF28?si=nGNKSMV8nsVPKefl

در فیلم بالا ، رجیسترهای مربوطه را تنظیم کرده.
در کدویژن کار کرده.
 
آخرین ویرایش:

saalek110

Well-Known Member
 

saalek110

Well-Known Member
از دو سایت آیرنکس و melec مقالاتی در بالا ، لینک داده شد...
مطالعه این مقالات می تواند مفید باشد.
سالک: من فکر می کنم کپی کردن اون مطالب به اینجا کمکی نکند...




توجه داشته باشید که ممکن است مطالب ناقص یا بدجور منتقل شده باشد ، پس نباید فقط به ظاهر فیلم یا مقاله توجه کنیم. فقط مفاهیم مطلب را بگیریم ، تا دستمان بیاید موضوع اصلا چیست ، بعد در سایتهای خارجی ، مطالب بهتر بیان شده.
من چون مدتی است مشغول استفاده از این سایتها هستم...
به این نتیجه رسیدم که باید مبانی و مفاهیم را از فیلم ها و سایت های ایرانی گرفت و جزئیات را از سایتهای انگلیسی.
 
آخرین ویرایش:

saalek110

Well-Known Member
همان سایت بالا، در سایت فارسی زیر ترجمه شده:



برای ارسال داده توسط واحد USART مراحل زیر باید طی شوند:

واحد USART با 1 کردن بیت UE در رجیستر USART_CR1، فعال می‌شود.

طول کلمه، با مقدار دادن به بیت M در رجیستر USART_CR1، تنظیم می‌شود.

تعداد بیت stop باید در رجیستر USART_CR2 تنظیم شود.

(در صورت استفاده از ارتباط Multi buffer) DMA به‌وسیله تنظیم رجیستر USART_CR3 تنظیم می‌شود (DMAT).

baud rate موردنظر برای ارتباط، باید در رجیستر USART_BRR تنظیم شود.

با یک کردن بیت TE در رجیستر USART_CR1، یک فریم idle به‌عنوان اولین کلمه ارسالی، فرستاده خواهد شد.

اطلاعات موردنظر برای ارسال باید در رجیستر USART_DR نوشته شوند (این عمل موجب صفر شدن بیت TXE خواهد شد). درصورتی‌که تنها از یک بافر استفاده می‌شود، این مرحله برای هر داده تکرار خواهد شد.

بعد از نوشتن آخرین داده در رجیستر USART_DR، مدت‌زمانی طول می‌کشد تا TC برابر با 1 شود. که این اتفاق نشان‌دهنده اتمام ارسال آخرین فریم از اطلاعات است. پس درصورتی‌که بخواهیم واحد USART را بعد از انتقال اطلاعات (و به‌قصد جلوگیری از خراب شدن آخرین انتقال) متوقف کنیم، باید 1 شدن TC چک شود.
 

saalek110

Well-Known Member

نمونه کد راه اندازی 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;
        }
    }
}

 

جدیدترین ارسال ها

بالا