في هذا البرنامج التعليمي ، نتعلم تمكين اتصال UART مع PIC Microcontroller وكيفية نقل البيانات من وإلى جهاز الكمبيوتر الخاص بك. حتى الآن ، قمنا بتغطية جميع الوحدات الأساسية مثل ADC و Timers و PWM وتعلمنا أيضًا كيفية توصيل شاشات LCD وشاشات العرض المكونة من 7 أجزاء. الآن ، سوف نجهز أنفسنا بأداة اتصال جديدة تسمى UART والتي تستخدم على نطاق واسع في معظم مشاريع Microcontroller. تحقق هنا من دروس PIC Microcontroller الكاملة باستخدام MPLAB و XC8.
لقد استخدمنا هنا PIC16F877A MCU ، وهي تحتوي على وحدة تسمى "مستقبل وجهاز إرسال غير متزامن عالمي متزامن قابل للعنونة" يُعرف قريبًا باسم USART. USART هو نظام اتصال ثنائي الأسلاك تتدفق فيه البيانات بشكل متسلسل. USART هو أيضًا اتصال مزدوج الاتجاه ، مما يعني أنه يمكنك إرسال واستقبال البيانات في نفس الوقت والتي يمكن استخدامها للتواصل مع الأجهزة الطرفية ، مثل محطات CRT وأجهزة الكمبيوتر الشخصية.
و USART يمكن تكوينها في الأوضاع التالية:
- غير متزامن (ازدواج كامل)
- متزامن - رئيسي (أحادي الاتجاه)
- متزامن - تابع (أحادي الاتجاه)
هناك أيضًا وضعان مختلفان هما وضع 8 بت و 9 بت ، في هذا البرنامج التعليمي سنقوم بتكوين وحدة USART للعمل في الوضع غير المتزامن مع نظام اتصال 8 بت ، لأنه أكثر أنواع الاتصال استخدامًا. نظرًا لأنه غير متزامن ، فإنه لا يحتاج إلى إرسال إشارة الساعة مع إشارات البيانات. تستخدم UART سطري بيانات لإرسال بيانات (Tx) واستلامها (Rx). يجب أيضًا جعل أرضية كلا الجهازين مشتركة. لا يشترك هذا النوع من الاتصال في ساعة مشتركة ، وبالتالي فإن الأرضية المشتركة مهمة جدًا حتى يعمل النظام.
في نهاية هذا البرنامج التعليمي ، ستتمكن من إنشاء اتصال (UART) بين جهاز الكمبيوتر الخاص بك ووحدة التحكم الدقيقة PIC وتبديل مؤشر LED على لوحة الموافقة المسبقة عن علم من الكمبيوتر المحمول. سيتم إرسال حالة مؤشر LED إلى الكمبيوتر المحمول من PIC MCU. سنقوم باختبار الإخراج باستخدام Hyper Terminal في الكمبيوتر. يتم تقديم فيديو مفصل أيضًا في نهاية هذا البرنامج التعليمي.
المتطلبات:
المعدات:
- لوح أداء PIC16F877A
- RS232 إلى وحدة محول USB
- الحاسوب
- مبرمج PICkit 3
البرمجيات:
- MPLABX
- HyperTerminal
مطلوب محول RS232 إلى USB لتحويل البيانات التسلسلية إلى نموذج يمكن قراءته على الكمبيوتر. هناك طرق لتصميم دائرتك الخاصة بدلاً من شراء الوحدة الخاصة بك ولكنها غير موثوقة لأنها تتعرض للضوضاء. هو مبين أدناه الذي نستخدمه
ملاحظة: سيتطلب كل محول RS232 إلى USB تثبيت برنامج تشغيل خاص ؛ يجب أن يتم تثبيت معظمها تلقائيًا بمجرد توصيل الجهاز. لكن ، إذا لم تسترخي !!! استخدم قسم التعليقات وسأساعدك.
برمجة متحكم PIC لاتصالات UART:
مثل جميع الوحدات (ADC ، Timer ، PWM) يجب علينا أيضًا تهيئة وحدة USART الخاصة بنا من PIC16F877A MCU وإرشادها للعمل في وضع الاتصال UART 8 بت. دعونا نحدد بتات التكوين ونبدأ بوظيفة التهيئة UART.
تهيئة وحدة UART لوحدة التحكم الدقيقة PIC:
توجد دبابيس Tx و Rx فعليًا في المسامير RC6 و RC7. وفقًا لورقة البيانات ، دعنا نعلن أن TX كإخراج و RX كمدخل.
// **** إعداد دبابيس الإدخال / الإخراج لـ UART **** // TRISC6 = 0 ؛ // تم تعيين TX Pin كإخراج TRISC7 = 1 ؛ // تم تعيين RX Pin كمدخل // ________ مجموعة دبابيس I / O __________ //
الآن يجب ضبط معدل البث بالباود. معدل البث بالباود هو المعدل الذي يتم به نقل المعلومات في قناة اتصال. يمكن أن يكون هذا أحد القيم الافتراضية العديدة ، ولكن في هذا البرنامج نستخدم 9600 نظرًا لأن معدل الباود الأكثر استخدامًا.
/ ** تهيئة سجل SPBRG لمعدل البث بالباود المطلوب وضبط BRGH على معدل الباود السريع ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1 ؛ BRGH = 1 ، // للباود العالي // _________ نهاية إعداد معدل الباود _________ //
يجب تعيين قيمة معدل البث بالباود باستخدام السجل SPBRG ، وتعتمد القيمة على قيمة التردد البلوري الخارجي ، وتظهر الصيغ لحساب معدل البث بالباود أدناه:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1 ؛
يجب جعل البت BRGH مرتفعًا لتمكين معدل بت عالي السرعة. وفقًا لورقة البيانات (الصفحة 13) ، من المفيد دائمًا تمكينها ، حيث يمكنها التخلص من الأخطاء أثناء الاتصال.
كما ذكرنا سابقًا ، سنعمل في الوضع غير المتزامن ، ومن ثم يجب جعل Bit SYNC صفريًا ويجب جعل bit SPEM مرتفعًا لتمكين المسامير التسلسلية (TRISC6 و TRICSC5)
// **** تمكين المنفذ التسلسلي غير المتزامن ******* // SYNC = 0 ؛ // غير متزامن SPEN = 1 ؛ // تمكين دبابيس المنفذ التسلسلي // _____ تم تمكين المنفذ التسلسلي غير المتزامن _______ //
في هذا البرنامج التعليمي ، سنقوم بإرسال واستقبال البيانات بين MCU والكمبيوتر ومن ثم يتعين علينا تمكين كل من بتات TXEN و CREN.
// ** لنستعد للإرسال والاستقبال ** // TXEN = 1 ؛ // تمكين الإرسال CREN = 1 ؛ // تمكين الاستقبال // __ وحدة UART جاهزة للإرسال والاستقبال __ //
و بت TX9 وRX9 يجب أن تتم الصفر حتى يتسنى لنا العمل في وضع 8 بت. إذا كان لابد من وجود موثوقية عالية ، فيمكن تحديد وضع 9 بت.
// ** حدد وضع 8 بت ** // TX9 = 0 ؛ // تحديد استقبال 8 بت RX9 = 0 ؛ تم تحديد // وضع استقبال 8 بت // __ تحديد وضع 8 بت __ //
بهذا نكمل إعداد التهيئة الخاص بنا. وجاهز للتشغيل.
نقل البيانات باستخدام UART:
يمكن استخدام الوظيفة أدناه لنقل البيانات من خلال وحدة UART:
// ** وظيفة لإرسال بايت واحد من التاريخ إلى UART ** // void UART_send_char (char bt) {while (! TXIF)؛ // امسك البرنامج حتى يصبح TX buffer مجانيًا TXREG = bt ؛ // تحميل المخزن المؤقت لجهاز الإرسال بالقيمة المستلمة} // _____________ نهاية الوظيفة ________________ //
بمجرد تهيئة الوحدة ، سيتم إرسال أي قيمة يتم تحميلها في السجل TXREG عبر UART ، ولكن قد يتداخل الإرسال. ومن ثم يجب علينا دائمًا التحقق من علامة مقاطعة الإرسال TXIF. فقط إذا كانت هذه البتة منخفضة ، فيمكننا المضي قدمًا في البت التالي للإرسال وإلا يجب أن ننتظر حتى تنخفض هذه العلامة.
ومع ذلك ، يمكن استخدام الوظيفة أعلاه فقط لإرسال بايت واحد فقط من البيانات ، ولإرسال سلسلة كاملة ، يجب استخدام الوظيفة أدناه
// ** وظيفة لتحويل السلسلة إلى بايت ** // void UART_send_string (char * st_pt) {while (* st_pt) // إذا كان هناك char UART_send_char (* st_pt ++) ؛ // معالجتها كبيانات بايت} // ___________ نهاية الوظيفة ______________ //
قد يكون فهم هذه الوظيفة صعبًا بعض الشيء نظرًا لأنها تحتوي على مؤشرات ، لكن ثق بي ، فالمؤشرات رائعة وتجعل البرمجة أكثر سهولة وهذا مثال جيد على ذلك.
كما تلاحظ ، قمنا باستدعاء UART_send_char () ولكن الآن داخل حلقة while. لقد قسمنا السلسلة إلى أحرف فردية ، في كل مرة يتم استدعاء هذه الوظيفة ، سيتم إرسال حرف واحد إلى TXREG وسيتم نقله.
استقبال البيانات باستخدام UART:
يمكن استخدام الوظيفة التالية لتلقي البيانات من وحدة UART:
// ** وظيفة للحصول على بايت واحد من التاريخ من UART ** // char UART_get_char () {if (OERR) // تحقق من وجود خطأ {CREN = 0 ؛ // إذا كان الخطأ -> إعادة تعيين CREN = 1 ؛ // If error -> Reset} while (! RCIF)؛ // امسك البرنامج حتى يصبح RX buffer مجانيًا مقابل RCREG ؛ // تلقي القيمة وإرسالها إلى الوظيفة الرئيسية} // _____________ نهاية الوظيفة ________________ //
عندما تستقبل وحدة UART البيانات ، فإنها تلتقطها وتخزنها في سجل RCREG. يمكننا ببساطة نقل القيمة إلى أي متغير واستخدامها. ولكن قد يكون هناك خطأ تداخل أو قد يرسل المستخدم البيانات بشكل مستمر ولم نقم بنقلها بعد إلى متغير.
في هذه الحالة ، يأتي بت RCIF لعلامة الاستلام للإنقاذ. ستنخفض هذه القيمة كلما تم استلام البيانات ولم تتم معالجتها بعد. ومن ثم نستخدمه في حلقة while ، مما يؤدي إلى تأخير في الاحتفاظ بالبرنامج حتى نتعامل مع هذه القيمة.
تبديل LED باستخدام وحدة UART من PIC Microcontroller:
الآن دعنا نصل إلى الجزء الأخير من البرنامج ، الوظيفة الرئيسية (الفراغية) ، حيث سنقوم بتبديل مؤشر LED عبر الكمبيوتر باستخدام اتصال UART بين PIC والكمبيوتر.
عندما نرسل حرف "1" (من الكمبيوتر) ، سيتم تشغيل مؤشر LED وسيتم إرسال رسالة الحالة "RED LED -> ON" (من PIC MCU) إلى الكمبيوتر.
وبالمثل نرسل حرف "0" (من الكمبيوتر) سيتم إيقاف تشغيل مؤشر LED وسيتم إرسال رسالة الحالة "RED LED -> OFF" (من PIC MCU) إلى الكمبيوتر.
while (1) // حلقة لانهائية {get_value = UART_get_char () ؛ if (get_value == '1') // إذا أرسل المستخدم "1" {RB3 = 1 ؛ // قم بتشغيل LED UART_send_string ("RED LED -> ON") ؛ // أرسل إشعارًا إلى الكمبيوتر UART_send_char (10) ؛ تستخدم // قيمة ASCII 10 لإرجاع السطر (للطباعة في سطر جديد)} إذا (get_value == '0') // إذا أرسل المستخدم "0" {RB3 = 0 ؛ // إيقاف تشغيل LED UART_send_string ("RED -> OFF") ؛ // أرسل إخطارًا إلى الكمبيوتر UART_send_char (10) ؛ تستخدم // قيمة ASCII 10 لإرجاع أول السطر (للطباعة في سطر جديد)}}
محاكاة برنامجنا:
كالعادة ، دعونا نحاكي برنامجنا باستخدام البروتيوس ومعرفة ما إذا كان يعمل كما هو متوقع.
تُظهر الصورة أعلاه محطة افتراضية تعرض فيها رسالة ترحيب وحالة LED. يمكن ملاحظة أن مؤشر LED باللون الأحمر متصل بالدبوس RB3. يمكن العثور على العمل التفصيلي للمحاكاة في الفيديو في النهاية.
إعداد الأجهزة واختبار الإخراج:
اتصال هذه الدائرة بسيط حقًا ، فنحن نستخدم لوحة PIC Perf الخاصة بنا ونقوم فقط بتوصيل الأسلاك الثلاثة بمحول RS232 إلى USB وتوصيل الوحدة بجهاز الكمبيوتر الخاص بنا باستخدام كابل بيانات USB كما هو موضح أدناه.
بعد ذلك نقوم بتثبيت تطبيق Hyper Terminal (قم بتنزيله من هنا) وفتحه. يجب أن تظهر شيئًا كهذا
افتح الآن Device Manager على جهاز الكمبيوتر الخاص بك وتحقق من منفذ Com الذي تتصل به وحدتك ، فإن المنفذ الخاص بي متصل بمنفذ COM 17 كما هو موضح أدناه
ملاحظة: قد يتغير اسم منفذ COM للوحدة النمطية الخاصة بك وفقًا للبائع الخاص بك ، فهذه ليست مشكلة.
عد الآن إلى Hyper Terminal Application وانتقل إلى إعداد -> تكوين المنفذ أو اضغط على Alt + C ، للحصول على المربع المنبثق التالي وحدد المنفذ المطلوب (COM17 في حالتي) في النافذة المنبثقة وانقر فوق اتصال.
بمجرد إنشاء الاتصال ، قم بتشغيل لوحة أداء PIC وسترى شيئًا كهذا أدناه
احتفظ بالمؤشر في نافذة الأوامر وأدخل 1 ثم اضغط على Enter. سيتم تشغيل LED وسيتم عرض الحالة كما هو موضح أدناه.
بالطريقة نفسها ، احتفظ بالمؤشر في نافذة الأوامر وأدخل 0 ثم اضغط على Enter. سيتم إيقاف تشغيل مؤشر LED وسيتم عرض الحالة كما هو موضح أدناه.
فيما يلي الكود الكامل والفيديو التفصيلي ، والذي سيوضح كيف يستجيب مؤشر LED في الوقت الفعلي لـ "1" و "0".
هذا كل شيء يا رفاق ، لقد قمنا بتوصيل PIC UART بجهاز الكمبيوتر الخاص بنا ونقلنا البيانات لتبديل LED باستخدام Hyper Terminal. آمل أن تكون قد فهمت ، إذا لم يكن الأمر كذلك ، فاستخدم قسم التعليقات لطرح استفسارك. في البرنامج التعليمي التالي ، سنستخدم UART مرة أخرى ولكن نجعلها أكثر إثارة باستخدام وحدة Bluetooth وبث البيانات عبر الهواء.
تحقق أيضًا من اتصال UART بين اثنين من وحدات التحكم الدقيقة ATmega8 واتصال UART بين ATmega8 و Arduino Uno.