٨۸۵۴۳۵۶۱-٠٢١

ارتباط RS232 در میکروکنترلر AVR :


RS232 یک پروتکل ارتباط غیر همزمان (آسنکرون) هست که به طور گسترده در کامپیوترو سیتم های دیجیتالی استفاده می شود. این پروتکل ارتباطی به این خاطر ناهمزمان نامیده می شود که هیچ سیگنال ساعت همزمان سازی برای آن وجود ندارد در حالی که برای سایر پروتکل های ارتباطی سریال مانند SPI و I2C این سیگنال کلاک همزمان سازی وجود دارد. این پروتکل ارتباطی به گونه ای است که خود را به صورت خودکار همگام (synchrone) می کند. ما به راحتی می توانیم از پروتکل ارتباطی RS232 برای پروژه های مبتنی بر ارتباط میکروکنترلر با کامپیوتر استفاده کنیم. به عنوان یک مثال خوب می توان به موس کامپیوتر اشاره کرد. شما می توانید یک ثبت کننده اطلاعات بسازید که مقدار آنالوگ را بخواند (مانند درجه حرارت یا مقدار نور) با استفاده از ADC و آن را به کامپیوتر ارسال کنید تا توسط یک برنامه خاص که توسط شما نوشته شده به صورت نمودار و غیره به نمایش بگزارید.

مبانی ارتباط سریال :

در ارتباطات دیجیتال واحد دیتا بر حسب بایت (Byte) که متشکل از 8 بیت (Bit) است می باشد. در ارتباط سریال در هر لحظه یک بیت ارسال و دریافت می شود در صورتیکه در ارتباط موازی (Parallel) تمامی بیت های یک بایت به صورت همزمان و یکجا ارسال و دریافت می شود. بدیهی است که در ارتباط سریال ما به یک یسم نیاز داریم اما در ارتباط موازی ما نیاز به 8 سیم داریم. بنابر این از ارتباط پارالل در جاهایی که ارسال کننده دیتا و دریافت کننده دیتا نزدیک هم هستند (مثلاً در داخل کامپیوتر بین کارت گرافیک و CPU) استفاده می شود. در حالی که انتقال دیتا به روش سریال در محدوده طولانی ترجیح داده می شود.

همان طورکه در ارتباط سریال برای انتقال دیتا فقط یک سیم استفاده می شود سطح منطقی آن نیز با توجه به بیت منتقل شده (0 یا 1) تغییر می کند. در انیمیشن زیر چگونگی انتقال سریال به شما نشان داده شده است (فرض شده است که شما می توانید برق را ببینید)

 

خط انتقال سریال : در وضعیت یک منطقی (HIGH) رنگ قرمز و در وضعیت صفر منطقی (LOW) رنگ سفید.

حالا آیا شما می تواننید با دیدن انیمیشن بالا تشخیص دهید که چه دیتایی در حال ارسال می باشد؟ نه ، زیرا شما سنکرون نشده اید. شما نیاز به روشی دارید که تشخیص دهید که یک بایت کی شروع می شود و کی پایان میابد و یک بیت کی شروع می شود و پایان میابد. فرض کنید خط تا مدتی در وضعیت صفر منطقی یعنی '0' است ، حالا چگونه می توانیم تعداد صفرهای ارسالی روی خط را تشخیص دهیم. اگر ما یک دیتا مثل 00001111 را روی خط ارسال کنیم و اگر قبل از ارسال خط در وضعیت صفر منطقی بوده باشد چگونه ما می توانیم تشخیص دهیم که این دیتا دارای 4 عدد '0' و 4 عدد '1' می باشد.

حالا اگر ما یک خط دیگر به نام خط پالس ساعت را با خط قبلی سنکرون کنیم تشخیص دیتا آسان می شود. شما باید توجه داشته باشید که مقدار خط دیتا فقط وقتی خوانده می شود که سطح خط پالس ساعت در وضعیت یک منطقی باشد. برای درک این مطلب به انیمیشن زیر توجه کنید.

 

حالا شما می توانید ببینید که خط پالس ساعت چگونه به ما برای سنکرون شدن با دیتای ارسالی روی خط دیتا کمک می کند. این روش کار بسیاری از پروتکل های ارتباطی مانند SPI و I2C است. اما USART متفاوت است در USART خط پالس ساعت وجود ندارد که به آن UART گفته می شود. UART مخفف Universal Asynchronous Receiver Transmitter یا فرستنده گیرنده سریال غیر همزمان است. در USART یک بیت شروع و یک بیت پایان برای همزمان سازی داده های ورودی وجود دارد.

