الميكروكنترول من عائلة pic وطرق برمجته بستخد ام MikroC
قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الاليقسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots
لم اجد روابط مباشرة لتحميل برنامج المحكاة proteus isis وسوف اقوم برفع هذة البرامج لكي يكون هناك توافق في نسخة البرامج لكي نسهل تجربة ومحكاة الدوائر
والأن نكمل في الأدوات المطلوبة
نحتاج مبرمجه مناسبة لبرمجة عائلة البك ميكروكنترول وتوجد هنا العديد من هذة المبرمجات في مشاركات للأخوه ..
وان شاء الله ابحث لكم عن دائرة لأنشاء مبرمجة سهلة
ايضا نحتاج الي لوحة تجارب
ميكرو pic16f877a لكي نقوم بالشرح علية أو اشرح علي أي متحكم يتوفر لديكم
منظم جهد 5 فولت 7805
10 مقاومة 10 كيلو
كرستال 4 ميجا هرتز
2 مكثف 22 بيكو فاراد
مكثف 10 ميكرو فاراد
مكثف 220ميكرو فاراد
مكثف 103 بيكو فاراد
ليدات بألوان مختلفة 5 ميلي
10 مفتاح برس ضاغط
شاشة LCD 16*2 بيكسل
شاشة 7 سيجمنت من أي نوع كاثود مشترك أو انود مشترك
حساس حرارة LM35
سيكون الشرح والربط علي هذة المكونات ك بداية وسوف نتعمق ونستخدم حساسات أخري وننقذ مشاريع متقددمة
انصح كل متابع لهذا الموضوع ان يقرأ ويتعمق في المواضيع السابقه لمهندسينا الأفاضل حول شرح برمجه البك والتحدث عنها بشكل علمي ودقيق وشرح البنية الداخلية للمتحكمات
لأن لا اريد تكرار ما تم شرحه من اخوانا المهندسين الأفاضل في مشاركاتهم الرائعه ..
واحب أن ننوه أن فكرة شرح هذا الموضوع سيكون بطريقة عملية اكثر من النظري لأن يوجد هنا في القسم العديد من الشروحات النظريه .. ونريد هنا الدخول في التطبيقات العملية وحل المشاكل اللتي سوف تواجهنا وا عطاء تمارين وواجبات لكي تكتسب خبرة ومهارة وتتخلص من الرهبة والغموض حول هذا الموضوع وتكون مفكر ومحترف برمجيات تطبيقية وتنفذ ما تشاء من افكار ومشاريع بكل احتراف وفن ...
جاري رفع البرامج والتحضير لأول مشروع لك في عالم المتحكمات استعد وكون ومتأكد أن الموضوع سهل جداا أن شاء الله
في البداية تنويه أن جاري رفع البرامج وحين الإنتهاء من رفعها سوف اشارك الروابط هنا
بسم الله نبدأ في تنفيذ اول مشروع ...
خلينا نقول أننا محتاجين بناء دائرة تايمر بسيطه ... وعندما نتحدث عن التايمر يحضر في تفكيرنا المتكاملة الشهيرة 555 تايمر ..
ولكن هل نستطيع تغيير التايمر بشكل اتوماتيكي هل نستطيع ايقاف عمل التايمر بزمن محدد ومن ثم تشغيله ايضاا هل نستطيع التحكم في عرض النبضه والتردد ونربطها بشروط معينه ..
كل هذة التفاصيل سيكون الأمر صعب ومجهد لو تم بناء الدائرة بستخدام متكاملة التايمر 555 ..
ولكن الوضع مختلف تماما مع استخدامنا المتحكم ميكرو كنترول
...
نبدأ بتصميم الدائرة ..
عند محكاة الدائرة لا داعي الي وضع كرستالة ومنظم الجهد البرنامج يعمل محكاة بدونهم ..
والأن نبدأ في كتابة الكود ..
نذهب الي برنامج ميكروسي برو وننشأ مشروع جديد ونختار البك PIC16F877A ونضبط تردد الكرستالة علي 4 ميجا هرتز ..
بعد انشاء مشروع جديد تظهر هذة النافذة
وقد تم كتابة دالة البداية من قبل البرنامج نفسة وهذا الوضع الإفتراضي للبرنامج عادة بدأ هكذا ..
وفي هذة الصورة تم التعليق علي التعليمات الموجودة لكي نفهم دور كل تعليمه
والأن نشرح هذة التعليمات
كود:
void main()
هذة هي دالة البداية وهنا يبدأ البرنامج منها وقرأة كل التعليمات اللتي تأتي بعدها نزولا لأسفل بالترتيب ..
ونأتي هنا الي كتابة كود لبرنامج تايمر للتحكم في اضاءة ليد واطفائة كل واحد سانية ..
هنا كما هوا موضح في الشرح في الصورة بدأ البرنامج بالدالة البداية أو كما تسمي الداله الرئيسيه
وبعد ذالك ينزل البرنامج لقرأة باقي التعليمات وهنا تأتي تعليمات التعريف وعادة دائما يجب كتابة كل التعريفات اللتي نحتاجها في البرنامج نكتبها مباشر بعد الداله الرئيسيه
وكما نلاحظ في هذا الأمر
كود:
TRISB=0B00000000;
هنا يوجد 8 اصفار بعد حرف ال B وهنا كل صفر من ال 8 اصفار يتحكم في بن من لل8 بنات للبورت ( ب ) وعند كتابة 8 اصفار هنا تم تهيئه كل البورت ك خروج فولت فقط
وبعد ذالك جاء دور التعليه التالية
كود:
PORTB=0B00000000;
. وهوا اسناد أمر مباشر للمتحكم بأن يخرج صفر فولت علي جميع ارجل البورت ( ب )
وبعد ذالك ندخل الي حلقة تكرار الكود [CODE while(1)][/CODE]. ويوجد لها قوس بداية ونهاية وتكرر كل الكود الموجود داخل القوسين الي ما لا نهايه ... ويوجد أوامر تمكننا من الخروج من هذة الحلقة والذهاب لتنفيذ كود أخر سوف نتحدث عنها في المشاريع القادمه ..
نأتي الأن الي الكود اللذي موجود داخل حلقة التكرار
كود:
PORTB=0B00000001;
وهنا لو نلاحظ أن تم وضح واحد مكان الصفر رقم واحد وهكذا نخبر الميكرو أن يخرج 5 فولت علي البن رقم واحد للبورت ( ب ) ويأتي بعد ذالك أمر انتظار واحد سانية [CODE delay_ms(1000);][/CODE] ويمكنك التحكم في وقت الأنتظار من خلال تغيير الرقم داخل القوسين
وبعد ذالك نعطي أمر بأطفاء الليد
كود:
PORTB=0B00000000;
delay_ms(1000);
ولإنتظار واحد سانية وبعد ذالك يذهب البرنامج الي بداية قوس حلقة التكرار ويتم تكرار البرنامج الي ما لا نهايه ..
في البداية تنويه أن جاري رفع البرامج وحين الإنتهاء من رفعها سوف اشارك الروابط هنا
بسم الله نبدأ في تنفيذ اول مشروع ...
خلينا نقول أننا محتاجين بناء دائرة تايمر بسيطه ... وعندما نتحدث عن التايمر يحضر في تفكيرنا المتكاملة الشهيرة 555 تايمر ..
ولكن هل نستطيع تغيير التايمر بشكل اتوماتيكي هل نستطيع ايقاف عمل التايمر بزمن محدد ومن ثم تشغيله ايضاا هل نستطيع التحكم في عرض النبضه والتردد ونربطها بشروط معينه ..
كل هذة التفاصيل سيكون الأمر صعب ومجهد لو تم بناء الدائرة بستخدام متكاملة التايمر 555 ..
ولكن الوضع مختلف تماما مع استخدامنا المتحكم ميكرو كنترول
...
نبدأ بتصميم الدائرة ..
عند محكاة الدائرة لا داعي الي وضع كرستالة ومنظم الجهد البرنامج يعمل محكاة بدونهم ..
والأن نبدأ في كتابة الكود ..
نذهب الي برنامج ميكروسي برو وننشأ مشروع جديد ونختار البك PIC16F877A ونضبط تردد الكرستالة علي 4 ميجا هرتز ..
بعد انشاء مشروع جديد تظهر هذة النافذة
وقد تم كتابة دالة البداية من قبل البرنامج نفسة وهذا الوضع الإفتراضي للبرنامج عادة بدأ هكذا ..
وفي هذة الصورة تم التعليق علي التعليمات الموجودة لكي نفهم دور كل تعليمه
والأن نشرح هذة التعليمات
كود:
void main()
هذة هي دالة البداية وهنا يبدأ البرنامج منها وقرأة كل التعليمات اللتي تأتي بعدها نزولا لأسفل بالترتيب ..
ونأتي هنا الي كتابة كود لبرنامج تايمر للتحكم في اضاءة ليد واطفائة كل واحد سانية ..
هنا كما هوا موضح في الشرح في الصورة بدأ البرنامج بالدالة البداية أو كما تسمي الداله الرئيسيه
وبعد ذالك ينزل البرنامج لقرأة باقي التعليمات وهنا تأتي تعليمات التعريف وعادة دائما يجب كتابة كل التعريفات اللتي نحتاجها في البرنامج نكتبها مباشر بعد الداله الرئيسيه
وكما نلاحظ في هذا الأمر
كود:
TRISB=0B00000000;
هنا يوجد 8 اصفار بعد حرف ال B وهنا كل صفر من ال 8 اصفار يتحكم في بن من لل8 بنات للبورت ( ب ) وعند كتابة 8 اصفار هنا تم تهيئه كل البورت ك خروج فولت فقط
وبعد ذالك جاء دور التعليه التالية
كود:
PORTB=0B00000000;
. وهوا اسناد أمر مباشر للمتحكم بأن يخرج صفر فولت علي جميع ارجل البورت ( ب )
وبعد ذالك ندخل الي حلقة تكرار الكود [CODE while(1)][/CODE]. ويوجد لها قوس بداية ونهاية وتكرر كل الكود الموجود داخل القوسين الي ما لا نهايه ... ويوجد أوامر تمكننا من الخروج من هذة الحلقة والذهاب لتنفيذ كود أخر سوف نتحدث عنها في المشاريع القادمه ..
نأتي الأن الي الكود اللذي موجود داخل حلقة التكرار
كود:
PORTB=0B00000001;
وهنا لو نلاحظ أن تم وضح واحد مكان الصفر رقم واحد وهكذا نخبر الميكرو أن يخرج 5 فولت علي البن رقم واحد للبورت ( ب ) ويأتي بعد ذالك أمر انتظار واحد سانية [CODE delay_ms(1000);][/CODE] ويمكنك التحكم في وقت الأنتظار من خلال تغيير الرقم داخل القوسين
وبعد ذالك نعطي أمر بأطفاء الليد
كود:
PORTB=0B00000000;
delay_ms(1000);
ولإنتظار واحد سانية وبعد ذالك يذهب البرنامج الي بداية قوس حلقة التكرار ويتم تكرار البرنامج الي ما لا نهايه ..
السلام عليكم ورحمة الله وبركاته
شكرا لك على موضوعك هذا الذي انتظره على احر من الجمر .
من اخ فاضل اعتز به وبالله احببته ومن متابعته لا مفر .
صدوق خلوق بالعطاء والخير منهمر .
حياك الله وبارك بك 😄😄😄😄.
اخي عبد الله كنت اقرأ عن المتحكمات ولفت نظري ان الدالة void main تكون ببداية كل برنامج يعني يمكن اعتبار ان هذه الدالة اساسية وواجب كتابتها وليس لنا تدخل بها او لاتتدخل في عمل البرنامج لا في هذا المشروع او غيره مجرد عنوان ويجب التسليم به كما هو .
التعليمات tris و bort مفهومتان جيدا بارك الله بك .
ساقوم على تنفيذ المشروع على بروتس وعود اليك سريعا ان شاء الله
خالص شكري وامتناني اليك .
بالنسبه لدالة البدايه او الدالة الرئيسيه..
بالفعل هيا من الأساسيات والبرنامج يكتبها اتوماتيك عند بداية كتابة أي برنامج جديد وتكتب هكذا كما هي ولا يمكن تغيير اسمها لأنها تعتبر تعريف للبرنامج لكي يعلم من اين يبدأ
علي عكس الدوال الفرعيه يمكننا كتابة اسمها كما نشاء بشرط عدم تكرار نفس الأسم أو استخدام رموز رياضيه في كتابة الأسم ولا نستهدم الفواصل ...
والأن نبدأ في التطوير والتعمق اكثر بستخدام الأوامر الشرطيه وهنا نتوقف قليلا لأن من أهم الأوامر في البرمجه هي الأوامر الشرطيه وسيكون هناك العديد من التطبيقات في الأوامر الشرطيه
ونذهب بعد ذالك الي الدالة الرئيسيه [CODE void main()][/CODE] وقد تم شرحها هي وأمر
كود:
TRISB=0;
PORTB=0;
. وهنا نلاحظ اختلاف في صيغة كتابة الأمر وهنا نحن بدأنا نكتب الكود بشكل احترافي. حسناا من أين أتي هذا الرقم وبالمناسبه هذا الرقم يسما بالنظام DECIMAL ولكي نفهم أكثر نذهب الي برنامج ميكرو سي لكي نستطيع تحويل نظام كتابة الأرقام من النظام BINARY الي نظام DECIMAL ..
لاحظ الصورة..
نستطيع تحويل نظام كتابة الأرقام من هذة القائمة لكي يكون الكود اكثر احترافية
والأن هي بنا نتعرف علي هذا الأمر الجديد وهوا تهيئة البن رقم صفر في البورت D ك دخول لكي نربطه علي المفتاح
وكتبنا أمر التهيئة بنظام DECIMAL. هكذا
كود:
TRISD.F0=1;
ولو كتبناه بالنظام BINARY سيكون هكذا [CODE TRISD=0B00000001;][/CODE]
هل لاحظنا الإختلاف ..
نأتي الأن لتفصيل وشرح هذا الأمر
كود:
TRISD.F0=1;
TRISD هي أمر تهيئه للبورت D وتم تحديد رقم البن اللذي نريد تهيئته ك دخل هكذا .F0=1. حرف F0 هوا للدلاله علي البن رقم صفر ولو تم تغيير الرقم صفر سوف نختار بن أخر مثلا هكذا
كود:
TRISD.F7=1;
نلاحظ استبدلنا الرقم صفر بالرقم 7 وهكذا اخترنا البن رقم 8 للبورت D ك دخول وهذا الأمر نكتبة عادة عندما نريد تهيئه بن واحد من البورت ويمكننا تهيئة البورت بالكامل ك دخول أو خروج هكذا. .
كود:
TRISD=255;
هنا تم تهيئة البورت D بالكامل ك دخول ويمكننا تخصيص عدد معين من البنات دخول وخروج هكذا [CODE TRISD=15;][/CODE] هنا تم تهيئة الأربع بنات من البن رقم صفر الي البن رقم 3 ك دخول وتم تهيئه بداية من البن رقم 4 الي البن 7 ك خروج .. وهكذا يمكننا تهيئه ما نشاء من دخول وخروج من بنات ولكي نسهل التحويل بين نظامين BINARY و DECIMAL نذهب الي قائمة التحويل ونختار نظام 8 بيت كما في شرح الصورة اعلاة
اتفقنا في الشرح السابج للتجربة الأولي وعرفنا دور علقة التكرار
كود:
while(1)
ويمكننا أن نجعلها حلقة مربوطه بشرط معين سوف نتكلم عنها في مواضيع قادمه انشاء الله
نشرح حلقة الشرط.
كود:
if( PORTD.F0==1 ){X++; delay_ms(250);}
. هنا قد فهمنا كيف نختار رقم البن اللذي نريد التعامل معه هكذا PORTD.F0 وهوا تم اختيار البن رقم صفر للتعامل معها. نشرح أمر الشرط بالتفصيل. لاحظ توجد حلقتين أو قوسين قي أمر الشرط القوسين أو الجزء الأول من أمر الشرط
كود:
if( PORTD.F0==1 )
وهنا البرنامج يهتبر دوما هل تحقق الشرط أم لا. وهنا علامة == تدل علي المنطق ( لو ) ورقم واحد يدل علي الواحد منطقي والصفر طبعا يدل علي الصفر منطق وهنا أخترنا أمر تحقق الشرط بالواحد منطقي ويعبر هنا في الواقع أن لو تم تطبيق 5 فولتلاعلي البن رقم صفر في البورت PORTD نفذ الأوامر الموجوده داخل القوسين وهنا نأتي للجزء الثاني من أمر الشرط
كود:
{X++; delay_ms(250);}
. هذا الكود يقوم بذيادة المتغير X++ بواحد عند كل مرة يتحقق فيها الشرط من خلال علامة ++
وبعد ذالك ينتظر البرنامج 250 ميلي سانيه ليعطي للمستخدم فرصه ووقت كافي لكي يرفع يده من علي المفتاح لأن الميكرو يستطيع التحقق من أمر الشرط الاف المرات في السانيه الواحده وأن لم يكن وقت الإنتظار هذا غير موجود هنا لا نتوقع كم تم ذيادة المتغير كام مرة ~لأن الميكرو سريع جداا في تنفيذ الأوامر
بعد ذالك ندخل علي عدد 8 أوامر شرطيه ولكن هذة المرة تختبر قيمة المتغير X
كود:
if(X==1){ PORTB=1; }
وهذا الكود يقول لو X=1 أخرج 5 فولت علي البن رقم صفر للبورت B
وهنا
كود:
if(X==2){ PORTB=2; }
يقول هذا الكود لو X=2 أخرج علي البن رقم واحد للبورت B
5 فولت وأجعل باقي البورت = صفر
وهكذا مع باقي الأوامر الشرطيه
اعطي لك الوقت لكي تنفذ الدائرة وتخابر الكود
وهنا ملاحظة تم التعمد في عدم وضع جزء في الكود وادعوك لأستكشافة وللتسهيل عليك تذكر أن حالة البورت. B. معتمدة اعتماد كامل في خرجها للفولت علي قيمة المتغير X ادعك تستكشف ولا حرج في السؤال
التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 13-12-2019 الساعة 01:31 AM
السلام عليكم ورحمة الله وبركاته
الله الله في اخيكم .
انتظر هذه الدورة منذ زمن و قد حان وقتها واخيكم يركب دراجة صغيرة بثلاث عجلات وانتم تتمتعون بالفيراري واللمبرغيني وفاتحين على الرابع و طريقكم سهل والاشارة خضراء .😓😓😓😢😢
ارجوك ارجوك اخي عبد الله التريث قليلا فلقد حملت البرنامج الذي ارفقته ولم ينصب عندي micro c فهل اعتمد على البرنامج الموجود عندي انه نسخة سابقة عن هذا .
اريد تفريد اوامر ومعطيات هذه اللغة .
اذا الدالة void main من اساس البرنامج ونقطة بدايته .... تمام .
Tris تعيين المنافذ اما خرج او دخل .... تمام .
Port تعيين حالة المنافذ اما ان تخرج جهد ام لا ...... تمام .
Wile حلقة دوارة يتم تنفيذ الاوامر التي بداخلها مالم يشترط غير ذلك ...تمام .
الرقم (1) بعد wile ما عمله هنا .. هل لتعيين اسم لهذه التعليمة وان كان كذلك لصالح من ... اي للمعالج كي يعرفها ام للكاتب الذي يكتب البرنامج ؟؟ .
الاقواس { } واجب وضعها عند بداية البرنامج ونهايته ولا حظت ايضا وجودها عند التعليمة wile لماذا ؟؟ هل استطيع حذف الاقواس ان كان المعالج يقرأ مابين القوسين الرئيسيين الخاصيين بالدالة الرئيسية .
سؤال من باب الفضول بالنسبة لتحديد زمن التاخير 1000ms هل يفهم المعالج فقط الميلي ثانية ام يمكن كتابة الامر هكذا delay_1s وافرض مثلا انني احتاج لتنفيذ اوامر كل ٢٤ ساعة وكل اسبوع وكل شهر فمالحل .
هذا السؤال يلزمني فيما بعد ان رايت التريث بالاجابة لغاية ما فلاباس .
حياك الله وبارك بك .
حقيقة اعجبني جدا جدا اسلوبك اذ وضعت تمرينا للتمرن عليه ولكن سبق الحد الكلام واجابك باشق القرية .
مازلت هيثما عاريا لا ريش ولا حتى ما استطيع الاستعانة به لفعل شيء وانتظر من شاهين القرية الاخ عبد الله الاخذ بيدي لتعلم فن الطيران في سماء البرمجة والتحليق بها عاليا للاستمتاع بجمالها وحلاوة طعمها وشم نسيمها وقبل ذلك تقويتي على ذلك .
لا اخفيك محاولة طلب ذلك من اصدقاء عبر النت لكن مهما كانت اللغة قوية تبقى الام هي الاساس والطريق الرئيسي للعقل من اجل حسن ادراك مايحصل ويجري اعود واكرر رجائي بالتريث والتنقل رويدا رويدا بين تضاريس هذا الامر الذي انتظرته واتشوق للولوج به والولوغ لاعماقه حسب المستطاع بداخلي نار تستعر لا اجد لها منفذا بحيث احدد لها TRIS خاص بها ولا ترويضها لاجعل لها PORT الجمها به فهي كال WILE تدور باحشائي دون تعيين delay لها فتهدئها وتريحني .... ارجو ان اكون اجدت التعبير في هذا فكما يقولون الدواء من جنس الداء 😂😂😂😂😂
حياكم الله وبارك بكم
التعديل الأخير تم بواسطة : مسلم11 بتاريخ 13-12-2019 الساعة 11:22 AM
الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 10:19 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)