قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 03-05-2015, 04:55 PM المشاركة 49   
افتراضي الاتصال التسلسلى للميكروكونترولر PIC16 من خلال الوحدة UART :



الاتصال التسلسلى للميكروكونترولر PIC16 من خلال الوحدة UART :
المحتويات :
• دوال المنفذ RS232 .
• المحاكاة ببرنامج ISIS .
يتم توفير الاتصال الاتصال التسلسى بواسطة الوحدة (الموديول) UART الموجود ضمن البناء الداخلى للميكروكونترولر . يمكن استخدام أى زوج من الأطراف لهذا الغرض حيث أن معدل البيانات منخفض جدا مما يسمح بتوليد الإشارات برمجيا . وعلى الرغم مع ذلك ، تم توفير منفذ هاردوير ( موديول UART) مخصص لهذه المهمة ، والذى يجب أن يستخدم إذا كان هناك حاجة لاستخدام المقاطعة .
الجدول التالى يبين مكتبة المترجم CCS C المرتبطة بالمنفذ UART :



يمكن اختبار المنفذ UART فى نظام المحاكاة من خلال توصيله بالوحدة الطرفية المتوفرة فى برمجيات Proteus (ISIS) كما هو مبين بالشكل أدناه .



طرف دخل الوحدة الطرفية RXD (استقبال البيانات) ، يتم توصيله بالطرف TX (إرسال) بالميكروكونترولر ، وطرف خرج الوحدة الطرفية TXD (إرسال البيانات) ، يتم توصيله بالطرف RX (استقبال) بالميكروكونترولر . المحطة الطرفية بها خطوط مصافحة handshaking إضافية (تحكم فى الإرسال) ، وهى RTS و CTS ، لكننا عادة لا نحتاج لها .
البرنامج التالى لتحقيق الاتصال والمحاكاة بين الميكروكونترولر والوحدة الطرفية :

كود:
// Serial I/O using hardware RS232 port
#include <16F877A.h>
#use delay(clock= 8000000) // Delay function needed for RS232
#use rs232(UART1) // Select hardware UART
void main() //************************************
{
int incode;
setup_uart(9600); // Set baud rate
while(1)
{ incode = getc(); // Read character from UART
printf( " ASCII = %d " ,incode); // Display it on
putc(13); // New line on display
}
}
فى هذا البرنامج :
• تستخدم الدالة getc() لقراءة حرف character من الوحدة الطرفية ، فهى تنتظر من أجل مدخلات المستخدم . يجب تفعيل (تنشيط) الوحدة الطرفية عن طريق النقر بداخل نافذة الوحدة الطرفية ، وعندئذ توفر لوحة مفاتيح الكمبيوتر المدخلات للميكروكونترولر بما يناظر أكواد أسكى المناظرة ، حيث يتم تخصيص هذه المدخلات إلى المتغير incode ، كلما وصلت incode = getc(); .
• يمكن أخراج (عرض) كود أسكى باستخدام الدالة printf() . إذا تم تشكيل خرج هذه الدالة ليكون بالنظام العشرى %d ، فإنه يتم عرض القيمة العددية لكود الحرف . أما إذا تم تشكيل الخرج ليكون فى شكل الحرف %c ، فإنه يتم عرض الحرف نفسه .
• الدالة putc(13) تخرج كود من أجل العودة لسطر جديد على الشاشة .
إذا تم استخدام الدالة putc() لإخراج كود أسكى ، فإنه يتم عرض الحرف .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 04-05-2015, 04:02 AM المشاركة 50   
افتراضي استخدام الموديول USART لتحقيق الاتصال التسلسلى بين PIC و PIC :


استخدام الموديول USART لتحقيق الاتصال التسلسلى بين PIC و PIC :
يتم إعداد هذا الموديول باستخدام التوجيه #use RS232(options) . هذا التوجيه يسمح بإعداد البارامترات (options) المختلفة للموديول USART مثل : سرعة الإرسال ، الأطراف المستخدمة ، وغيرها . يجب استخدام التوجيه #use delay لأنه يدخل فى حسابات الدوال الأخرى مثل getch , putchar , printf .

تدريب : تحقيق الاتصال بين ميكروكونترولر PIC وميكروكونترولر PIC آخر باستخدام الموديول USART :



برنامج الميكروكونترولر المرسل :

كود:
#include <16F876.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7) // Define speed and pins
#include <LCD.C>
#define use_portb_lcd TRUE