پروتکل RS232 :

در RS232 دو خط انتقال داده RX و TX وجود دارد. خط TX خطی است که در آن داده به دستگاههای دیگر ارسال می شود و خط TX خطی است که در آن داده از دستگاههای دیگر دریافت می شود. (علاوه بر این دو خط یک سیم دیگر نیز به عنوان سیم زمین یا GND در نظر گرفته می شود)

 

ما می دانیم که در میکروکنترلر و استاندارد TTL سطح منطقی یک برابر +5V و صفر منطقی برابر 0V است ، اما در پروتکل RS232 یک منطقی برابر -12V و صفر منطقی برابر +12V است. بله مقداری عجیب است اما همین موضوع باعث افزایش محدوده و همچنین قابلیت اطمینان ارسال داده در این پروتکل می شود. حالا این سوال پیش می آید که چگونه این سطح ولتاژ برای میکروکنترلر استفاده می شود؟ باید بگویم که یک آی سی بسیار مشهور به نام MAX232 از شرکت Maxim Semiconductors این کار را انجام می دهد.

همانطور که در بالا اشاره شد هیچ خطی برای کلاک پالس وجود ندارد بنابر این برای همزمان سازی زمان بندی دقیق مورد نیاز است تا انتقال با سرعت استاندارد خاصی انجام شود. سرعت بر حسب بیت بر ثانیه اندازه گیری می شود. که در اینجا تعداد بیتی است که در یک ثانیه انتقال میابد تحت عنوان نرخ علامت در ثانیه (Baud Rate) شناخته می شود. تعدادی از Baud Rate های استاندارد به شرح زیر است:

1200 , 2400 , 4800 , 9600 , 19200 , 38400 , 57600 , 115200 و غیره

برای مثال ما سرعت 9600bps (بیت در ثانیه) را در نظر می گیریم.همانطور که ما 9600 بیت را در هر ثانیه ارسال می کنیم ، ارسال یک بیت 1/9600 ثانیه یا 0.000104 ثانیه یا 104 میکرو ثانیه طول می کشد تا ارسال شود.

برای انتقال یک بایت نیاز به دو بیت اضافی به نام بیت شروع (Start Bit) و بیت پایان (Stop Bit) مورد نیاز است. بنابر این برای ارسال یک بایت به 10 بیت نیاز است ، پس ما در حال ارسال 960 بایت در هر ثانیه هستیم.

نکته : تعداد بیت های توقف می تواند یک یا دو بیت باشد (برای سادگی تعداد بیت توقف را یکی در نظر می گیریم)

یک بیت اضافی نیز تحت عنوان بیت توازن نیز وجود دارد اما برای سادگر این بیت را نیز در نظر نمی گیریم.


انتقال داده در پروتکل RS232 :

انتقال داده به روش زیر انجام می شود:

ارسال کننده دیتا :

وقتی که هیچ انتقالی صورت نمی گیرد خط TX در وضعیت بالا (HIGH) یا در سطح -12V قرار دارد (وضعیت توقف)

1-  زمانی که دستگاه به ارسال داده نیاز دارد خط TX به مدت 104 میکروثانیه در وضعیت '0' میماند. (بیت شروع همیشه صفر است)

2-  سپس هر بیت در دوره های 104 میکروثانیه ارسال می شود.

3-  در نهایت خط TX به مدت حدود 104 میکروثانیه در وضعیت HIGH قرار می گیرد (بیت توقف همیشه یک است). گفته شد "حدود" چون بعد از ارسال بیت توقف شما می توانید دیتای بعدی را ارسال کنید یا اجازه دهید خط TX تا زمان ارسال دیتای بعدی در وضعیت HIGH باقی بماند.

 

دریافت کننده دیتا :

1-   دستگاه دریافت کننده منتظر بیت استارت است. خط RX در وضعیت پایین (LOW) و سطح آن +12V می باشد.

2-  وقتی بیت استارت دریافت می شود آن به اندازه زمان نصف سیکل ارسال یک بیت یعنی 51 میکروثانیه منتظر می ماند حالا در وسط بیت استارت است و دوباره این بیت را می خواند و مطمئن می شود که بیتی که دریافت شده یک بیت استارت است نه چیز دیگری.

3-  سپس به مدت 104 میکروثانیه منتظر می ماند و حالا در وسط اولین بیت داده است حالا مقدار خط RX را می خواند.

4-  به همین روش هر 8 بیت خوانده می شود.

5-  حالا دستگاه دریافت کننده یک بایت را دریافت کرده است.