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

   

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,134
نشاط [ geniusse01 ]
قوة السمعة:
قديم 21-01-2012, 11:00 PM المشاركة 17   
افتراضي القراءة من خلال بروتوكول I2C



السلام عليكم

نكمل اليوم مشوارنا بالحديث عن بروتوكول نقل الداتا I2C وخصائصه ، في المشاركات السابقة قمنا بتوضيح كيفية الكتابة باستخدام هذا البروتوكول ، واليوم ان شاء الله سنوضح طريقة القراءة باستخدام هذا البروتوكول .

ان تسلسل عملية القراءة لا تتم بنفس تسلسل عملية الكتابة ، وهذا يرجع لسبب رئيسي واحد : وهو انه لا يوجد طريقة للقراءة من عنوان محدد في الذاكرة ، بل نحن نحتاج ان نقوم بتحميل العنوان الذي سنقرأ منه اولا (وهذا يتم باستخدام تسلسل عملية الكتابة المستخدمة في المشاركات السابقة ) وبعدها نبدأ عملية القراءة .

تتم عملية القراءة من الايبروم بطريقتين :

1 - قراءة بايت واحد فقط من الايبروم (Byte Read) .
2 - قراءة عدة بايتات متتالية من الايبروم (Page Read ) .

نبدأ مع النوع الاول وهو :

1 - كيفية قراءة بايت واحد من الايبروم ( Byte Read) :

ان عملية القراءة من مكان محدد باستخدام هذا البروتوكول موضحة في الصورة التالية:


