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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 03-05-2014, 05:52 AM المشاركة 17   
افتراضي



حاولت تعريفها كمآ أريد ولكن لم تفلح محاولتي
السلام عليكم
تفضلي
كود:
// Lcd pinout settings
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
R/W connect to GND

اعلانات

Eng Sara
:: مهندس ::
تاريخ التسجيل: May 2014
المشاركات: 15
نشاط [ Eng Sara ]
قوة السمعة:
قديم 03-05-2014, 09:42 AM المشاركة 18   
افتراضي


جزآك الله خيرآ ، كان عندي مشكلة في عمل الـ BUILD الآن الامور تمام

أشكرك

بقي شرح لبعض جمل الكود و الجمل الشرطية فيه

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 03-05-2014, 11:10 AM المشاركة 19   
افتراضي


جزآك الله خيرآ ، كان عندي مشكلة في عمل الـ BUILD الآن الامور تمام

أشكرك

بقي شرح لبعض جمل الكود و الجمل الشرطية فيه
السلام عليكم

شرح الكود

تعريف مفتاح قياس مسافه
كود:
sbit measuring_switch     at RB6_bit;
sbit measuring_switch_dir at TRISB6_bit;
حيث يعني sbit قم بتعريف بن 6 من بورت B بأنه هو نفسه measuring_switch
يعني بأختصار لما شوف measuring_switch أعتبره هو نفس RB6_bit
كما ان sbit تأخذ حيز 1 بت


تعريف حساس
كود:
 sbit HCSR04_Trigger at RC7_bit;
 sbit HCSR04_Echo at RC6_bit;
 sbit HCSR04_Trigger_Direction  at TRISC7_bit;
 sbit HCSR04_Echo_Direction   at TRISC6_bit;
هنا عرفنا HCSR04_Trigger على RC7_bit وعرفنا HCSR04_Echo على RC6_bit


تعريف الشاشه
كود:
/ Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 03-05-2014, 11:23 AM المشاركة 20   
افتراضي


ندخل في قائمه الرئيسيه
كود:
init_micro();
هذه داله تقوم بتهيئه مايكروكنترولر
كود:
void init_micro()
{
  adcon1=0x0F;
  cmcon=7 ;
  OSCCON=0x72;
  HCSR04_Init(8,2);
  measuring_switch_dir=1;// measuring_switch is input
  Lcd_Init();
  lcd_cmd(_lcd_cursor_off);
  lcd_out(1,1,"Welcome");
  delay_ms(2000);
  lcd_cmd(1);

}
adcon1=0x0F لجعل جميع البورتات كلها ديجيتل
OSCCON=0x72 ريجيستر يتحكم بتردد ساعه وهنا ضبطه ليعمل على تردد داخلي 8 ميكا

كود:
  HCSR04_Init(8,2);
لتهيئه مكتبه حساس التي تحتاج منا تردد ساعه وهو 8 ومعامل تقسيم وهنا أختارينا 2 للعلم معامل تقسيم هما 1 او 2 او 4 او 8
وذلك لغرض ضبط عمل تايمر1
سنشرح هذه مكتبه لاحقا
measuring_switch_dir=1 جعلنا اتجاه السويج على انه دخل

كود:
Lcd_Init();
امر تهيئه شاشه

كود:
  lcd_cmd(_lcd_cursor_off);
أطفاء مؤشر في شاشه

كود:
  lcd_out(1,1,"Welcome");
كتبنا رساله ترحيبيه للدلاله على انه برنامج يسير في اتجاه صحيح وأظن هي علامات تساعدنا في أكتشاف أخطاء عند حدوث مشاكل

كود:
delay_ms(2000);
  lcd_cmd(1);
هنا أنتظرنا عرض رساله 2 ثانيه وبعدها مسحنا شاشه


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 03-05-2014, 11:50 AM المشاركة 21   
افتراضي


