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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 25-11-2013, 07:31 PM المشاركة 9   
افتراضي



السلام عليكم
هذا هو كود الاستقبال البيانات من المرسل
https://www.mediafire.com/download/i...IR_receive.rar


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 25-11-2013 الساعة 08:21 PM
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 25-11-2013, 08:18 PM المشاركة 10   
افتراضي


وهذا على رابط أخر
http://arabsh.com/files/0c364d4e65f7...ceive-rar.html

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 26-11-2013, 04:31 PM المشاركة 11   
افتراضي


السلام عليكم
اشرح لكم كود الاستقبال (( واذا أحد طلب شرح كود الارسال ايضا اشرحه له رغم كون كود سهل ولافيه تعقيد))

كود:
sbit relay1        at RB0_bit;
sbit relay1_dir    at TRISB0_bit;
sbit relay2        at RB1_bit;
sbit relay2_dir    at TRISB1_bit;
sbit led           at RB3_bit;
sbit led_dir       at TRISB3_bit;
هذا الكود تم تعريف ريلي 1 على بورت b في بن 0 وتم تعريف ريلي 2 على بورت b في بن 1 و وضعنا ليد على بورت b في بن 3

************************************************** *****
كود:
char IR_state=0 , IR_Timer_Count = 0 , ir_in=0 , x=0;
char IR_Bit_Count = 0 , IR_Byte_Count=0 ,IR_Received_Flag=0;
char IR_Received_byte[4];
char address=10;
هذه متغيرات تم أستخدامها في برنامج
char IR_state=0 متغير أستخدم في الامر switch-case وهو يمثل سير العمليه الاستقبال البيانات
IR_Timer_Count = 0 يمثل عداد لتايمر 1 وهو يعد كل 100us

ir_in=0 ويمثل حساس الاستقبال

char IR_Bit_Count = 0 يمثل عداد البتات bits حيث يتم فحص بت بت من كل بايت ولهذا نحتاج لهذا العداد

IR_Byte_Count=0 عداد البايتات لكون عدد البايتات التي تم ارسالها من المرسل هو 4

IR_Received_Flag=0 علم ليخبرنا أنه تم الاستقبال البيانات بنجاح


