 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:332
|
|
02-07-2017, 07:56 PM
المشاركة 1
|
|
الاتصالات التسلسلية Serial Communications
مقدمة :
تطبيقات الميكروكونترولر قد تتطلب فى بعض الحالات تنفيذ إقامة اتصالات تسلسلية مع غيره من أجهزة نقل البيانات مثل الذاكرات memories وأجهزة الاستشعار sensors والكومبيوتر وحتى ميكروكونترولر آخر .
بغرض إجراء الاتصالات التسلسلية ، بعض الميكروكونترولر يكون بها وحدات (تسمى موديولات modules ) مثل :
I2C, SPI, USART, USB . كل من هذه الأشكال من الاتصالات يسمح بالاتصال بالوحدات الأخرى . الاتصال من خلال I2C يعتبر نموذجيا للاتصال بالذاكرات التسلسلية مثل : 24LC64, 24LC128, 24LC512 وغيرها . يستخدم البروتوكول SPI للاتصال مع أجهزة التخزين الكبيرة مثل الذاكرة SD . الوحدة USART هى أكثر الوحدات إستخداما ، هذه الوحدة تسمح بالاتصال بالأجهزة مثل أجهزة الاستشعار ووحدات الإرسال والاستقبال Xbee والكومبيوتر الشخصى ووحدات GPS والمتحكمات الآخرى . وأخيرا وحدة USB ، والموجودة ضمن بناء قليل من المتحكمات مثل 18F2550 و 18F4550 ، تسمح بالاتصال مع الكومبيوتر الشخصى من خلال منفذ USB وتعرف باسم HID " جهاز واجة الانسان" Human Interface Device .
الوحدة (الموديول) USART :
الموديول USART هو وحدة اتصال تسلسلى غير متزامن ، هذه الميزة تجعل الطلب علية كبير حيث لا يحتاج لإشارة الساعة . ميزة أخرى ، أنه ثنائى الاتجاه بمعنى أنه يمكنه إرسال واستقبال المعلومات فى وقت واحد. لهذا الغرض فهو يستخدم خطين لنقل المعلومات ، أحدهما للإرسال والآخر للاستقبال . خواص بروتوكول هذا الاتصال هى:
"نبضة بدء" start bit وهى دائما بالمنطق المنخفض logic 0 و 8 أو 9 بت من البيانات data و واحد 1 أو1.5 أو 2 بتات إنتهاء stop bits . وأخيرا يجب تحديد سرعة النقل بنفس القيمة فى كل من الجهازين المتصلين وهى فى الحالة الافتراضية 9600 bps (ليست قاعدة) .
المخطط التالى يبين سلوك نقل البيانات باستخدام هذا البروتوكول :

يستخدم هذا البروتوكول بالكومبيوتر الشخصى وبالأجهزة الأخرى وهو معروف بالبروتوكول RS232 ، ويستخدم مستويات جهد محددة والتى تختلف عن مستويات الجهد التى يستخدمها الميكروكونترولر . فى البروتوكول RS232 يكون المنطق صفر بقيمة الجهد +12 volts ويكون المنطق واحد بقيمة الجهد-12 volts . الكومبيوتر الشخصى والأجهزة الأخرى التى تتعامل مع المنفذ RS232 ، تستخدم وصلة DB9 وبها 9 طرف معرفة كما فى الشكل التالى :

للاتصال الغير متزامن يجب إعداد التوصيلات كما فى الشكل التالى :
لعمل إتصال وربط الميكروكونترولر PIC مع جهاز به RS232 ، يستخدم المحول المعروف MAX232 . يجب أن يتم تنفيذ ذلك كما فى الشكل التالى :

لاستخدام بروتوكول هذا الاتصال ، يتضمن مترجم الميكروسى المكتبة UART والتى تحتوى على الدوال الأتية :
الدالة :
كود:
UART1_Init (const unsigned long baud_rate);
تستخدم هذه الدالة لتهيئة (إعداد) الموديول USART وتحديد سرعة الاتصال عن طريق البارامتر baud_rate .
مثال :
كود:
// Initialize hardware UART1 and establish communication at 9600 bps
UART1_Init(9600);
الدالة :
كود:
char UART1_Data_Ready();
تستخدم هذه الدالة فى اختبار ما إذا كان هناك بيانات بحافز buffer الاستقبال جاهزة للقراءة فتعود بواحد (1) وإلا فإن لم توجد بيانات فى حافز الاستقبال عادت بالصفر (0) .
مثال :
كود:
// If data is ready, read it:
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
}
الدالة :
كود:
char UART1_Tx_Idle();
تستخدم هذه الدالة فى اختبار ما إذا كان مسجل الإزاحة للإرسال فارغ (أى تم إرسال البيانات) فتعود بواحد أما إذا كان هناك بيانات فى مسجل الإزاحة للإرسال والموديول جاهز لإرسال بيانات جديدة فتعود بالصفر .
مثال :
كود:
// If the previous data has been shifted out, send next data:
if (UART1_Tx_Idle() == 1) {
UART1_Write(_data);
}
الدالة :
تستخدم هذه الدالة فى استقبال (قراءة) بايت من حافز الدخل وتعود بقيمته.
كود:
// If data is ready, read it:
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
}
الدالة :
كود:
UART1_Read_Text (char * Output, char *Delimiter, char Attempts);
تستخدم هذه الدالة فى قراءة سلسلة (تتابع) الحروف المخزنة بالمتغير المشار إلية بالبارامتر Output حتى يتم كشف تسلسل بشكل محدد delimiter sequence مبين بالبارامتر Delimiter . البارامتر Attempts يحدد عدد الحروف المتوقعة (طول النص) بالتسلسل المحدد . هذه الدالة تستدعى كوحدة واحدة حيث يتم تنفيذها عند وجود تتابع سلسلة الحروف بالشكل المحدد فإذا لم يوجد التتابع بالشكل المحدد يتم الخروج من الإجراء الموجود به الدالة .
مثال :
كود:
UART1_Init(4800); // initialize UART1 module
Delay_ms(100);
while (1) {
if (UART1_Data_Ready() == 1) { // if data is received
UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text
}
}
الدالة :
كود:
UART1_Write(char _data);
تستخدم هذه الدالة فى إرسال بايت البيانات الموجود بالمتغير _data من خلال موديول UART .
مثال :
كود:
unsigned char _data = 0x1E;
...
UART1_Write(_data);
الدالة :
كود:
UART1_Write_Text(char * UART_text);
تستخدم هذه الدالة فى إرسال نص خلال UART ويجب أن ينتهى النص بالصفر 0 . هذا النص معطى بالبارامتر UART_text .
مثال :
كود:
UART1_Init(4800); // initialize UART1 module
Delay_ms(100);
while (1) {
if (UART1_Data_Ready() == 1) { // if data is received
UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text
}
}
|