[url=http://www.0zz0.com][/url]

تتكون عملية القراءة من قسمين ، القسم الايسر المحدد باللون الازرق تم شرحه سابقا من خلال عملية الكتابة ، ووظيفته وضع مؤشر الموقع في المكان الذي سيتم القراءة منه كالتالي:

1 - ارسال اشارة بدء الارسال ( START ) من قبل الماستر .
2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم ,اما البت الثامن فيساوي الصفر ، وهكذا يفهم الخادم بان العملية هي عملية كتابة الى الايبروم ،, بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .
3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

نلاحظ ان هذه الخطوات هي نفس الخطوات المستخدمة للكتابة الى الايبروم ولكن مع الغاء اخر خطوة ، الان اصبح مؤشر الموقع في المكان الذي نريد التعامل معه .

الان نبدا عملية القراءة من الموقع بعد ان قمنا بتحديد مكان مؤشر الموقع ، وهذا محدد في القسم الايمن المحدد باللون الاحمر كالتالي:
1 - يقوم الان الماستر بارسال اشارة بدء ارسال (START) مرة اخرى .
2 – يقوم الماستر بارسال البايت ( BYTE1’) وهو نفس البايت الاول ( BYTE1) الذي يحدد العنوان المميز للخادم مع اختلاف واحد ، فالبت الثامن اصبح يحتوي القيمة ( 1 ) مما يعني ان العملية هي قراءة من الايبروم،بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال للعنوان تمت بنجاح .
3 – الان جاء دور الايبروم لارسال الداتا الى الماستر ( ان جميع البتات السابقة كان يتم ارسالها من الماستر باتجاه الخادم وكان الخادم يرد باشارة ACK ) اما الان فان الخادم ( الايبروم ) هو الذي سيقوم بارسال الداتا باتجاه الماستر ، حيث يقوم الخادم بارسال البايت ( BYTE3) الذي تم تحديد عنوانه في البداية ، بعد استقبال البايت يرد الماستر بعدم ارسال اشارة وهذا يدعى (NO ACK) أي عدم ارسال اشارة علم ..السؤال الان لماذا يقوم الماستر بعدم ارسال الاشارة للخادم ؟؟؟
الجواب كالتالي: بما ان الخادم يقوم بعملية الارسال ، فهذه طريقة حتى يقوم الماستر باخبار الخادم باكمال عملية ارسال البايتات او بايقاف العملية ..وهكذا فان ( NO ACK) تخبر الخادم بالتوقف عن ارسال البايتات.
4- تنتهي عملية قراءة الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .


تمرين 3: قم بعمل برنامج باستخدام الميكروسي يقوم بقراءة القيمة من الموقع رقم 530 داخل الايبروم 24C16 وحفظها في المتغير ( X ) وذلك باستخدام بروتوكول النقل I2C .

كما قلنا نقوم بتحديد التردد المستخدم 100 كيلو هيرتز من خلال الميكروسي كالتالي:
كود:
 
I2C1_Init(100000);
نقوم بتحديد البايتات اللازمة لعملية الكتابة الى الايبروم .

البايت الاول BYTE1 : البتات الاربعة الاولى ثابة وهي ( 1010( والبت الثامن يساوي صفر لانها عملية كتابة . الان نحدد البتات الثلاث الباقية من العنوان المطلوب التعامل معه :

كود:
530 = 01000010010
وهكذا يكون البايت الاول هو :

كود:
BYTE1 = 1010 010 0 = A4 (Hex)
البايت الثاني هو :

كود:
BYTE2 = 00010010 = 12( Hex)
هذه البايتات اللازمة لتحديد الموقع من خلال تسلسل عملية الكتابة وهكذا يكون البرنامج الى هنا كالتالي:
كود:
 
Char x; Void main () { I2C1_Init(100000); I2C1_Start(); I2C1_Wr(0xA4); I2C1_Wr(0x12); .... }
الان يجب اعادة ارسال اشارة ( START) مرة اخرى وهذا يستخدم امر جديد هو :

I2C1_Repeated_Start();

الان نكمل عملية القراءة .

البايت BYTE1’ : هو نفس البايت الاول مع اختلاف البت الثامن ، فالبت الثامن يساوي 1 ، وهكذا يعرف الخادم بان العملية هي عملية قراءة :
كود:
BYTE1’ = 1010 010 1 = A5(Hex)
البايت الثالث BYTE3 : هو البايت الذي سيتم قراءته من الايبروم وستم حفظه في المتغير ( X ) من خلال امر القراءة :
X = I2C1_Read ( 0 ) ;

كما قلنا فان الماستر يرسل ( NO ACK ) بعد استقبال البايت وهذا يعني وضع القيمة صفر في الاقواس داخل امر القراءة . هكذا يكون البرنامج كاملا كالتالي:
كود:
 
Char x; Void main () { I2C1_Init(100000); I2C1_Start(); I2C1_Wr(0xA4); I2C1_Wr(0x12); I2C1_Repeated_Start();I2C1_Wr(0xA5); X=I2C1_Read(0); I2C_Stop }
في البرنامج السابق تمت قراءة الموقع 530 في الايبروم ثم حفظه في المتغير x .. يمكن استخدام القيمة المقروءة في أي عملية نحتاجها . فمثلا يمكن قراءتها واظهارها على الاطراف الخارجية وغيرها من الوظائف .ننتقل الى النوع الثاني وهو :

2 - قراءة عدة بايتات متتالية من الايبروم (Page Read ) .
لا تختلف عملية قراءة عدة بايتات متتالية عن طريقة بايت واحد كثيرا .. والصورة التالية توضح ذلك :

[url=http://www.0zz0.com][/url]

تتكون عملية القراءة من قسمين ، القسم الايسر المحدد باللون الازرق تم شرحه سابقا من خلال عملية الكتابة ، ووظيفته وضع مؤشر الموقع في المكان الذي سيتم القراءة منه كالتالي:

1 - ارسال اشارة بدء الارسال ( START ) من قبل الماستر .
2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم ,اما البت الثامن فيساوي الصفر ، وهكذا يفهم الخادم بان العملية هي عملية كتابة الى الايبروم ،, بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .
3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

نلاحظ ان هذه الخطوات هي نفس الخطوات المستخدمة للكتابة الى الايبروم ولكن مع الغاء اخر خطوة ، الان اصبح مؤشر الموقع في المكان الذي نريد التعامل معه .

الان نبدا عملية القراءة من الموقع بعد ان قمنا بتحديد مكان مؤشر الموقع ، وهذا محدد في القسم الايمن المحدد باللون الاحمر كالتالي:
1 - يقوم الان الماستر بارسال اشارة بدء ارسال (START) مرة اخرى .
2 – يقوم الماستر بارسال البايت ( BYTE1’) وهو نفس البايت الاول ( BYTE1) الذي يحدد العنوان المميز للخادم مع اختلاف واحد ، فالبت الثامن اصبح يحتوي القيمة ( 1 ) مما يعني ان العملية هي قراءة من الايبروم،بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال للعنوان تمت بنجاح .
3 – الان جاء دور الايبروم لارسال الداتا الى الماستر ( ان جميع البتات السابقة كان يتم ارسالها من الماستر باتجاه الخادم وكان الخادم يرد باشارة ACK ) اما الان فان الخادم ( الايبروم ) هو الذي سيقوم بارسال الداتا باتجاه الماستر ، حيث يقوم الخادم بارسال البايت ( BYTE3) الذي تم تحديد عنوانه في البداية ، بعد استقبال البايت الاول يرد الماستر باشارة علم ACK والتي تعني للخام ان يستمر بارسال البايت في الموقع التالي ، وهكذا يستمر الخادم في ارسال البايتات المتتالية حتى يستقبل اشارة ( NO ACK) عندها يتوقف الخادم عن ارسال البايتات .
4- تنتهي عملية قراءة الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .
نلاحظ ان العملية هي نفسها مع اختلاف بسيط وهو انه بدلا من ارسال اشارة NO ACK بعد قراءة البايت الاول فان الماستر يرسل ACK باستمرار حتى يحصل على اخر بايت عندها يرسل NO ACK ليوقف الخادم عن ارسال البايت التالي ..
تمرين 4: قم بعمل برنامج باستخدام الميكروسي يقوم بقراءة 3 قيم ابتداء من الموقع رقم 680 داخل الايبروم 24C16 وحفظها في المتغيرات ( X1,X2,X3 ) وذلك باستخدام بروتوكول النقل I2C .

كما قلنا نقوم بتحديد التردد المستخدم 100 كيلو هيرتز من خلال الميكروسي كالتالي:

كود:
I2C1_Init(100000);
نقوم بتحديد البايتات اللازمة لعملية الكتابة الى الايبروم .

البايت الاول BYTE1 : البتات الاربعة الاولى ثابة وهي ( 1010( والبت الثامن يساوي صفر لانها عملية كتابة . الان نحدد البتات الثلاث الباقية من العنوان المطلوب التعامل معه :

كود:
680 = 01010101000
وهكذا يكون البايت الاول هو :

كود:
BYTE1 = 1010 010 0 = A4 (Hex)
البايت الثاني هو :

كود:
BYTE2 = 1010 1000 = A8 ( Hex)
هذه البايتات اللازمة لتحديد الموقع من خلال تسلسل عملية الكتابة وهكذا يكون البرنامج الى هنا كالتالي:
كود:
 
Char x; Void main () { I2C1_Init(100000); I2C1_Start(); I2C1_Wr(0xA4); I2C1_Wr(0xA8); .... }
الان يجب اعادة ارسال اشارة ( START) مرة اخرى وهذا يستخدم امر جديد هو :

I2C1_Repeated_Start();

الان نكمل عملية القراءة .

البايت BYTE1’ : هو نفس البايت الاول مع اختلاف البت الثامن ، فالبت الثامن يساوي 1 ، وهكذا يعرف الخادم بان العملية هي عملية قراءة :
BYTE1’ = 1010 010 1 = A5(Hex)

البايت الثالث BYTE3 : نقرأ اول بايت ونحفظه في المتغير ( X1 ) من خلال امر القراءة :
كود:
 
X1 = I2C1_Read ( 1 ) ; X2 = I2C1_Read ( 1 ) ; X3 = I2C1_Read ( 0 ) ;
يقوم الماستر بارسال اشارة ACK بعد قراءة البايت الاول وهكذا يحتوي امر القراءة على 1 مما يعني للخادم اكمل ارسال البايت التالي ، بعدها يقوم الماستر بارسال ACK بعد قراءة البايت الثاني وهكذا يحتوي امر القراءة على 1 مما يعني للخادم اكمل ارسال البايت التالي ، اخيرا يقوم الماستر بعدم ارسال اشارة ( NO ACK ) بعد قراءة البايت الثالث مما يعني للخادم اوقف ارسال البيت التالي وهكذا يحتوي امر القراءة على 0 .هكذا يكون البرنامج كاملا كالتالي:
كود:
 
Char x; Void main () { I2C1_Init(100000); I2C1_Start(); I2C1_Wr(0xA4); I2C1_Wr(0xA8); I2C1_Repeated_Start();I2C1_Wr(0xA5); X1=I2C1_Read(1); X2=I2C1_Read(1); X3=I2C1_Read(0); I2C_Stop }
في حال وجود أي استفسار فلا تترددوا بالسؤال عن أي نقطة غير واضحة ..واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 21-01-2012 الساعة 11:14 PM
اعلانات

ياسر الجبوري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2007
الدولة: العراق
المشاركات: 85
نشاط [ ياسر الجبوري ]
قوة السمعة:
قديم 22-01-2012, 05:08 PM المشاركة 18   
افتراضي


اكثر من رائع
والله كنت خايف ان لا يتم اكمال هذا الموضوع (المهم و الرائع بطريقة شرحه)الى نهايته اذا كانت له نهاية
بارك الله فيك

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

chaalali
:: مهندس متواجد ::
تاريخ التسجيل: Nov 2009
المشاركات: 72
نشاط [ chaalali ]
قوة السمعة:
قديم 24-03-2012, 04:56 PM المشاركة 19   
افتراضي هيثم


السلام عليكم ورحمة الله وبركاته

لقد قمت بتطبيق هذه الأمثلة على الميكرسي ولكنها لم تنجح فهناك العديد من الأخطاء أرجوا تبين طريقة البرمجة على الكرسي وشكرا


ياسر الجبوري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2007
الدولة: العراق
المشاركات: 85
نشاط [ ياسر الجبوري ]
قوة السمعة:
قديم 24-03-2012, 06:58 PM المشاركة 20   
افتراضي


السلام عليكم ورحمة الله وبركاته

لقد قمت بتطبيق هذه الأمثلة على الميكرسي ولكنها لم تنجح فهناك العديد من الأخطاء أرجوا تبين طريقة البرمجة على الكرسي وشكرا
انا كذلك واجهتني نفس المشكلة


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,134
نشاط [ geniusse01 ]
قوة السمعة:
قديم 24-03-2012, 08:07 PM المشاركة 21   
افتراضي


السلام عليكم ورحمة الله وبركاته

لقد قمت بتطبيق هذه الأمثلة على الميكرسي ولكنها لم تنجح فهناك العديد من الأخطاء أرجوا تبين طريقة البرمجة على الكرسي وشكرا
السلام عليكم

هناك مشكلة عند شرح برنامج .. فالبعض يستخدم برنامج الميكروسي وهو الذي تمت عليه معظم الشروحات مثل شرح اخونا احمد سمير ... هنا استخدمت برنامج الميكروسي برو وهي نسخة محدثة قليلا عن السابقة ...يمكنك التاكد من المساعدة المرفقة مع البرنامج ... بجميع الاحوال قم بتجربة التالي :

في الشرح تلاحظ ان الاوامر تحتوي على الرقم1 مثلا I2C1_read .. قم بحذفها في البرنامج لتصبح مثلا I2C_read فقط ... ارجو لك التوفيق..

واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..



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