void main() {

   int value;

   lcd_init();
   
while(1){
   for (value=0;value<10;value++) {
     PUTC(value);
     printf(lcd_putc,"\fSend=%1D",value);
     delay_ms(500);
       }
    }
}
فى هذا الجزء من البرنامج والذى يتم تحميله على الميكروكونترولر المرسل :
يتم استخدام التوجيه #use rs232 ويجب تحديد معدل البود (سرعة تبادل البيانات) ، بالصيغة baud=9600 ، وتحديد طرف الإرسال ، بالصيغة وهو هنا xmit=pin_c6 ، وطرف الاستقبال بالصيغة rcv=pin_c7 ، وجميعها وسائط للتوجيه السابق وبهذا نخبر المترجم حتى يقوم إعداد الاتصال التسلسلى . هذا التوجيه يجب أن يكون مسبوقا بالتوجيه #use delay ، والذى يحدد معدل الساعة فى النظام المستخدم .
يقوم البرنامج بإرسال قيمة المتغير value عبر المنفذ التسلسلى (المعد مسبقا بالتوجيهات) باستخدام الدالة PUTC(value) حيث يرسل تباعا القيم 0,1,2…..9 . كما يتم عرض هذه القيم على وحدة LCD متصلة بنفس الميكروكونترولر باستخدام الدالة printf() .

برنامج الميكروكونترولر المستقبل :

كود:
#include <16F876.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#define use_portb_lcd TRUE
#include <LCD.C>

int value;

#int_RDA
RDA_isr() 
{
 value=GETC();
}

void main() {

   lcd_init();
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

for (;;) {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Receive=%1D",value);
   }
}
فى هذا الجزء من البرنامج والذى يتم تحميله على الميكروكونترولر المستقبل :
• يتم إعداد المنفذ التسلسلى كما فى الجزء السابق .
• يستخدم البرنامج المقاطعة بالاتصال التسلسلى ( عند توافر بيانات مستقبلة) ، ويعلن عن ذلك بالتوجيه #int_RDA والدالة التى تأتى بعده مباشرة هى روتين خدمة هذه المقاطعة RDA_isr() ، وفيها نحصل على الحرف المتواجد على المنفذ التسلسلى باستخدام الدالة value=GETC() .
• فى الدالة الرئيسية يتم تمكين هذه المقاطعة وكذلك تمكين المقاطعات عامة .
• تستخدم الدالة printf() لعرض البيانات المستقبلة على وحدة LCD المتصلة بالميكروكونترولر المستقبل .

http://fathallaabdelaziz.forumarabia.com/


اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 04-05-2015, 02:22 PM المشاركة 51   
افتراضي


تحية طيبة وبعد

اسمح لي أن أقدم لك كل التقدير والشكر لما تقدمه من تعب واستمرار في تقديم الفائدة.

هل أستطيع التواصل معك عبر البريد في حال الضرورة؟

أشكرك مجددا رغم أن كلمة الشكر لا تفيك حقك

ولكن شكرا


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 04-05-2015, 04:00 PM المشاركة 52   
افتراضي


تحية طيبة وبعد

اسمح لي أن أقدم لك كل التقدير والشكر لما تقدمه من تعب واستمرار في تقديم الفائدة.

هل أستطيع التواصل معك عبر البريد في حال الضرورة؟

أشكرك مجددا رغم أن كلمة الشكر لا تفيك حقك

ولكن شكرا
أخى الكريم شكرا جزيلا لك

العنوان

fathallaabdelaziz2*gmail.com

ملحوظة :
لا افتح البريد إلا على فترات متباعدة

مع تمنياتى بدوام التوفيق


الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 04-05-2015, 04:04 PM المشاركة 53   
افتراضي


http://www.4shared.com/download/xl8Z....PNG?lgfp=3000

ارجو ان تشرح لي سبب ظهور هذا التحذير


الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 04-05-2015, 04:06 PM المشاركة 54   
افتراضي


أخى الكريم شكرا جزيلا لك

العنوان

fathallaabdelaziz2*gmail.com

ملحوظة :
لا افتح البريد إلا على فترات متباعدة

مع تمنياتى بدوام التوفيق
أشكرك لردك اللطيف ويكفيني تجاوبك ولا يهم الوقت

فعندما تفتح بريدك عندها اعرف انك سترد علي

بالتوفيق لك ايضا


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 04-05-2015, 05:09 PM المشاركة 55   
افتراضي


مجرد كتابة void قبل الدالة يحل مشكلة التحذير كما بلى

كود:
#int_RDA
void RDA_isr() 
{
 value=GETC();
}


الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 05-05-2015, 01:51 AM المشاركة 56   
افتراضي


شكرا لك
لقد تم حل مشكلة التحذير وعمل البرنامج كما يجب



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:38 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)