ندخل في قائمه while
كود:
if(only_display_one==1)// this mean display message only one
                       {
                        lcd_out(1,1,"Press Button" );
                        only_display_one=0;
                       }
هذه رساله سوف تظهر لنا عند أكتمال التهيئه ومهمه متغير only_display_one
هو يعرض رساله مره واحده داخل قائمه while حتى لانكرر كتابه مرات على شاشه

=================================================
كود:
if(measuring_switch==0 )//Now press switch but must be srart=0 ;
                      {
                       LCD_cmd(1);
                       lcd_out(1,1,"WAIT PLEASE");
                       delay_ms(20);// to remove debounce
                       while(measuring_switch==0);
                       delay_ms(20); //to remove debounce
                       if(distance !=0xFFFF){
                                             distance= HCSR04_Read() *10 ;// using 10   //For the purpose of the display values accurately
                                             // note function  HCSR04_Read() return distance measuring in mm unit
                                             // this mean if using real value for distance must be divide by 100 the result in cm
                                             distance_display(2);

                                            }
                         else distance_display(1);
                       }
كود بلون احمر داله شرطيه تختبر هل تم ضغط على سويج اذا كان نتيجه اختبار لا فلايقوم مايكرو بتنفيذ اي شي
اما اذا تم ضغط على سويج
كود:
LCD_cmd(1);
                       lcd_out(1,1,"WAIT PLEASE");
هنا أخبرته مسح شاشه وكتب رساله جديده WAIT PLEASE

كود:
delay_ms(20);// to remove debounce
                       while(measuring_switch==0);
                       delay_ms(20); //to remove debounce
هنا انتظر زمن 20 ملي ثانيه ثم أختبر هل لايزال سويج مضغوط لاحظو كود بلون أحمر اذا كان جواب نعم فان مايكرو سوف يبقى مشغول بتنفيذ اوامر while وطبعا لايوجد اي شيء ينفذه
حالما يتم رفع ضغط عن سويج انتظر زمن مره اخرى ليكن 20 ملي ثانيه
مافائده هذا الكود اولا لتخصل من bounce وهي ان سويج لحظه ضغط عليه مفروض يعطي 0 او 1 حسب طريقه ربطه الا انه في حقيقه لايحدث ذلك مباشره لانه لحظه ضغط على سويج سوف يتغير من 0 الى 1 ومن 1 الى 0 بسرعه كبيره ولكن لبرهه من زمن ثم تستقر حاله سويج ولهذا وضعنا زمن 20 ملي لضمان استقرار سويج

اما
كود:
while(measuring_switch==0)
فهو يعني لاتقم بتنفيذ شيئ حتى تبعد يدك عن سويج
اما زمن 20 ملي ثانيه ثاني هو ايضا لضمان استقرار سويج لانه عندما ترفع اليد عن سويج يحدث تقلبات في سويج من 0 الى 1 ومن 1 الى 0 الى ان يستقر

https://www.google.iq/search?q=bounc...2F%3B550%3B450



=============================================
كود:
distance= HCSR04_Read();
هنا يتم قراءه مسافه من مكتبه حساس وهي بترجع قيمه اما قيم عاديه او 0XFFFF وهذه قيم تعني ان زمن رجوع الاشاره الى حساس تجاوز 36ms وهذا يعني لايوجد جسم

=======================================
كود:
if( distance !=0xFFFF){
                                                distance=distance*10;
                                                // using 10   //For the purpose of the display values accurately
                                             // note function  HCSR04_Read() return distance measuring in mm unit
                                             // this mean if using real value for distance must be divide by 100 the result in cm
                                             distance_display(2);

                                            }
هنا نختبر هل distance !=0XFFFF
!= تعني لايساوي
فاذا كان جواب نعم

distance=distance*10 لماذا ضربت نتيجه في 10
سوف نبينه بعد قليل
وبعدها أستدعي هذه داله
كود:
distance_display(2);
اما اذا كان جواب لا
استدعي هذه داله
كود:
 else distance_display(1);
