UART , در atmel studio با هدرهای اکسپلور امبدد

saalek110

Well-Known Member
UART , در atmel studio با هدرهای اکسپلور امبدد
 
آخرین ویرایش:

saalek110

Well-Known Member
سیم کشی:


با دو سیم tx یک میکروکنترلر را به rx دیگری و
و همچنین rx اولی را به tx دومی وصل کنید.

پس از نظر سیم کسی باید rx و tx را برعکس وصل کنید.

من دو میکروکنترلر دارم... دومی باید lcd داشته باشه تا حرف دریافتی را روی lcd چاپ کنه.
ولی اگر lcd نداشتید ، ابتکاری یک جوری بفهمید که حرف دریافتی چیه... من هنوز چنین کاری نکردم ولی احتمالا بشه، مثلا بگید اگر کارکتر دریافتی فلان بود یک led متصل به فلان پایه روشن بشه.... فکر کنم بشه...
 
آخرین ویرایش:

saalek110

Well-Known Member
از لحاظ کد نویسی:

۳ خط کد اضافه میشه ، یکی اینکلود uart.h

دومی init کردن uart ، یعنی تابع شروع کننده را صدا بزنیم.

سومین کد هم کد ارسال است.
در میکروکنترلر مقابل مسلما باید کد دریافت را بنویسید.
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
#include "uart.h"


int main()
{

    UART_Init(9600);  // Initialize UARt at 9600 baud rate
 
    while(1)
    {
        UART_TxChar('e');
    }
    return (0);
}

۳ خط کدی که گفتم باید اضافه کنید را در کد بالا می بینید.
در کد بالا داریم حرف e را ارسال می کنیم ، توابعی که اولش Tx داره ارسال کننده است.

پس در میکروکنترلر دومی باید تابع دریافت را بنویسید:


PHP:
 ch = UART_RxChar();

  LCD_DisplayChar(ch);

خط دومی در کد بالا . چاپ حرف دریافت شده در lcd است.

کد زیر هم لازمه...اول main بزاریدش:

PHP:
   char ch;

چون می دونید باید اول متغیر را تعریف کنید تا بتوانید دریافتی را درش بریزید.

من دیگه کدهای مربوط به lcd را نیاوردم تا شلوغ نشه....
خوب بهتره اول lcd را راه انداز کنید .....بعد کدهای uart را بهش اضافه کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
با اجرای برنامه بالا در میکروکنترلر دومی پشت سر هم حرف e چاپ میشد.
 
آخرین ویرایش:

saalek110

Well-Known Member
همچنین وقتی uart.h را اینکود می کنید نمی تواند فایل را پیدا کنه.
در تاپیک اصلی اکسپلور امبدد گفتیم چطور فایلها را ادد کنید به پروژه .... uart.c را هم بعد uart.h ادد کنید به پروژه.

برای اینکه بدونید چطوری ادد کنید تاپیک زیر را ببینید:



 

saalek110

Well-Known Member
من کد ارسال یک حرف را گفتم...
خودتان کد ارسال رشته و ارسال عدد را کار کنید...البته کدهای مثالش را داره بسته سایت مذکور.. من دیگه اون مثالها را اینجا بیان نکردم.
فقط اسم تابعش فرق داره...
لیست توابع هم در فایل uart.h ، در انتهای فایل تحت اسم پروتوتایپ ها هست...
کدهای توابع هم در uart.c است.
 

saalek110

Well-Known Member
بسته سایت اکسپلور امبدد ، در پوشه tutorial بدون توابع اش هم کد ارائه کرده که خودتان می توانید نگاه کنید....
می توانید از کدهای سایت اای دیگر هم استفاده کنید ، استفاده از توابع آماده سایت اکسپلور امبدد برای کسانی است که به استفاده از چنین توابعی علاقه دارند.

ولی حتی اگر خودتان کد بنویسید ، به تدریج می خواهید کدها برود یک جایی و زیر دست و پا نباشد... این سایت هم همین کار را کرده... هر وقت دلتان خواست می توانید بروید کدها را داخل uart.c بخوانید.در پست های بعد چند تا از تابع های مهم اش را نقل می کنم تا ببینید. باقی اش را خودتان در فایل uart.c ببینید.
 
آخرین ویرایش:

saalek110

Well-Known Member
تابع init این شرکت:

PHP:
void UART_Init(uint32_t v_baudRate_u32)
{
    UCSRB= (1<<RXEN) | (1<<TXEN);                  // Enable Receiver and Transmitter
    UCSRC= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);   // Asynchronous mode 8-bit data and 1-stop bit
    UCSRA= 0x00;                                   // Clear the UASRT status register
    UART_SetBaudRate(v_baudRate_u32);
}
 

saalek110

Well-Known Member
تابع تنظیم بود ریت:


PHP:
void UART_SetBaudRate(uint32_t v_baudRate_u32)
{
    uint16_t RegValue;

    if((v_baudRate_u32 >= C_MinBaudRate_U32) && (v_baudRate_u32<=C_MaxBaudRate_U32))
    {
        /* Check if the requested baudate is within range,
         If yes then calculate the value to be loaded into baud rate generator. */
        RegValue = M_GetBaudRateGeneratorValue(v_baudRate_u32);
    }
    else
    {
        /*     Invalid baudrate requested, hence set it to default baudrate of 9600 */
        RegValue = M_GetBaudRateGeneratorValue(9600);
    }

    UBRRL = util_ExtractByte0to8(RegValue);
    UBRRH = util_ExtractByte8to16(RegValue);
}
 

saalek110

Well-Known Member
تابع rx char

PHP:
char UART_RxChar(void)
{
    while(util_IsBitCleared(UCSRA,RXC));  // Wait till the data is received
    return(UDR);                          // return the received char
}

تابع tx char


PHP:
void UART_TxChar(char v_uartData_u8)
{
    while(util_IsBitCleared(UCSRA,UDRE)); // Wait till Transmitter(UDR) register becomes Empty
    UDR =v_uartData_u8;                              // Load the data to be transmitted
}
 

saalek110

Well-Known Member
من در بالا ، چند تا توابع مهم از uart.c را نقل کردم...
تا بدانید در پشت پرده کدها چیست.
 

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

بالا