صفحة 2 من 4 الأولىالأولى 1 2 3 4 الأخيرةالأخيرة
النتائج 11 إلى 20 من 37

الموضوع: الميكرو كونترولر انواعه و برمجته و استخداماته

  1. #11
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي المشكلة و اصلاحها

    دورات الكهرباء والطاقة الشمسية المقدمة من المدرب المهندس فهد رفاعي:

    🔴• رابط كورس محركات مولدات

    https://www.udemy.com/course/dc-machines/?referralCode=1ED48909B4E899C75F7B

    🔴رابط كورس مولدات الديزل الاحتياطية والطواريء

    https://www.udemy.com/course/backuppower/?referralCode=4FE3F1901CB88565592D

    🔴رابط كورس المحولات

    https://www.udemy.com/course/transformers/?referralCode=9BC4E057DC3155D12900

    🔴• رابط كورس توليد الكهرباء

    https://www.udemy.com/course/electricity-generatin/?referralCode=F21C3555AEB345739B2E

    🔴• رابط كورس اساسيات الخلايا الشمسية

    https://www.udemy.com/course/101pvsolar/?referralCode=A10599DD30023F0B48A9

    🔴رابط كورس الانظمة الشمسية المتصلة بالشبكة

    https://www.udemy.com/course/pvsolar2/?referralCode=5CB93ADBDB342EADC3DF

    🔴• رابط كورس كهرباء المنازل

    https://www.udemy.com/course/homeelectrical/?referralCode=20B83657C140B0460C41

    🔴• رابط كورس التعريف بتخصص الهندسة الكهربائية

    https://www.udemy.com/course/101eleeng/?referralCode=A687E69B7A1908D546EE


    🔴رابط كورس محطات التحويل الكهربائية

    https://www.udemy.com/course/powerplant/?referralCode=DDC59253B2F4F6CD0FBC



    🔴للاشتراك في باقة التسعة كورسات جميعا بسعر مخفض تفضل من هنا

    https://fahraf1.com/products/8fc27d39-b638-4498-b575-ed04e6e67675

    لعلك لاحظت أن المحاكاة كشفت أن الليدات الثلاث تطفئ ثم تضيء مرة أخرى وهذا فى برنامجنا لا شيئ لكن فى الواقع لو هذا فى آله و تقوم بذبذبة جزء منها بهذا المعدل قد تتلفها، إذن ما العيب و كيف نصلحه؟؟
    العيب أنك فى كل مرة تقفز إلى Start لتعيد الدورة و فيها تطفئ الكل بدلا من أن تعدل فقط حسب المطلوب لذا نضع عنوان آخر هو Loop وهو فيه الدورة التكرارية
    كود:
    Start: Mov P0 , #255 Mov p3 , #255 Loop: jb p3.0 , SW2test mov P0 , #11111110b sjmp Loop SW2Test: jb P3.1 , SW3Test mov P0 , #11111100b sjmp LOOP SW3Test: jb p3.2 , start mov P0 , #11111000b jmp Loop ;=========================== END
    هنا سنقدم تعليمه جديدة وهى sjmp اختصار Short Jump وهى للانتقال فى مدى +128 و -127 خطوة و بهذا توفر بايت فى كل تعليمه من حجم البرنامج بالمقارنة بتلك JMP و التى تنتقل لأى مكان ولكنها تحتاج لخانة أخرى لتكملة العنوان 2 بايت.
    الآن بعد الاختبار الأول إن لم يتم الانتقال و أضأنا ألليد سنعود لأول الاختبار مباشرة فلا جدوى من تكملة الاختبارات، بل على العكس عندما نختبر الأخير لا دلالة لدينا عن حالة الأول مثلا و من ثم الأفضل إضافة ألتعليمه sjmp loop لنعيد الاختبارات من الأول لنحدد أى الأزرار مضغوط.
    نفس الأمر فى نهاية الاختبار الثانى حيث لو لم ينتقل نتيجة لأول اختبار سيختبر الثانى فينفذ أو ينتقل
    إن نفذ فسيعود لبدء الاختبارات مرة أخرى
    إن لم ينتقل سيذهب للثالث و الآن وصولة للثالث هو حكم بأن الأول و الثانى لم يضغط على أى منهما لكن عدد الخطوات للانتفال قد تغير. من فوائد العنوان انه عندما يتحرك صعودا أو هبوطا ستحسب الخطوات آليا ولو زادت عن المسموح سيعطى المترجم رسالة خطا لمعالجة الموقف.
    الآن وباختبار الثالث إن كان غير مضغوط فيجب إطفاء الكل بالانتقال للعنوان start و إن كان مضغوط سنضيء الكل بتنفيذ الأمرMov P0 , #11111000b ثم نقفز لتكرار الاختبارات دون إطفاء.


    جرب المحاكاة الآن
    لو حاولت تنفيذ هذا عمليا على بوردة تجميع فلن يعمل لعدم توصيل كثير من الأطراف الهامة و التى لا يعيرها ألمحاكي اهتماما، ولكى تنفذها يجب أن تكون الدائرة هكذا.




    ألمرة القادمة بإذن الله سنكرر نفس البرنامج مع بيك.
    الصور المرفقة الصور المرفقة
    • نوع الملف: png Prog01c51a.png‏ (5.5 كيلوبايت, 152 مشاهدات)

  2. #12
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي تمهيد للغات العالية

    تمهيد للغات العالية:

    التعريفات:

    قبل أن نتناول اللغات العالية يجب أن نتعرض لما تركناه فى الشرح السابق و هو يخص البرمجة بشكل عام سواء بالأسيمبلى أو أى من اللغات العالية وهى الأجزاء الثلاث التالية
    كود:
    ;================================== ; DEFINITIONS ;==================================
    هذا الجزء يسمى التعريفات و كما سبق الذكر فهذه الأسطر هى تعليقات لتذكرك فقط أين يفضل أن تملأ هذه البيانات، لذا يمكنك بعد حذفه أن تكتب ما تريد أو تتركه للتنسيق فقط.
    أغلب المترجمات تفترض أنك تضع هذا فى أول البرنامج دوما لأنه سيحتاج هذه المعلومات لاحقا و القلة فقط تدعم الإعلان لاحقا فهى ستحتاج لمسح الملف كاملا مرة لتحديد كل التعريفات ثم تبدأ فى التحليل .
    لنعد للبرنامج السهل الأول سنجد

    كود:
    Start: Mov P0 , #255 Mov p3 , #255 Loop: jb p3.0 , SW2test mov P0 , #11111110b sjmp Loop SW2Test: jb P3.1 , SW3Test mov P0 , #11111100b sjmp LOOP SW3Test: jb p3.2 , start mov P0 , #11111000b jmp Loop
    بالتأكيد أنك نسيت ما قلنا و الآن تتساءل ما هو أو فيم يستخدم P0 و ما هو P3 و ستضطر للعودة للدوائر لتكتشف أن P0 الخاص بالليدات و P3 الخاص بالأزرار لذا لو هناك وسيلة تسهل هذا الأمر؟!!
    أجل هذا القسم هو لهذا الغرض فيمكنك مثلا كتابة
    كود:
    
    Switches EQU P0
    LEDs EQU P3
    SW1 EQU P0.0
    SW2 EQU P0.1
    SW3 EQU P0.2
    

    كلمة EQU اختصار Equal وهى شائعة فى مترجمات الأسيمبلى و فى البيزك باسكوم تستخدم كلمة Alias وهى تعنى اسم مرادف هكذا وفى ميكروإلكترونيكا تستخدم Symbol وهى ليست قياسية فى لغة البيزك أما C فتستخدم كلمة at أو #define
    Switches Alias P0
    هكذا تعطى اسم للمنفذ ككل و اسم لكل طرف إن شئت، بل لو عرفت المنفذ أولا يمكنك استخدام اسمه لاحقا للتسهيل أكثر هكذا
    SW1 EQU Switches.0
    فى ميكروإلكترونيكا
    Symbol Sw1 = Switches
    فى لغةC نجد تعليمه للمترجم هى
    كود:
    #define My_Name System_Name
    فكلمة define تعنى عرف و هذه الجملة تقول استخدم My_Name بدلا من System_Name هكذا
    كود:
    #define Switches PORT0
    هذه الطريقة سهلت التذكر كثيرا ففى أى وقت تراجع البرنامج ستعلم ماذا – أين
    هناك نقطة أخرى بالغة الأهمية أيضا، فماذا لو بعد الانتهاء من البرنامج و بدأت فى رسم البوردة وجدت تعارض فى المسارات ووجدت أنه من الأفضل استخدام منفذ آخر أو طرف آخر. من الأفضل أن تتحمل الخطأ فلو حاولت مراجعة البرنامج كاملا لتغير هذا الطرف بالتأكيد ستنسى و تعانى الأمرين حتى تجعله يعمل مرة أخرى.
    باستخدام هذه المسميات سيكفى أن تغير التعريف فى أول البرنامج وهو سطر واحد فقط ليعمل البرنامج كما يجب على الوضع الجديد بالأطراف الجديدة. أليست هذه نعمة؟!
    الآن الخبر الجيد أن هذه المسميات تكون للمترجم فقط ولا ينتج عنها أى كود لذا لا تبخل فى جعل الاسم مناسبا لا هو قصير جدا ويصعب تذكره مثل X,C فلن تذكر لاحقا X يعنى ماذا ولاC أيضا، ، ولا تجعل الاسم طويلا فيصعب عليك كتابته كل مرة داخل البرنامج مثل Liquid_Crystal_Data_Port و يكفى مثلا LCD_Data
    أيضا هذه الطريقة لا تشترط على ماذا تطبق فيمكنك تطبيقها على ثوابت مثل NoOfLoops=25 أو حتى على معادلة أو كود مثلا
    كود:
    PressTime Alias delay (25)
    كود:
    
    
    فما سيفعله المترجم هو ببساطة كما لو أنه استخدم خاصية "استبدل" Replace من القائمة " تحرير" EDIT و بدل النصوص كلها قبل أن يبدأ الترجمة
    بلغة ميكرو سى نستخدم الصورة التالية ولاحظ أن ميكروإلكترونيكا هى الشركة الوحيدة التى تستخدم تعريفين bit , sbit , فى كل منتجاتها وتنصح باستخدام sbit دوما.
    كود:
    sbit SW1 at RC5_bit;
    كود:
    char Switches at PORT0 ;
    لا تسألنى لماذا يجب أن ينتهى السطر بالفاصلة المنقوطة ";” فلم أجد إجابة شافية حتى الآن
    البعض يقول تحديد نهاية السطر، حسنا هذا كان ضروريا وقت ما كنا نقرأ من الكروت المثقوبة لنحدد بها أى ";” نهاية السطر أما الآن فهناك فى الويندوز 2 بايت فى نهاية كل سطر هما CR,LF وهما كود 10 و كود 13 أما فى أبل أو يونكس / لينيكس و ملفات الأردوينو فهى إما الأولى أو الثانية فقط حيث CR اختصار Carriage Return أى رجوع العربة (الحاملة للورقة) أى الرجوع لأول السطر و LF اختصار Line Feed أى تحرك لسطر جديد ... أى أن هناك نهاية سطر مزدوجة فى كل سطر ولا حجة لهذا العذر و لكن لها ميزة عظيمة فى إرباك المبرمج خاصة أنها أحيانا لو وضعت تسبب إرباك المترجم ولا يعطى رسالة خطأ حتى ، فقط يعطيك برنامج كما تخيله هو ، ولو نسيتها فكثيرا ما يكتشفها لكن ليست دوما.
    السطر الأول يعنى المفتاح SW1 عند الطرف رقم 5 من المنفذ C من المسجل PORT
    السطر الثانى يعنى تخصيص اسم Switches للمنفذ0
    الثوابت:

    نفس مفهوم الأسماء يمكن امتداده للقيم الثابتة رغم عدم ظهورها فى المثال السابق إلا أنك قد تحتاج للتعامل مع 25 مدخلا و تحتاج دورة فيها 25 للقراءة ثم أخرى ربما للحساب و ثالثة للمقارنة ورابعة للعرض على الشاشة الخ فستجد نفسك فى عديد من الدورات كلها 25 مرة
    و مثال آخر أنك تحتاج تكرار أمر ما عدة مرات لتحصل على نتيجة ثابته أو تتأكد من ثبات القيمة فعادة ما نضع رقم
    لكن بنفس القياس لو احتجت لتغيير الدورات فى المثال الأول بالنقصان أو الزيادة سيكون ذلك كابوسا لكن لو استخدمت التعريف السابق فى إعطاء اسم للرقم فكل ما عليك هو تعديله فى أول البرنامج مرة واحدة
    كل مترجم له طريقته فى هذا فالبعض يستخدم طريقة EQU السابقة أو Alias أو يجعلها واضحة باستخدام اللفظ "ثابت" أو Constant و اختصارا Const هكذا
    Const Loops = 25
    Const repeat = 50
    نفس الخبر الجيد السابق ينطبق هنا فهذه الثوابت لا تأخذ من ذاكرة المتحكم لأنها لا تحفظ فى البرنامج و يقوم المترجم باستبدال كل كلمة Loops بالعدد 25 و هكذا و فى النهاية يقوم بالترجمة باستخدام الأعداد و ليس الأسماء و سنوضح الفروق بالأمثلة على لغتى البيزك و السي..
    لكن هل من الممكن أن نعدل هذه القيمة بحسب الحاجة؟ هذا يسمى "المتغيرات" لكن لتنوعها سنجعلها المرة القادمة بإذن الله

  3. #13
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي المتغيرات

    المتغيرات

    نأتى الآن للجزء التالى من التعليقات التى سبق حذفها وهى باسم المتغيرات
    كود:
    ;================================== ; VARIABLES ;==================================

    لكونها تتغير بحسب الحاجة إذن يجب أن نعلم مسبقا أو نحدد لها حجم ما مناسب لأننا سنضطر لوضعها فى الذاكرة و من ثم ستأخذ قدر من المتاح، وقد تقول لا بأس فالمتحكم به عدة الآف من الخانات، للأسف يجب أن أذكر هنا أنها من حجم الذاكرة العشوائية وليست ذاكرة البرنامج وهى فى أتميل AT89x51 قدرها 128 خانة فقط و ألباقى AT89x52 فما فوق قدرها 256 خانة وفى AVR تصل 1 ك و أكثر و تصل 368 خانة فى PIC16 أو اقل فى بعض الأرقام. يمكنك أن تخصص لكل متغير من بايت واحدة إلى 4 بايت ولا تزيد عن ذلك إلا فى حالة النصوص.
    كن حذرا هنا فما لم تكن تتعامل مع الأسيمبلى فكل تخصيص لمتغير أنه بت واحدة ، سيحجز المترجم مقابلها بايت كاملة !!.
    يجب أن تعلن صراحة عن المتغيرات التى ستستخدمها و إلا ستلقى رسالة خطأ و يتوقف عن الترجمة.
    فى الأسيمبلى تستخدم كلمه EQU السابقة أيضا، ستقول كيف؟ سأقول كما سبق أن ذكرنا هى تعنى هذا يساوى أو يستبدل بذلك فلو تصف خانة ذاكرة إذن هى متغير لأن محتواها يأخذ أى قيمة من صفر إلى 255 و أذكر أننا قلنا فى ألتعليمه Mov P0 , #255 ` ذكرنا أن "#” تضع 255 على المنفذ لكن لو حذفناها سيأخذ محتوى الذاكرة 255 حسبما كان هذا و يضعه على المنفذ ، بهذا لو كتبت ألتعليمه
    Days EQU 50
    فهذا يعرف المترجم أن عليه استبدال كلمة Days بالقيمة 50 فى الأمرين التاليين
    Mov P0 , #Days
    Mov P0 , Days
    ومن ثم فى السطر الأول سيضع حرفيا على المنفذ صفر قيمة 50 أما فى السطر الثانى سيأخذ محتوى خانة الذاكرة رقم 50 و يضعها على المنفذ. لو تريد تخصيص Word وهى من 2 بايت سيخصص المترجم المكان الأول الذى أشرت إليه فى الأمر و التالى له آليا. لا يوجد فى الأسيمبلى أكبر من 2 بايت إلا بتخليقك أنت لما تحتاج أو تستخدم مكتبة خارجية.

    فى لغة البيزك تستخدم كلمة Dim و هى اختصار Dimension بمعنى "يصنع وفقا لأبعاد محددة" و أكثر المترجمات تسمح بتسمية عدد من المتغيرات المتساوية الحجم مثلا
    Dim Loop , Cycle , X , T as byte
    وهى هنا تقول أصنع متغيرات واحد باسم Loop وآخر باسم Cycle وآخر باسم X وآخر باسم T كل منها بايت واحدة و لتسمى آخر بحجم 2 بايت يجب أن تعلن من جديد باستخدام Dim
    فى لغة C تضع النوع أولا هكذا
    كود:
    Byte Loop , Cycle , X , T ;
    
    كود:
    
    

    أنواع المتغيرات و أحجامها
    :

    أصغر متغير هو البت الواحدة وفى عائلة C51 يوجد منها 2 بت للمستخدم و للأسف لا يوجد مثلها فى أى من المتحكمات الأخرى.
    داخل كل متحكم يوجد ما يسمى مسجل حالة البرنامج أو Program Status Word و اختصارا PSW وهذا اسمه أى لو تريد الكتابة فيه أو القراءة منه تستخدم الاسم PSW.1 مثلا لقراءة البت رقم 1

    الصورة لعائلة C51 حيث نجد فيها 2 بت للمستخدم الأولى باللون الأصفر و اسمها F0 أى يمكنك أن تستخدم هذا الاسم مباشرة هكذا
    JB F0, Next_Action
    أو تعيد تسميتها بالتعريفات السابق شرحها و الثانية باللون البرتقالى وهى بلا اسم لذا يمكنك استخدام PSW.1 أو تعريفها بأي اسم مناسب . باقى الخانات سيلى شرحها لاحتوائه على كثير من الأمور الهامة.
    لو اخترت أى بت أخرى سيخصص المترجم بايت كاملة لها.
    لو ستستخدم مترجمات ميكرو الكترونيكا تذكر أنها تسمى sbit

    الوحدة الثانية من المتغيرات هى البايت وهى 8 بت وهى تعبر عن حرف من كلمة أى حرف هجائى أو عدد من صفر وحتى 255.
    بعض المترجمات خاصة فى اللغات العالية مثل ميكرو الكترونيكا تسمى الحرف Chr اختصار Character و تسمى أيضا Short اختصار Short-Integer و من كل تضع بلا إشارة UN-signed Character أو بالإشارة signed Character و تصبح أعلى بت فيها رقم 7 تمثل إشارة الرقم. لو صفر يكون العدد موجبا و لو 1 يصير سالبا و بهذا تعبر عن +127 إلى -128 فقط بدلا من صفر إلى 255 أيضا
    Signed short int أو Un-signed short int لنفس المدى
    أما مترجم BASCOM فيستخدم Byte من صفر إلى 255
    الصور المرفقة الصور المرفقة
    • نوع الملف: png psw-51.png‏ (1.5 كيلوبايت, 122 مشاهدات)

  4. #14
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي المقاطعة و البدء

    الثالث هو 2 بايت أى 16 بن و يسمى فى ميكرو الكترونيكا Int اختصار Integer و منهsigned Integer
    من -32768 إلى +32767 ومنه Un-signed Integer من صفر و حتى 65535
    أما مترجم BASCOM فيستخدم Integer من -32768 إلى +32767 و Word من صفر و حتى 65535 وهذه من التعبيرات المستخدمة فى الميكرو بروسيسور وقبلها عند أول تطبيقات الحاسبات

    الرابع من 4 بايت و يسمى فى ميكرو الكترونيكا Long وهو من -2147483648 إلى +2147483647 و أيضا Un-signed Long وهو من صفر إلى 4294967295
    أما مترجم BASCOM فيستخدم Long وهو من -2147483648 إلى +2147483647 و أضاف لنسخة AVR الكلمة DWORD وهو من صفر إلى 4294967295

    الخامس الأرقام العشرية و يسمى فى ميكرو الكترونيكا Float أو Double أو Long Double و كلهم ذات الشيء من 4 بايت للمدى من 1.5x10^–45 إلى 3.4x10^38
    أما مترجم BASCOM فيستخدم Single من 4 بايت أو 32 بت للمدى من 1.5x10^–45 إلى 3.4x10^38 و أضاف لنسخة AVR الكلمة Double من 8 بايت أو 64 بت للمدى 5.0x10^–324 إلى 1.7x10^308

    وسادسا النصوص وهى حتى 254 حرف باسم String

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

    المقاطعة و البدء:

    الكل له مكان محدد للبدء حيث يجب أن تضع أين يبدأ برنامجك وهى خانة صفر فى أول الذاكرة، لذا قد تكون بداية برنامجك فعلا أو انتقال لحيث تضع برنامجك فى الذاكرة.
    أما فى المقاطعة فكما ذكرنا سابقا أن أتميل لها عنوان خاص بكل مقاطعة بينما ميكروتشيب لها عنوان واحد فقط تضع فيه عنوان برنامج معالجة المقاطعة تكون فى خانة 4 حيث تضع عنوان معالجة المقاطعة تتعرف من أين أتت ثم تقوم بالمطلوب أما فى أتميل ستجد لكل مقاطعة خانة حيث تضع عنوان معالجة المقاطعة الخاصة بهذا المصدر مما يوفر عليك تحديد مصدرها.
    كود:
    ;================================== ; RESET and INTERRUPT VECTORS ;==================================
    فى أتميل نجد فى C51 ما يلى و فى AVR أضيف لها أكثر من ذلك

    كود:
    ; Interrupt vectors: (0000H): ; Reset system
    الرقم بين قوسين هو بديل للتعليمه السابق شرحها Org (0000) H أوتعنى ضع الكود التالى فى هذا العنوان وهو صفر و حرف H يعنى أنه هيكسا ولو لم يذكر سيترجم عشرى. لو لم تستخدم أى من المقاطعات التالية فيمكنك وضع أول كود برنامجك هنا (فى خانة الصفر) لكن لو ستستخدم أى من المقاطعات التالية يستحسن وضع أمر انتقال لبداية البرنامج مثل Ljmp Start غنى عن التعريف أن Start هو عنوان لاحق فى البرنامج
    أول مقاطعة من الطرف الخارجى INT0 بعد 3 خانات من الريسيت وهى كافية لأمر القفز لكن كل عنوان مقاطعة بعد ذلك يبعد 8 خانات عن السابق له ، لذلك لو ما تحتاجه لخدمة المقاطعة يمكن أن تكفيه 8 خانات مثل قراءة منفذ تسلسلى أو إعادة تحميل عداد الخ ،يمكنك الاكتفاء بهذه الخانات و إلا ستحتاج لأمر القفز لعنوان آخر.


    كود:
    (0003h) : ; Adress of INT0 (IE0) Ljmp Int0Code (000Bh): ; Adress of Interrupt Timer 0 (TF0) Ljmp T0Code (0013H) ; External 1 (IE1) Ljmp Ext1Code (001BH) ; Timer 1 (TF1) Ljmp T1Code (0023h): ; Serial Interrupt Ljmp SiCode (002Bh): ; Timer2 (TF2 or EXF2) ;Timer2 code if used...... يمكنك وضع كود تايمر2 هنا مباشرة ولا حاجة لأمر انتقال إلا للضرورة . . Start: . . T0Code: . . Int0Code: . . SiCode: . . T1Code:
    لاحظ أنك تمتلك الحرية فى ترتيب العناوين التى تنتقل إليها كيف شئت كما أن عنوان البدء Start يمكن أن تكون أيضا فى أى ترتيب
    عندما تحدث مقاطعة يحفظ المتحكم عنوان الخطوة التالية فى الرصة Stack ثم ينتقل للعنوان المذكور و ينفذ ما به و إن وجد به أمر قفز للعنوان الخاص بهذا الطالب للخدمة و هناك ، أنت تعلم ما ستستخدم من مسجلات ، لذا لو تريد فى برنامج المقاطعة استخدام أى من المسجلات فمن الحكمة أن تحفظها أيضا خاصة مسجل حالة البرنامج PSW لأنه يحتوى مؤشرات ناتج الحسابات و تحفظ هذه المسجلات فى الذاكرة لكن الأسلم و الأسرع بأمر "دفع فى الرصة" Push و عكسه استرداد من الرصة POP فهو يحفظ الترتيب خاصة مع المسجلات 16 بت
    كود:
    Push direct ; direct is any register or memory POP direct ; '' ''
    و سبب أن هذا الأمر أفضل أنك تحفظ أى مسجل دون أن تهتم كثيرا أين فمؤشر الرصة يتولى ذلك عنك، كل ما تحتاجه أن تسترد عكس ما تدفع فإن دفعت مثلا A ثم B ثم المسجل R4 تسترد R4 أولا ثم B ثم A. المزيد عن المقاطعة فى التطبيق التالى للتوضيح بالمثال.
    فى ميكرو تشيب الأمر أكثر تعقيدا لأن لديك مكان واحد تنتقل إليه و هناك عليك أن تبحث أى المصادر سبب هذه المقاطعة و مما يزيد الأمور سوءاً أن البت الخاصة بالمقاطعة ستكون 1 بصرف النظر عن أن هذه المقاطعة متاحة أصلا أم لا ولا أن المقاطعة كلها أصلا متاحة أم لا لذلك من الأفضل تركها للغات العالية حيث تولد الكود اللازم للتحقق.

    الآن بعد أن عرفنا التعريفات و الثوابت و المتغيرات يمكننا أن نعيد صياغة برنامجنا السابق باللغات العالية، بالبيزك مرة و C مرة وهذا موضوعنا القادم بإذن الله.

  5. #15
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي اللغات العالية

    اللغات العالية :

    ربما نسينا برنامجنا السابق لذا ها هو مجددا و بعد إضافة المسميات
    كود:
    Switches EQU P0 LEDs EQU P3 SW1 EQU P3.0 SW2 EQU P0.1 SW3 EQU P0.2 Start: Mov Switches , #255 Mov LEDs , #255 Loop: jb SW1 , SW2test mov LEDs , #11111110b ; = 254 sjmp Loop SW2Test: jb SW2 , SW3Test mov LEDs , #11111100b ; = 252 sjmp LOOP SW3Test: jb SW3 , start mov LEDs , #11111000b ; = 248 jmp Loop
    و أظن أنه أصبح مفهوما بصورة أوضح. هل يمكننا وضعه فى كلمات لشرح خطواته؟
    نعطى منفذ الليدات اسم LEDs ونعطى السويتشات اسم Switches و السويتش الأول اسم SW1 وهكذا
    ضع على منفذ السويتشات 255 و على منفذ الليدات 255
    العنوان دورة:
    لو المفتاح Sw1 =1 عندها انتقل للعنوان SW2test
    و إلا ضع على الليدات 254 ثم عد للدورة
    العنوان SW2test:
    لو المفتاح Sw2 =1 عندها انتقل للعنوان SW3test
    و إلا ضع على الليدات 252 ثم عد للدورة
    العنوان SW3test:
    لو المفتاح Sw3 =1 عندها انتقل للعنوان start
    و إلا ضع على الليدات 248 ثم عد للدورة


    هل نترجمه للإنجليزية؟؟
    لو = IF ، و إلا = Else و عندها = Then و إعطاء اسم هى Dimension لآنها تعنى اسم و حجم معا أو حيز أو صنع شيء طبقا لمواصفة محددة أما استخدام اسم بديل فهو Alias . كثير من المترجمات تفضل البدء بكلمة
    Main بمعنى أساسى ، لا بأس فهى تعرفك أنت أين يبدأ البرنامج و دوما ما تحتاج عنوان فى بداية البرنامج لتكراره.

    كود:
    Main:
    Switches = 255
    LEDs = 255
    Loop:
    If Sw1 = 1 then
    Goto SW2test
    Else
    LEDs = 254
    Goto loop
    End If
    
    حيثما تريد كتابة أكثر من تعليمه فى أى من الجزأين فإما تكتب كل منهما فى سطر مستقل كما سبق أو تفصل بينهما بالحرف ": “ كما فى المثال التالى أو ربما المترجم يتبنى حرف آخر، فلنستخدمه إذن.
    طبعا هنا ستقول أن كلمة "عندها أو Then “ زائدة لكن ستجد ضرورتها لو كتبتها فى سطر واحد هكذا
    If Sw1 = 1 then Goto SW2test Else LEDs = 254 : Goto loop
    فهى تفصل بين كود الشرط و ألذى قد يكون معادلة طويلة و بين الأوامر الواجب تنفيذها عند تحقق الشرط كما Else تفصل بين كود التحقق و كود عدم التحقق – كل كلمة لها مكانها و ضرورتها و مفهومة إن نسيت بمقدورك أن تستنتجها و تركز فى البرنامج بدلا من التركيز على ما لا جدوى منه من أقواس و فواصل منقوطة وهل الفاصلة قبل القوس أم بعده..
    وفى نمط السطر الواحد سنستغنى عن حد الختام وهو End If لأنها تفصل بين كود Else و باقى البرنامج.
    هكذا يمكننا أن نكتب باقى البرنامج بالسطر الواحد هكذا


    كود:
    SW2test:
    If Sw2 = 1 then Goto SW3test Else LEDs = 252 : Goto loop 
    SW3test:
    If Sw3 = 1 then Goto Start Else LEDs = 248 : Goto loop 
    طبعا لو عكسنا المنطق سنوفر قفزة من الاثنتين (الأولى) بحكم أنها للمكان التالى مباشرة فيمكننا القول


    كود:
    If Sw1 = 0 then LEDs = 254 : Goto loop If Sw2 = 0 then LEDs = 252 : Goto loop If Sw3 = 0 then LEDs = 248 : Goto loop Goto Main
    لاحظ أن البرنامج الأفضل هو ألذى يقوم بمهام أكثر بكود أقل فى زمن أسرع.

    و لنكتبه بلغة C أولا يجب أن تلتزم بالأحرف المكتوبة بمعنى لو كتبت Loop ثم لاحقا goto loop سيعترض أن العنوان غير موجود. هذا من بقايا نشأة اللغة فالفرق بين الحرف الكبير و الصغير هو البت رقم 5 فمثلا
    حرف A = 0100 0001 بينما حرف a=0110 0001 وهكذا فى باقى الأحرف و لتوحيد المقاس يلزم تنفيذ أمر على كل الحروف مثل OR x,#0010 0000 لجعل الحروف صغيرة أو AND x,1101 1111 لجعلها كبيرة وهذا كان رفاهية و إسراف عندما كانت ذاكرة الحاسبات تحسب بالبايت و تشترى بالبت و حتى لاحقا عندما حسبت بالكيلو بايت. أيضا كل الأوامر تكتب بالأحرف الصغيرة ولو كتبت أى حرف كبير لن يتعرف عليها المترجم. هذا قد يوقعك فى مشكلة لو أخطأت فى حجم حرف فى اسم متغير فى برنامج من عدة صفحات حسب المترجم المستخدم.
    سنجد أن البداية بالتعريفات كما سبق الشرح ثم بكلمة Void وهى تعنى "خلاء" أو فراغ أو مساحة و كلمة main ضرورية للبدء ثم قوسين لتحديد أنك لا تضع بينهما أى بيانات مطلوب معالجتها ثم القوس المعوج ألذى يحدد البداية و مثله للنهاية


    كود:
    void main() { TRISA = 0xFF; // PORTA is input TRISC = 0; // PORTC is output Loop: if (Sw1=1) { Goto SW2test ; } else { LEDs = 254 ; Goto loop ; }
    الشرط يجب أن تضعه بين قوسين (لماذا ؟ لا تسألنى فلم يجيبنى أحد ولا أرى سببا غير ما شرحت سابقا) لو أردت أن تضع بعد ذلك أكثر من سطر فيجب أن تبدأ بالقوس المعوج } و تنتهى بآخر { و كل سطر منتهى بالمقدسة ";" من غير ليه و الصورة المختصرة تصبح


    كود:
    SW2test: if (Sw1 = 0 ) { LEDs = 254 ; Goto loop ; } if (Sw2 = 0) { LEDs = 252 ; Goto loop ; } if (Sw3 = 0) { LEDs = 248 ; Goto loop ; Goto Start ; }


    هكذا حولنا البرنامج الصغير إلى كافة اللغات المعنية
    . هل نطوره؟ حسنا المرة القادمة إن شاء الله نبدأ فى معرفة المزيد من تفاصيل المعالج و المزيد من الأوامر لنصنع كارت تحكم فى غسالة كهربية مثلا ثم فرن ميكرو ويف .
    أيضا التعليمات بالبيزك و السى أعطت ذات الكود أى لا توجد لغة أقرب للمكونات من الأخرى.

  6. #16
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي صورة أخرى من ألتعليمه if

    صورة أخرى من ألتعليمه IF
    بعض الشركات تحبط استخدام الأمر GOTO و تفضل عدم استخدامه و مثال لذلك تقترح الصورة المتداخلة من الأمر IF وتسمى Nested IF وهى أنك بعد الجزء ELSE تضع الشرط التالى مباشرة وهى قد تبدو منطقية و أسهل فهما و لنجرب ذلك فى المثال السابق حيث كان البرنامج بعد التعريفات

    كود:
    Start: Switches = 255 LEDs = 255 Loop: If Sw1 = 0 then LEDs = 254 : Goto loop If Sw2 = 0 then LEDs = 252 : Goto loop If Sw3 = 0 then LEDs = 248 : Goto loop Goto Start
    باستخدام الطريقة المتداخلة تصبح
    كود:
    Start: Switches = 255 LEDs = 255 Loop: If Sw1 = 0 then LEDs = 254 Else If Sw2 = 0 then LEDs = 252 Else If Sw3 = 0 then LEDs = 248 Else LEDs = 255 ; السطر الأخير End IF Goto Start

    حسنا تخلصنا من معظم GOTO ماعدا الأخيرة فقط وهذه لها أمر آخر يمكن استخدامه لكن لو الذاكرة محدودة فمن الأفضل استخدام الأسلوب الأول ، لماذا؟
    سينشئ المترجم آليا أمر انتقال لنهاية الدورة حيث تكتب END IF أو تضع القوس المعوج فى لغة C وهذا سيضيف المقابل للسطر الأخير أمر وضع 255 على المنفذ و انتقال لأخر الدورة بدلا من Start

    و قبل أن نطور برنامجنا السابق و نتعمق أكثر نرى كيف نطبق هذا باستخدام النوعين الآخرين وهذا موضوعنا القادم بإذن الله

  7. #17
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي البرنامج بالمتحكمات الآخرى


    البرنامج باستخدام AVR
    باستخدام الأسيمبلى سنحاج لتعديل البرنامج كله فقد تغير الأمر MOV ليصبح LDI اختصار LOAD Immediate أى تضع قيمة ما مباشرة فى مسجل و LDS لنسخ ذاكرة إلى مسجل و عكسها STS Store Data to space فضلا عن باقى التعليمات أيضا كما أن المنافذ هنا قد تغيرت و أصبح لكل منفذ 3 مسجلات واحد للخرج و يسمى PORTx و الثانى للاتجاه دخول/خروج و يسمى DDRx و الثالث لحالة الطرف و يسمى PINx كما سبق الشرح ، لذا سيكون أصعب بقليل كتابة هذا البرنامج لكنه ممكن ، و نظرا لكبر الذاكرة المتاحة و الرغبة فى التعامل مع الأرقام العشرية سيكون من الأفضل الاكتفاء باللغات العالية
    كما علمنا سابقا أن منافذ AVR أصبحت تعطى تيار أو تقبل تيار مشابه لمنافذ ألبيك و عكس C51 لذا يمكن أن نتبنى الأسلوبين أى المطابق للسابق

    أو مشابه للبيك هكذا مع مراعاة تغيير أوامر إضاءة ألليد من صفر إلى 1 وأذكر هذا تمهيدا للتعامل مع الريلايات لاحقا


    أيضا لم أوصل طرف RESET لأنه يمكن الاستغناء عنه باختيار خاصية Brown out detect مع فولت 2.7 فعندما يهبط جهد التغذية لهذه القيمة يحدث ريست داخلى آليا ولا حاجة للتوصيل الخارجى لكن إن شئت فليكن، أيضا لم أوصل الكريستال لأنه يمكن استخدام المولد الداخلى 1 ميجا أو 2 أو 4 أو 8 ميجا و إن كان دقيق فى حدود 1% وهو فى نظرى كاف لكثير من التطبيقات ما عدا الوقت الدقيق ألذي يحتاج أكثر من هذه الدقة أو لو تستخدم التواصل التسلسلى.

    باستخدام البيزك و مراعاة المسجلات الثلاث السابقة سيصبح البرنامج
    كود:
    $regfile = "m16def.dat"	 '  تحديد الميكرو
    $Crystal=4000000		 '  تردد الكريستال
    $hwstack=40			 '  تحديد المرصوصة
    $swstack=16			 '  تحديد المرصوصة
    $framesize=32			 '  ذاكرة كمسودة لبعض ألدوال
    السطور الخمس السابقة تخص المترجم أساسا و تجدها مسبوقة بعلامة الدولار $ وهى فى باسكوم كما يلى
    الأول تحديد ملف التعريف بالميكرو Atmega16A
    الثانى تردد الكريستال وهو لا يهم إلا فى حساب الكود اللازم للمنفذ التسلسلى و حساب التأخير المطلوب فى بعض الوظائف
    الثالث تخصيص مرصوصة الانتقال و المقاطعة الخ وتسمى Hardware أو مرصوصة المكونات
    الرابع تخصيص مرصوصة تسمى Software أو مرصوصة البرامج وهى مطلوبة للمترجم لبعض العناوين
    الخامس كمسودة لحسابات يحتاجها المترجم لبعض ألدوال كتنسيق النصوص الخ
    كود:
    Leds Alias PORTA : Leds_dcn Alias DDRA		 '  تسميه المنافذ و المفاتيح و مسجل الاتجاه
    Switches Alias PORTD : Switch_dcn Alias DDRD
    Sw1 Alias PIND.0 : Sw2 Alias PIND.1 : Sw3 Alias PIND.2
     '  تسميه المفاتيح لاحظ استخدام PIND بدلا من  PORTD  
    Main:
         Leds_dcn = 0 : Switch_dcn = 255
    Start:
    Switches = 255
    Leds = 255                                                  ' enable  Pullup
    Loop:
    If Sw1 = 0  then  LEDs = 254  : Goto loop 
    If Sw2 = 0 then  LEDs = 252  : Goto loop  
    If Sw3 = 0  then  LEDs = 248  : Goto loop  
    Goto Start
    نلاحظ أن البرنامج لم يختلف كثيرا لدرجة أننا لم نحتاج لإعادة رسم الدائرة فيمكننا أن نستخدم ذات الأطراف فقط نراعى أن أطراف التغذية و الكريستال و الريسيت قد تغيرت أرقامها.
    المرة القادمة إن شاء الله نعيده بالبيك 16 و 18
    الصور المرفقة الصور المرفقة
    • نوع الملف: png Prog01AVR01.png‏ (8.4 كيلوبايت, 126 مشاهدات)
    • نوع الملف: png Prog01AVR02.png‏ (7.9 كيلوبايت, 125 مشاهدات)

  8. #18
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي البرنامج باستخدام pic16877a

    البرنامج باستخدام PIC16

    الدائرة سبق رفعها لذا سنستدعيها للمرجعية و سنعيد كتابة البرنامج بالبيزك

    نلاحظ هنا تطبيق تعديل إضاءة ألليد من صفر إلى 1 وهو سيستخدم فى الريلايات لاحقا سواء مع ألبيك أو مع AVR
    سنلاحظ أيضا مع ميكروإلكترونيكا ستحتاج لتعريف اتجاه المنفذ نصا بالاسم و لن تستطيع استخدام اسم سبق تعريفه وهذا قصور فى هذا المترجم ثم تعين الاتجاه لاحقا عكس باسكوم سيقدم أمر Config للتهيئة أيضا هو لا يدعم Elseif لذا يجب تفصيلها

    كود:
    program Proj01PIC16
    ' Declarations section 
    Dim Leds as byte at PORTB
    DIM Leds_DCN as byte at TRISB
    DIM Switches_DCN as byte at TRISD
    Dim SW1 as sbit at PORTD.0
    Dim SW2 as sbit at PORTD.1
    DIM SW3 as sbit at PORTd.2
    main:
    
    
    If Sw1 = 0 then 
    LEDs = 1    
    else  
    If Sw2 = 0 then     
    LEDs = 2            
    else     
    if Sw3 = 0           
    then LEDs
    else
    Leds = 0
    end if
    end if
    end if
    Goto Main
    end.

    البرنامج باستخدام PIC18
    رغم أن تركيب الأطراف كما هو ولم يتغير (عكس الانتقال من C51 للأحدث) إلا أن بعض الأطراف أضيفت لها وظائف جديدة و كعادة ميكروتشيب أحيانا تفترض الوظيفة الجديدة هى الأساس ، لذا لو أردت استخدام الطرف كمنفذ رقمى يجب أن تلغى الوظيفة الجديدة .
    استخدمنا سابقا المنفذين B,D و على وجه الخصوص B0,B1,B2 لليدات و الأطراف D0,D1,D2 للأزرار.
    فى الطراز الجديد نجد أن B0:B4 تعمل كأطراف تماثلية لذا يجب إعادة تهيئه المنفذ كرقمى و كدخول لذا سيكون من الأسهل استبدال الأطراف للأطراف B5,B6,B7 و ستصبح الدائرة هكذا


    الآن نجد التسمية ذات فائدة كبرى إذ بدلا من إعادة كتابة البرنامج كله نحتاج فقط لتصحيح التسمية فى أول البرنامج سواء استخدمنا البيزك أو C وهذه أيضا إحدى حسنات اللغات العالية وهى أن الكود أغلبه لا يحتاج تعديل .
    مزيد من خواص المتحكم فى المرة القادمة إن شاء الله
    الصور المرفقة الصور المرفقة
    • نوع الملف: png Proj01aPIC16.png‏ (6.3 كيلوبايت, 122 مشاهدات)
    • نوع الملف: png Proj01PIC18.png‏ (10.6 كيلوبايت, 113 مشاهدات)

  9. #19
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي مسجل الوظائف الخاصة Special Function Register

    مسجل الوظائف الخاصة Special Function Register :

    حسنا عرفنا أن هناك بعض المسجلات لتغيير خواص المنافذ Ports و أخرى لوظائف أخرى، أين هى و كيف تعمل؟
    ببساطة هى ذاكرة داخل المعالج و من خواص أى ذاكرة أن يكون لها حجم محدد و غالبا مرتبط بنظام العد الثنائى ذلك تصنع بحجم ما أكبر من الحاجة الفعلية المستخدمة ، بعض هذه الخانات يوظف و البعض الآخر يرجئ استخدامه لطرز أحدث أو أكثر إمكانيات. وهذا يكون أوفر و أسرع فى التصنيع .
    تفاصيل كل مسجل ستجدها فى الداتاشيت ولذا سنعرض لواحد منها فقط من قبيل العلم بالشيء لكن ما يهمنا فعلا هو أسماء الخانات ووظيفة كل منها و هل تعدل على مستوى البت أم البايت كاملة ومحتواه عند البدء RESET

    هناك مثيل له فى البيك و آخر للأتميل AVR و لكل منهم طريقتة للكتابه فيه. ستجد أن كل ما يحتويه المتحكم فى هذه الذاكرة مثل المنافذ P0,P1,P2,P3 و المراكم الأساسى A و الثانوى B و خانة حالة البرنامج PSW السابق ذكرها و عدد من المؤقتات وخانات تعديل خواصها و التحكم فيها و عداد البرنامج و عداد ألرصه و عداد آخر يسمى مؤشر البيانات Data Pointer اختصارا DP و مسجل المقاطعات و ستجد فى كل خانة اسم و رقم. الاسم هو ما يمكنك استخدامه لتكتب أو تقرأ من هذه الخانة مثلا P0 للمنفذ صفر و القيمة 11111111 هى عند البدء سيكون هكذا أى به هذه القيمة وعنوانه 80 هيكسا و بجواره مباشرة فى الخانة 81 هيكسا نجد مؤشر ألرصه SP أو Stack Pointer
    و الرقم 00000111 أى أنه يبدأ بالرقم 7 و طبعا يمكنك تغيير الرقم كما تشاء أما الأرقام المدونة XXX فهى تعنى غير متوقعة و يجب تخصيصها قبل قراءتها و خانه التواصل التسلسلى.
    نلاحظ هنا أن العمود الأول و الملون يمكنك معالجة كل بت على حدة أو الخانة كاملة بينما الباقى فيجب أن تتعامل بالبايت.

    مسجل حالة البرنامج Program Status Word -PSW
    سبق أن ذكرنا بعض المعلومات عنه لكن هنا سنتناوله بالتفصيل.
    هل الميكرو به فقط A,B لا غير؟ ماذا لو احتجت لأكثر من ذلك؟
    تقدم لك هذه العائلة عدد كبير من المسجلات Registers و يمكنك أن تفعل بها أى شيء سوى أن تجعلها مراكم أى تأخذ مباشرة نتيجة العملية الجارية
    أولا لديك ثمانية مسجلات تسمى r0-r7 و طبعا تمتاز بأن أمر الحفظ فيها أو القراءة منها يستخدم بايت واحدة لأنها معروفة و تحتاج 3 بت فقط من البايت للإشارة إليه فمثلا
    MOV R2, #data
    ستضع قيمة data فى المسجل R2 مباشرة
    حسنا ! أين إذن هذه المسجلات الثمانية؟
    لا تفاجأ – فهى يمكن أن تحتل أربع أماكن من الذاكرة العشوائية ، إما من صفر إلى 7 ، أو من 8 إلى F ، أو من 10 إلى 17 ، أو من 18 إلى 1F
    ما هذه الحيرة
    كلا يا صديقى هذه مصدر القوة كيف؟
    لو أنك تحسب لبيانات قادمة من جزء فى ماكينة مثلا ، عادة أسرع وسائل الحفظ هى المسجلات
    الآن تود حساب شيء آخر ثم تعود لما أنت عليه الآن
    لابد من حفظ المسجلات فى مكان آمن ثم تحسب الأمر المستجد و تحفظ نتائجه أيضا فى مكان آمن آخر ثم تقرا ما كنت تحسب للجزء الأول – قصة طويلة مملة ، أليس كذلك؟
    ما رأيك فى أن تستبدل هذا السيناريو بكلمة استخدم طقم 2 وعند العودة قل استخدم طقم 1؟ أليس أسهل و أبسط؟؟
    و كيف يتم هذا؟
    ببساطة نعود لمسجل PSW وهى اختصار Program Status Word أو خانة حالة البرنامج وهى تحتوى ثمانية خانات Flip Flop تعمل كل منها عمل الراية Flag إما 1 أو صفر حسب الحالة


    لاحظ Bit3,Bit4 باسم Register Bank Select أو اختيار بنك المسجلات (البنك = المجموعة)
    لو = صفر تعنى المدى من صفر إلى 7 من الذاكرة العشوائية أى أول سبعة أماكن
    لو = Ol يكون المدى الثانى أو من 8 إلى F
    لو = lO يكون المدى الثالث أو من 1O إلى 17
    لو = l l يكون المدى الرابع أى من 18 إلى 1F
    كل ما عليك عمله هو تغيير بت واحدة أو 2 بت فقط لتحصل على طقم جديد مع الحفاظ على القديم بلا تغيير للعودة إليه
    وماذا عن الباقى فى PSW
    حسنا
    رقم صفر أقصى اليمين هى Parity "تكافؤ" وتحدد إن كان المراكم A يحتوى عدد فردى أو زوجى من "1"
    رقم 1 هى للمستخدم كيف يشاء لتذكر هل حدث أمر ما أم لم يحدث.
    رقم 2 لو زاد العدد عن الحد و تتحكم بها وحدة الحساب والمنطق لتصحيح الناتج فى حال كان الرقم موجب و سالب(127 إلى -128 ) أم موجب فقط من 0 إلى 255
    رقم 3،4 سبق الحديث عنهما
    رقم 5 للاستخدام العام مثل رقم 1
    رقم 6 AC وهو لتصحيح جمع الأرقام بالنظام العشرى بدلا من النظام الثنائى فمثلا عند جمع 17 + 26 لا يوجد سوى الجمع الثنائى أى الناتج سيكون 3D و لكننا نريد جمع عشرى أى 17+26 =43 فماذا نفعل؟
    عند جمع 7+6= 13 أى D سيوضع آليا واحد فى الراية AC دلالة أن المجموع تعدى 9 و باستخدام بعد الجمع مباشرة ألتعليمه
    DA A وهى اختصار Decimal Adjust ACCUMULATOR
    فتتولى بفحص هذه الراية و باقى الرايات مثل C تصحيح الرقم آليا من 3D إلى 43.
    وهذا مفيد فى التعامل مع كثير من الأرقام BCD و التى توجد فى بعض الحساسات أو تسهل التعامل مع الأرقام. يجب ألا ننسى أن الأرقام التى تجمع يجب أن تكون أصلا BCD و إلا سينتج خطأ

    الأخير رقم 7 Carry هو مثل السابق لكن لأى عملية جمع عندما يكون المجموع زائد عن 255 أو بعد تعليمه DA A لو الناتج أعلى من 99

    طبعا غنى عن الذكر أن هذه الخانة يمكنك التعامل فيها على مستوى البت فتختبر هذه أو تفرض تلك أو تلغيها (تجعلها=1 أو صفر)

    فى هذا الرابط
    http://datasheets.chipdb.org/Intel/M...S/27238302.PDF
    نجد مرجع شامل كتبته شركة إنتل INTEL وهى مبتكرة هذا الميكرو و إن اشتهر أكثر بأنه من إنتاج ATMEL
    ومن مراجع ATMEL حقيقة وجدت صعوبات كثيرة فى لم شمل أجزاء الميكرو و فهم مكوناته من أكثر من مرجع معا
    ولكن فى هذا الملف نجد معظم البنود مرتبة و مشروحة.
    فى كل متحكم ستجد PSW أو مسجل حالة البرنامج مع اختلافات طفيفة فى المحتوى و استخدام اللغة العالية عادة يغنى عن تفاصيله و استخدامه .
    فى سلسلة AVR أصبح عدد المسجلات 32 مسجل منها 6 تعمل كثلاثة مسجلات كل منها 16 بت باسم X,Y,Z ولها خواص برمجية مميزة.
    فى عائلة ميكروتشيب فعددها محدود جدا مما يعقد استخدامها

    فيم يستخدم المتحكم و متى لا يكون مجديا؟ وهل ما زالت الطريقة التقليدية باستخدام الدوائر التماثلية تناسب تطبيقات أكثر من المتحكم؟ هذا موضوعنا القادم بإذن الله
    الصور المرفقة الصور المرفقة
    • نوع الملف: png atmilsfr.png‏ (3.9 كيلوبايت, 122 مشاهدات)
    • نوع الملف: png psw.png‏ (8.9 كيلوبايت, 139 مشاهدات)

  10. #20
    مشرف قسم تقنية الالكترونيات
    تاريخ التسجيل
    Jun 2008
    الدولة
    القاهرة - مصر
    المشاركات
    3,181

    افتراضي استخدامات الميكروكونتروللر أو المتحكم

    استخدامات الميكروكونتروللر أو المتحكم

    البعض يتخيل أن الميكرو أو المتحكم هو رائعة العلم و أنه أتى ليقول لعالم ألتماثلى وداعا لكن مهلا نحتاج لفهم بعض الحقائق عن هذه الأشياء ثم نحكم.
    أولا ما هى أقصى سرعة نتحدث عنها هنا؟ حسنا نلجأ للدائرة و سنجد كريستال هى الحاكم ألرئيسى و من الداتاشيت لهذه الأنواع نجد أن أعلى تردد استخدم هو 30 ميجا – طبعا الكثير منها 25 فقط أو 20 ميجا فقط.
    إذن لا تحلم بأسرع من 30 ميجا
    ماذا تعنى؟ أجل تعنى حدك الأقصى فلا تستطيع توليد تردد أو قياسه أو التحكم فى شيء بمعدل أسرع من ذلك.
    أيضا هناك نقطة هامة وهى كيف يعمل الميكرو من الداخل؟
    لدينا ما يسمى Sequencer أو مرتب الأحداث أو موالى الأحداث أو سمه ما شئت وهو المسؤول عن تنفيذ الأحداث بتتالى محدد وهو
    1- قراءة الكود من ذاكرة البرنامج
    2- زد واحد على مسجل عنوان البرنامج
    3-تحليل الكود و معرفة الخطوة التالية هل تنفيذ السابق كأمر مفرد (مثلا NOP لا تفعل شيئا أو INC A زد واحد لمحتوى المراكم أو CLR A ألغى محتويات المراكم الخ) أو هو حساب يتطلب أخذ قيمة تالية من الذاكرة
    4- قراءة الكود التالى من الذاكرة كبيان
    5- تنفيذ الأمر ثم البدء من جديد
    هذه الخطوات يأخذ وقتا وهذا الوقت يحسب بعدد نبضات الكريستال لهذا فعائلة C51 تحتاج 12 نبضة لتنفيذ دورة كاملة و التى قد تكفى تنفيذ أمر وحيد الخانات أو أمر مفرد كما سبق (مثلا NOP لا تفعل شيئا أو INC A زد واحد لمحتوى المراكم أو CLR A ألغى محتويات المراكم الخ) أو قد تحتاج 12 أخرى لغالبية الأوامر و التى تأخذ دورتين.
    إذن30 ميجا / 24 ستصبح1.25 مليون أمر فقط فى الثانية.
    لاحقا أنتجت الشركة وحدات تنفذ فى 6 دورات و حتى دورتين فقط لكن بكريستال لا تزيد عن 20 ميجا و من ثم أعلى سرعة هى 10 مليون أمر فى الثانية.
    بالنسبة لميكروتشيب فهى تحتاج 4 نبضات فى الدورة إذن 30 /4 تصبح 7.5 مليون أمر فى الثانية
    رائع ماذا نحتاج أكثر من ذلك؟
    أجل أنت لست وحدك فى هذا العالم و تتحكم فيما حولك بالبرنامج أى المسألة ليست بسيطة كما نظن ولو عدنا للمثال السابق سنجد أننا لنتحكم فى بضع أمور بسيطة تطلب الأمر عدة خطوات و رغم أن البرنامج لا ينفذ كله فى كل مرة إلا أننا يجب أن نستوعب هنا خاصية من أهم خصائص البرمجة عن سرعة التنفيذ
    لاحظ أن دورة أو Cycle هى 12 نبضة من الكريستال، وهكذا نستهلك 2 دورة فى كل تعليمه أى 4 دورات تمهيد من Start إلى Loop و من ثم 6 دورة لو كان المفتاح الأول مضغوطا ثم نكرر و إلا سنضيف 6 للمفتاح الثانى و إلا 6
    للمفتاح الثالث
    .
    أى كل دورة كاملة للبرنامج إما 6 أو 12 أو 18 دورة أى 72 نبضة من الكريستال أو 144 أو 216 دورة. وهذا زمن لا بأس به، و بالطرز الحديثة حيث تستخدم 2 نبضة من الكريستال لكل تعليمه ستستهلك 12 أو 24 أو 36 دورة من الكريستال
    كود:
    Start: Mov Switches , #255 ; 2Byte, 2Cycle Mov LEDs , #255 ; 2Byte, 2Cycle Loop: jb SW1 , SW2test ; 3Byte, 2Cycle mov LEDs , #11111110b ; = 254 2Byte, 2Cycle sjmp Loop ; 2Byte, 2Cycle SW2Test: jb SW2 , SW3Test ; 3Byte, 2Cycle mov LEDs , #11111100b ; = 252 2Byte, 2Cycle sjmp LOOP ; 2Byte, 2Cycle SW3Test: jb SW3 , start ; 3Byte, 2Cycle mov LEDs , #11111000b ; = 248 2Byte, 2Cycle jmp Loop ; 2Byte, 2Cycle
    مع ميكروتشيب الأمر أسهل حيث الكل يأخذ 3 دورة و بايت واحدة فيكون البرنامج يحتاج 8 تعليمات حتى يصل إلى Loop أى 32 دورة للتمهيد ثم

    كود:
    CLRF STATUS ; Bank0 CLRF PORTB ; Initialize PORTB by clearing output data latches CLRF PORTD ; Initialize PORTD by clearing output data latches BSF STATUS, RP0 ; Select Bank1 CLRF TRISB ; All OUTs MOVLW 255 MOVWF TRISD CLRF STATUS ; Bank0


    هنا أمرين لو لم يكن المفتاح الأول مضغوطا أو
    4 لو مضغوطا ليكرر الدورة أى4 أو 6 للثانى أو 8 للثالث أو تكرار الدورة كاملة وهذا يعنى 4*4=16 أو 24 أو 32 دورة إضافة للتمهيد 32 دورة كريستال
    كود:
    Loop: BTFSC PORTD , 0 GOTO Sw1 MOVLW 1 MOVWF PORTB GOTO Loop Sw1: BTFSC PORTD , 1 GOTO Sw2 MOVLW 3 MOVWF PORTB GOTO Loop Sw2: BTFSC PORTD, 2 GOTO SW3 MOVLW 7 MOVWF PORTB GOTO Loop SW3: CLRF PORTB GOTO Loop

    هناك كثير من الأشياء الأخرى يجب مراعاتها مثلا محول ألتماثلى رقمى وفى
    PIC16 يحتاج على الأقل 200 ميكرو ثانية لكل تحويله أى 5000 مرة فى الثانية وأسرع من ذلك فى كل من PIC18 و عائلة AVR
    وهذا يقودنا لمثال بسيط، تود أن تصنع دائرة مثبت فولت ، لديك طريقين إما تماثلى بالمتكاملات أو بمتحكم و الأخير يعطى إيهاما بأننا ننظمها بالحاسب الآلى
    حسنا سرعة المتكاملة الخطية تستجيب فى أقل من ميكرو ثانية طبقا للداتاشيت فكم تعليمه تنفذها فى هذا الوقت؟؟ يمكنك وضع ميكرو للوجاهة و تعرض التيار و الفولت الخ لكن دع التحكم للمتكاملة الخطية سواء أكانت تماثلية أو تقطيعية.

    الآن يمكننا أن نفكر فى تطوير برنامجنا السابق لنبدأ مثلا بغساله آلية ذات 6 برامج وهو موضوعنا القادم بإذن الله.

صفحة 2 من 4 الأولىالأولى 1 2 3 4 الأخيرةالأخيرة

المفضلات

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

https://fahraf1.com/wp

https://electricstuffs.com

http://www.tkne.net/vb/announcement.php?f=2