================================================
نشرح هذه داله
كود:
void distance_display(char state)
{
 lcd_cmd(1);
 if(state==1)lcd_out(1,1,"NOT OBJECT DETE.");
 else if(state==2)
      {
       lcd_out(1,1,"DIST=");
       // eample distance =123.45 now cancel . then distance=12345
       txt[0]=(distance/10000 )+48; // 12345/10000=1.2345    =1
       txt[1]=(distance/1000)%10 +48;//12.345   =12       %10=2
       txt[2]=(distance/100)%10 +48;//123.45  =123        %10=3
       txt[4]=(distance/10 )%10 +48;//1234.5  =1234       %10=4
       txt[5]=distance%10 +48;//           %10 from distance =5
       lcd_out_cp(txt);
      }
 only_display_one=1;
 delay_ms(1000);// wait for see distance in display
}
داله تاخذ متغير
اذا كان متغير =1 معناه اعرض هذه رساله
كود:
if(state==1)lcd_out(1,1,"NOT OBJECT DETE.");
وهذا يعني لايوجد اي جسم

اما اذا كان متغير=2
فهنا نعرض قيمه مسافه

نحيطكم علما ان مكتبه حساس ترجع قيمه بملي ميتر وليس بــ cm

هذا هو شكل رساله التي تظهر فيها مسافه
كود:
char *txt="000.00cm";
طبعا تلاحظون وجود فارزه عشريه وعلامه تظهر cm
خلونا نفترض حساس رجع هذه قيمه لنفهم كيف تعرض البيانات
distance=100.50mm
اذن راح أضربها في 10 (( هذه قيمه فقط عند العرض ولكن عند استقاده من قيمه distance في تنفيذ اوامر معينه علينا أعاده قسمه على 10 ))
الغايه منها للحصول على الارقام بعد فارزه عشريه لان distance منتغير من نوع long وهو لايأخذ الارقام عشريه ولهذا عليه بضرب نتيجه للحصول على الارقام بعد عشريه


distance=100.50 *10=1005.0
نتيجه بتظهر على شاشه
010.5cm
لكن لو لم أضربه في 10 سوف أحصل فقط على 10cm

وهذه طريقه عرض البيانات
كود:
lcd_out(1,1,"DIST=");
       // eample distance =123.45 now cancel . then distance=12345
       txt[0]=(distance/10000 )+48; // 12345/10000=1.2345    =1
       txt[1]=(distance/1000)%10 +48;//12.345   =12       %10=2
       txt[2]=(distance/100)%10 +48;//123.45  =123        %10=3
       txt[4]=(distance/10 )%10 +48;//1234.5  =1234       %10=4
       txt[5]=distance%10 +48;//           %10 from distance =5
       lcd_out_cp(txt);
ارجو مراجعه الكود فقد وضعت تعليق للدلاله على كيفيه عمله

بعد تعرض القيمه على الشاشه
ننتظر زمن
كود:
delay_ms(1000);
وهو زمن بقاء قيمه مسافه على شاشه
طبعا نحن مسحنا الرساله Press Button
وهنا سوف نجعل متغير only_display_one=1 وبتالي سوف يعرض لنه رساله Press Button مره واحده فقط


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 03-05-2014 الساعة 12:07 PM

Eng Sara
:: مهندس ::
تاريخ التسجيل: May 2014
المشاركات: 15
نشاط [ Eng Sara ]
قوة السمعة:
قديم 03-05-2014, 12:27 PM المشاركة 22   
افتراضي


جزآك الله خيرآ وبآرك بِك وأدخل السرور على قلبِك ..

جزِيل الششكر لكـ


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 05-05-2014, 05:36 AM المشاركة 23   
افتراضي


جزآك الله خيرآ وبآرك بِك وأدخل السرور على قلبِك ..

جزِيل الششكر لكـ
السلام عليكم
شكرا جزيلا على كلامكم الطيب
لم تبقى لنا سوى شرح مكتبه حساس
تحياتي



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