[char IR_Received_byte[4 مصفوفه لخزن البيانات المستقبله


char address=10 هذا يمثل العنوان الجهاز حيث البيانات التي تم ارسالها هو 10 ويمثل العنوان

يفضل دائما ان يتم خزن القيم التي يمكن ان تتغير في متغير سواء كان مخزون في رام او روم لماذا الجواب هو يمكنك ان تقارن العنوان الذي استلمته مع 10 مباشره ولكن ماذا ان غيرت العنوان جهاز الى مثلا 20 فأنت لابد من تغير كل الاوامر التي فيها مقارنه مع الرقم 10 ولكن لو حجزت متغير وضعت فيه اي رقم فأن برنامج سيتعامل مع هذا متغير ولهذا أفضل التعامل دائما مع متغيرات


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 26-11-2013, 04:59 PM المشاركة 12   
افتراضي


ندخل في القائمه الرئيسيه
كود:
cmcon=7;// OFF comparator
لالغاء المقارن كومبارتر

كود:
InitTimer1();// init timer1
تهيئه تايمر 1 وايضا يمكن تعامل مع
تايمر0 ولكن هذه المره نريد التعامل مع تايمر 1
وهذا هو كوده
كود:
//Timer1
//Prescaler 1:1; TMR1 Preload = 65335; Actual Interrupt Time : 100 us

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0xFF;
  TMR1L         = 0x37;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}
طبعا يمكن الحصول على كود جاهز من البرنامج الذي ذكرته في رابط التالي في مشاركه رقم 13
http://www.qariya.com/vb/showthread....885#post812885

كود:
relay1_dir=relay2_dir=led_dir=0;// set output
 relay1=relay2=led=0; // OFF all output;
جعلنا ريلي و ليد خرج وقمنا بأطفاء الخرج

كود:
for(x=0;x<20;x++)
                 {
                  led=1;
                  delay_ms(100);
                  led=0;
                  delay_ms(100);
                 }
هذا الكود يمثل عمل أضاءه ليد وأطفائه لغرض التاكد من أكمال التهيئه لكونك انت لا ترى شيئ يبين على سير البرنامج فأضاءه (( ليدات )) تساعدك في تحليل مشاكل

وبعدها ندخل في لوب مستمر
وفي داخل هذا لوب أختبار الشرط التالي
كود:
if (IR_Received_Flag == 1)
طبعا يمتى يتحقق هذا الشرط لما أستقبل كل البيانات ولكن دعونا نفترض أنه تم أستقبال كل البيانات والان نريد تحليل هذه البيانات أذن اذا تحقق الشرط المذكور معناها استقبلنا كل البيانات وهنا لابد من أيقاف الانتربت لكي تقارن البيانات مع الشفره واذا لم تلغي الانتربت فأنه بالتاكيد سيحدث مشكله وهو انه مايكرو كل 100 مايكرو سوف يذهب الى الانتربت لينفذ الاوامر ثم يعود وقد يؤثر على البيانات التي تم أستقبالها لهذا نكتب هذا الكود وريح بالنا
كود:
 TMR1IE_bit = 0;  // disable interupts
هسى تم الاستقبال البيانات ولكن ما الخطوه التاليه بالتاكيد تختبر هذه البيانات هل هي صحيحه ام لا لنرى الشرط
كود:
if ((IR_Received_byte[0] == ~IR_Received_byte[1]) && (IR_Received_byte[2] == ~IR_Received_byte[3]))
ماذا يعني هذا الشرط دعونا نرجع الى المرسل ونرى ماذا ارسل لنا من البيانات
كود:
   ir_byte[3] = ~IR_COmmand;
     ir_byte[2] =  IR_COmmand;
     ir_byte[1] = ~IR_Address;
     ir_byte[0] =  IR_Address;
ماذا ترون في مرسل الاول تم ارسال العنوان اذن بالتاكيد راح نستقبل البايت الاول وهو العنوان
بعدين المرسل ارسل معكوس العنوان ايضا مستقبل راح يستقبل البايت الثاني هو معكوس العنوان
لهذا ترون في الشرط
كود:
if ((IR_Received_byte[0] == ~IR_Received_byte[1])
وبعدين ارسل المرسل البايت الثالث ويمثل البيانات من المفروض المستقبل يقرا البايت الثالث
وبعدين المرسل ارسل البايت الرابع وهو معكوس البيانات وايضا المستقبل يستقبل البايت الرابع
ولهذا كتبنا في الشرط
كود:
(IR_Received_byte[2] == ~IR_Received_byte[3])
طبعا انا فصلت الشرط لكي أوضح لكم معناه وتلاحظون وضعنا علامه && وتعني و

الان أتوقف لان الان وقت الصلاه


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 26-11-2013, 06:19 PM المشاركة 13   
افتراضي


بسم الله الرحمن الرحيم
نكمل الموضوع
كود:
if (IR_Received_byte[0] == address) // correct address
هذا الشرط يختبر هل ان البايت الاول هو العنوان المحدد اذا كان نعم
ننفذ هذه الاوامر
كود:
switch (IR_Received_byte[2])// data store in IR_Received_byte[2]
                                                                           {

                                     case 1 :{ relay1 = 1; break;}       // turn on relay1 
                                    case 2 :{ relay1 = 0; break;}       // turn off relay1
                                     case 3 : {relay2= 1; break; }      // turn on relay2
                                  case 4 : {relay2 = 0; break; }      // turn off relay2
                                                                            }
وفي الكود أعلاه نختبر البايت الثالث والذي يمثل البيانات
ولو ترجع الى كود الارسال لترى اننا ارسلنا الشفره 1 و 2 و 3 و 4
اذا كان بايت الثالث (( البيانات ))=1 فسوف يعمل ريلي رقم 1
وأذا كانت البيانات =2 سوف يطفئ ريلي 1
اذا كان بايت الثالث (( البيانات ))=3 فسوف يعمل ريلي رقم2
وأذا كانت البيانات =4 سوف يطفئ ريلي2

وبالنهايه نجعل IR_Received_Flag = 0 حتى نهيئه داله لعمليه قراءه أخرى ولابد ان نفعل انتربت بعد أن قمنا بأيقافها لحين قراءه البيانات

كود:
IR_Received_Flag = 0;
                            TMR1IE_bit = 1; // enable interrupt


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 26-11-2013 الساعة 06:23 PM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 26-11-2013, 06:26 PM المشاركة 14   
افتراضي


بقي لنا كيف نقرأ البيانات
هذا يتم من خلال داله الانتربت اذا أفتهمتو فكره ستتمكنون بأذن من قراءه اي كود وموضوع بسيط بمشيئه الله
سنكمل الموضوع فيما بعد


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 28-11-2013, 03:48 PM المشاركة 15   
افتراضي


السلام عليكم
سأشرح ماتبقى بأختصار
طبعا نتعامل مع تايمر1 وعليه سنتعامل مع switch , case في العمليه القراءه
كود:
 switch (IR_State)
سيعتمد switch على متغير IR_State
بالبدايه IR_state=0 وعليه سوف يتحقق الكود الخاص بــ case 0 وهذا كوده
كود:
 IR_Timer_Count = 0;
                  if (ir_in == 0)IR_State = 1; // we have got mark signal
                  break;
بالطبع اول مايرسل ريموت نبضه 9ms وعليه يكون خرج =0 اي ir_in = 0 عندها جعلنا IR_State = 1 وكذلك قمنا بتصفير عداد تايمر IR_Timer_Count = 0
************************************************** *****
عندما IR_case=1 عندها سوف ننتقل الى case=1
طبعا لايزال مستقبل يستلم نبضه 9ms وعليه يكون خرجه=0 وحسب الكود
كود:
if (ir_in == 0) IR_Timer_Count ++;
نلاحظ طالما خرج =0 فالعداد تايمر يزداد بواحد كل 100us وبعدما تنتهي النبضه 9ms تاتي نبضه توقف مدتها 4.5ms وعليه يكون خرج مستقبل=1 اي ir_in =1
وعليه يتحقق الكود التالي
كود:
if (ir_in == 1)  if ((IR_Timer_Count > 80) && (IR_Timer_Count < 110))// between 8ms and 11ms
                                            {
                                             IR_State = 2;          // go to next state (wait for 4.5ms space)
                                             IR_Timer_Count = 0;    // reset timer counter
                                            }
عندما يصبح ir_in = 1 نفحص زمن النبضه اذا كانت بين 8ms و 11ms اذن هذه مقبوله وتمثل النبضه زمن 9ms عندها ننتقل الى IR_State = 2 وتصفير عداد تايمر

اما اذا لم يتحقق الشرط وزمن كان أعلى من 11ms أو أقل من 8ms اذن نصفر العمليه من جديد اي بجعل IR_State = 0 وكذلك نصفر عداد الوقت
IR_Timer_Count = 0

كود:
 else{
                                        IR_State = 0;          // reset IR state because we did not got required 9ms mark
                                        IR_Timer_Count = 0;    // reset timer counter
                                       }
************************************************** *****


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 28-11-2013, 04:18 PM المشاركة 16   
افتراضي


عندما IR_State = 2 فأننا سوف ننتقل الى case=2
الان لايزال خرج مستقبل =1 اي أننا نفحص نبضه التوقف 4.5ms
كود:
 if (ir_in == 1)              // we wait for 4.5ms space signal (( her pwm is stop ))
                     IR_Timer_Count ++;        // increment timer counter
وعندما تنتهي فتره التوقف 4.5ms من مرسل يقوم المرسل بأرسال نبضه البدء أستعداد لارسال اما 0 أو 1 وعنده سوف يصبح مستقبل=0 ولكن هنا بالضبط علينا التاكدمن الزمن 4.5ms لكي بعدها نستطيع الاستمرار
كود:
 if (ir_in == 0) if ((IR_Timer_Count > 37) && (IR_Timer_Count < 53))//between 3.7ms  and 5.3ms
حسب الشرط اذا كان زمن بين 3.7ms و 5.3ms اذن شرط الصحيح عندها جعلنا صفرنا عداد الوقت وكذلك مصفوفه البيانات لغرض أستقبال بيانات جديده وتصفير عداد بتات وعداد البايتات اي عمل تصفير لكل المتغيرات وننتقل الى IR_State = 3
كود:
{
                                           IR_State = 3;          // go to next state (wait for 562us mark)
                                           IR_Timer_Count = 0;    // reset timer counter
                                           IR_Bit_Count = 0;      // reset bit count, we now expect data bits
                                           IR_Byte_Count = 0;
                                           IR_Received_byte[0] = 0; // clear IR_Received_byte[]
                                           IR_Received_byte[1] = 0;
                                           IR_Received_byte[2] = 0;
                                           IR_Received_byte[3] = 0;
                                          }
اما اذا لم يتحقق الكود فيتم تصفير العمليه وكذلك عداد الوقت
كود:
 else{
                                         IR_State = 0;          // reset IR state because we did not got required 9ms mark
                                         IR_Timer_Count = 0;    // reset timer counter
                                        }



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