صفحة 4 من 4 الأولىالأولى ... 2 3 4
النتائج 31 إلى 37 من 37

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

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

    افتراضي الدورات Iteration

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

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

    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

    الدورات Iteration

    For Loop

    الثالث و اشهرها إطلاقا هى دورة For أى بينما المتغير "ص" من كذا إلى كذا افعل هذا ثم عدل قيمة "ص" وهى بالأسيمبلى تكون هكذا
    كود:
    MOV R7,#50 Loop5: DoThis DJNZ R7,Loop5
    المتغير ص نريده = 50 لذا سنضع مثلا فى الذاكرة أو للأسرع فى المسجل R7 هذه القيمة بالأمر الأول. يليه عنوان بداية الدورة ثم مجموعة التعليمات المرغوب تنفيذها "
    DoThis" و أخيرا الأمر DJNZ وهو اختصار Decrement and Jump if Not Zero و يليه ما يحتوى الرقم المطلوب إنقاصه ثم العنوان ألذى ينتقل إليه و هذا العنوان يجب أن يكون فى نطاق بايت واحدة أى 255 +128 إلى -127

    هذا الأمر بالبيزك لكلا المترجمين
    تأخذ الصورة For المتغير = البداية TO النهاية بخطوة عدد موجب أو سالب
    كود:
    Dim A As Byte , B1 As Byte , C As Integer
    
    For A = 1 To 10 Step 2
    Print "This is A " ; A
    Next A
     
    Print "Now lets count down"
    For C = 10 To -5 Step -1
    Print "This is C " ; C
    Next
    
    نلاحظ هنا أن Step ليست ضرورة لو كانت = موجب 1. هذه الدورة تظل تنفذ التعليمات فى جسم الدورة حتى يزيد المتغير عن الحد الأقصى بعد كلمة To وهنا تتوقف الدورة. لاحظ أن الدورة تنتهى بكلمة NEXT وهى فى الدورات المتداخلة تتيح لك التذكر هذه تخص من فمثلا
    كود:
    For c = 1 To 10
    
    For D = 2 to 8
    
    Next D
    …. 
    ….
    Next c
    رغم أنك لا تحتاج كتابة الحرف و تكتفى بكلمة Next إلا أنها توضح لك أين يبدأ هذا و أين ينتهى ذاك - فى ميكروإلكترونيكا لابد من كتابة الحرف وإلا سيعترض وهو ليس قياسيا فى لغة البيزك و يلوم البعض كلمة Next إلا أنها واضحة و تخص For ولن تخص دالة أخرى ولا تكملها أو تغلقها كما لو كانت كلها } و ممكن قوس
    For يغلق قوس IF خاصة حيت تكثر الأكواد عبر الصفحات.



    أما بلغة C فلأمر كما هو معروف مختلف حيث تكون

    كود:
    for ( i = 0; i < n; i++ ) s += a[i] * b[i];

    i = 0
    هى حد البداية ثم فاصلة منقوطة ";” ثم i < n حد النهاية ولاحظ هنا أنه أقل من و ليست تساوى فلو كانت تساوى و العد زاد لن تنتهى الدورة كما يحدث فى البيزك لذا لو تريد مثلا 10 يجب أن تكتب أقل من 11 للتسهيل و البساطة و الوضوح. أخيرا i++ تعنى اضف واحد و بالمناسبة ++ على يمين المتغير تختلف عن على يساره حيث أحدهما تعنى أعد القيمة قبل الزيادة و الأخرى تعنى أعد القيمة بعد الزيادة ثم نغلق القوسين و نكتب ما نريد تنفيذه ثم نختم بالمقدسة ";”
    لو لديك أكثر من أمر للتنفيذ عندها تضعهم بين قوسين معوجين {…..} و كل سطر ينتهى بالمقدسة ";”
    هذه اللغة تتيح لك استخدام أكثر من متغير معا


    Do Loop

    الرابع و بذات كود الأسيمبلى السابق يمكنك أن تهئ هذه الدورة، يمكنك تحقيقها بالأمر DJNZ أو CJNE السابقين
    أما بالبيزك فالصيغة المشتركة هى

    كود:
    A = 1                                                       'assign a var
    Do                                                         'begin a do..loop
    Print A                                       'print var
    Incr A                                         'increase by one
    Loop Until A = 10                                   'do until a=10


    فى السطر الأول تضع قيمة ما فى متغير ما تستخدمه حكم لإنهاء الدورة ، ثم تكتب " افعل Do " لتحدد بداية المطلوب و يلى ذلك مجموعة الأوامر حسب حاجتك و يجب أن تحتوى وسيله لتعديل هذا المتغير سواء بالبرنامج أو قد تكون خارجية حيث هذا المتغير مثلا قيمة المنفذ PORT0 أو قد يكون حالة طرف PORT0.3 و آخر سطر سيكون Loop Until A = 10 وهو يعنى كرر حتى يصل المتغير لهذه القيمة
    كما لاحظت أننا نقول دوما ذات الكود، فعلا هى دورة تكرارية تنتهى بمقارنة ثم القفز للبداية أو القفز خارجها فلم نتوقع كود مختلف؟ هى فقط تعبيرات مختلفة لتسهيل الوصول للهدف
    لو حذفت جملة Until A = 10 ستتحول إلى دورة غير منتهية فلا شرط ينهيها و هى بذلك تتحول إلى أمر GOTO وهى مطابقة للأمر AJMP أو LJMP بالأسيمبلى.
    نلاحظ هنا أن الشرط Until A = 10 أو ما يسمى بالاختبار يكون فى آخر الدورة مما يضمن تنفيذها مرة واحدة على الأقل لذا سيكون لدينا أمر آخر لضمان عدم التنفيذ.
    أما بلغة C

    كود:
    do {
    s += a[i] * b[i];
    i++;
    } while ( i < n );

    كلمة do ثم القوس المعوج لتحدد التعليمات المطلوب تكرارها ثم الأوامر المطلوب تكرارها مع مراعاة الشروط السابقة لتعديل قيمة المتغير الحاكم لإنهاء الدورة ثم تضع كلمة while و الشرط المطلوب تحقيقه بين قوسين و تنهى بالمقدسة

    كما ذكرنا لو نريد عدم التنفيذ إطلاقا لو الشرط غير محقق نلجأ للأمر الخامس

    While / While-WEND

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

    كود:
    A = 1                                                       'assign var
    While A < 10                                          'test expression
      Print A                                              'print var
      Incr A                                               'increase by one
    Wend                                                      'continue loop


    كما سبق الشرح سنضع فى متغير ما قيمة ما وهو حاكم الدورة ثم نضع الشرط ألذي بتحققه ننفذ ما يلى من تعليمات أما لو لم يتحقق نخرج و يجب ضمان تغير قيمة الحاكم حتى يصل بالشرط للخروج من الدورة و كما ذكرنا هذا المتغير قد يكون منفذ أو طرف من منفذ أو أى متغير آخر. و أيضا يمكن عمل دورة لا منتهية باستبدال الشرط بالرقم 1 أو البعض يسمح بكلمة TRUE و أخيرا تنتهى بكلمة Wend اختصار While End لكى ترى بوضوح أين تنتهى الأمور

    بلغة C

    كود:
    while (i < n) {
    s += a[i] * b[i]; i++;
    }

    المرة القادمة إن شاء الله نتحدث عن المجموعة الأخيرة وهى الانتقال أو التفرع

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

    افتراضي الانتقال أو التفرع Branching

    الانتقال أو التفرع Branching

    الحقيقة هنا بعض الأوامر مختلفة بين اللغات لذلك فالعدد هنا يعتمد على اللغة لكن أشهرها و اعمها هى الأمر السادس
    GOTO

    و صيغته ببساطة Goto ثم العنوان المراد الانتقال إليه وهو غير مشروط ولا خلاف عليه فى اللغات وهويسبب الانتقال المباشر من مكان هذا الأمرللعنوان المذكور بدون قيد أو شرط


    الآن ماذا يحدث لو دخلت فى دورة مثل For و تأكد لك أنها انتهت مبكرا لتحقق شرط ما أو اصبح الاستمرار فيها يسبب مشكلة ما؟
    حسنا توافر لك الأمر السابع وهو Exit
    Exit Break Continue

    الأمر السابع هو أمر للخروج الطارئ وفى باسكوم لديك أربعة صور هى حيث EXIT SUB و EXIT FUNCTION هما ذات الشيء
    EXIT FOR
    EXIT DO
    EXIT WHILE
    EXIT SUB
    EXIT FUNCTION


    و تكتب كما هى أى لا تكتفى بكلمة Exit ولكن تتبعها بالدالة وهى للخروج الطارئ عند حدوث خطأ ما أو جدت أنه لا داعى للاستمرار و سبب ضرورة ذكر اسم الدالة لا يخفى على أحد فغالبا ما تكون مثلا دورة For داخل وظيفة Function أو داخل دورة أخرى مثل Do لذا وجب تحديد مما تخرج بالضبط.
    فى ميكروإلكترونيكا و فى كلا المترجمين البيزك و C قصرت على SUB أو Function وتكتب وحدها فقط أى لو لديك وظيفة أو دالة ثم فى خطوة ما وجدت أنه لا داعى للاستمرار أوحدث خطأ ما و يجب الخروج تكتبها فتعود لاستكمال الكود الأصلى.
    أما باقى ألدوال For,DO,WHILE فقد استخدمت كلمة Break للخروج و نذكر أننا تعرضنا لها فى أمر Switch السابق و أضافت أمر آخر هو Continue لتفويت أو تخطى هذه الدورة فقط دون الخروج و استكمال باقى الدورات


    الأمر الثامن هو العودة Return
    Return

    قبل مناقشته يجب أن نعود للأسيمبلى للارتباط الوثيق بينهما. كلنا نعلم ما هو Subroutine و لمن لا يعلم هو قطعة من الكود ستتكرر كثيرا فى البرنامج ولو أعدنا كتابتها قد لا نجد ذاكرة تكفى، تخيل أنك لو كل مرة تريد كتابة رقم أو حرف على شاشة ستكتب لها كود، كم مليون مرة ستحتاج لكل تحديث للمعروض؟، لذا يكتب هذا الكود فى عنوان فى مكان ما من الذاكرة أى يبدأ بهذا العنوان وهذا الكود يسمى Subroutine أى إجراء فرعى وهو فى اللغات العالية تحول إلى دالة أو وظيفة أما كونه يعيد قيمة ما فببساطة يضعها فى خانات من الذاكرة محددة ليستغلها الكود الطال لاحقا
    حسنا كيف ستنهيه إذن لتكمل باقى البرنامج أو حتى تكتب كود Subroutine آخر؟ أجل الأمر GOTO لكن مهلا نذهب لأين و أنا أصلا لا أعلم من أين استدعيت؟
    حسنا يجب إذن أن نضيف لها أمر نهاية خاص بكود مختلف وهو أمر RET اختصار Return و أمر الانتقال إليه لا يكون بالأمر GOTO ولكن أيضا بأمر مختلف GOSUB
    إذن المتحكم عندما يجد الأمر GOSUB متبوعا بالعنوان ، يعلم أنه عائد للخطوة التالية لذا سيحفظ عنوان العودة (عنوان الخطوة التالية) فى الرصة Stack و يذهب لعنوان Subroutine المذكور فى الأمر و ينفذه و عندما ينتهى سيجد الأمر RET وهذا يجعله يستعيد العنوان من الرصة ليستأنف العمل حيث كان قبل طلب Subroutine
    حسنا هذا جميل لكن مهلا هناك موضوع آخر على قدر كبير من الأهمية وهو المقاطعة ، عندما تحدث سيفعل المتحكم ذات الشيء من حفظ الخطوة التالية ثم الانتقال لعنوان خدمة المقاطعة و يوقف كافة المقاطعات التالية و يجب عندما يعود من خدمه المقاطعة أن يتيح المقاطعة أيضا إضافة لاسترجاع العنوان ، لذا فكود المقاطعة ينتهى بأمر مختلف هو RETI اختصار Return from Interrupt أى أن كلاهما سيعيد المتحكم للعنوان الصحيح لكن المقاطعة ستختلف و الخطأ فى استخدامها قد يسبب أن المتحكم يستجيب لأول مقاطعة ثم يمتنع بعد ذلك وقد تظن أنه لا يستجيب إطلاقا لو كانت أول مقاطعة من مصدر سريع مثل 50 هرتز الخ.
    هذا فضلا عن أن فى كثير من المتحكمات يتم حفظ بعض المسجلات آليا و استعادتها آليا لضرورة ما بها من بيانات و أهميتها.
    هذا التمهيد يتيح لنا فهم الخلافات ففى ميكروإلكترونيكا جعلت الأمر Return واحدا وهو العودة للخطوة الطالبة أى ستولد RET أما لو كان الأمر يخص مقاطعة فإعلان كود المقاطعة هو ألذى سيحدد أن العودة ستكون RETI .
    أما فى باسكوم فالأمر مختلف ، لو فى داخل شرط ستعطى RET ولو بدون شرط فأول واحدة فقط تعطى RETI وهذا فى رأى المتواضع تعقيد لا جدوى منه و سيفرض استخدام الأمر GOTO لتذهب حيث الأمر ألذى يعطى RETI


    الأمر التاسع هو GOSUB
    GOSUB هو أمر للانتقال إلى Subroutine سواء فى الكود أو داخل وظيفة أو دالة

    قد ترى أن الأمر مكرر ولا جدوى من هذا الأمر لكن معذرة أخى الكريم فللضرورة أحكام و السبب ببساطة أنك لا تستطيع أن تعلن عن وظيفة أو دالة من داخل أخرى لذا فإن احتجت لتكرار كود داخل دالة فإما تجعله فى دالة منفصلة و هذا يزيد عددهم بلا داعى أو لو هذا التكرار لا يطلب إلا فى هذه الدالة أو وظيفة فقط فلتسهيل تتبع الكود يمكنك أن تجعلها داخلية بهذا الأمر وهى ستطال كافة المتغيرات أى لا حاجة لتفريقها كدالة أو وظيفة فهى فقط Subroutine
    الأمر بسيط وهو GOSUB متبوعا بالعنوان وهو فى البيزك لكلا المترجمين لكن للأسف C لا يدعمه


    الأمر العاشر و الأخير هو
    On Value

    استخدمت باسكوم أمرا من أوامر البيزك المرئى للحاسب مع المتحكمات و هو أن تكتب ON متبوعة بمتغير ثم تختار GOTO أو GOSUB ثم مجموعة من العناوين
    كود:
    ON var [GOTO] [GOSUB] label1 [, label2 ] [,CHECK]
    لو المتغير = صفر سينتقل لأول عنوان أو لو = 1 سينتقل للثانى و هكذا ولو كان الرقم أكبر من عدد العناوين ستتلف الرصة لذا يمكنك إضافة الكلمة الأخيرة CHECK فلو حدث هذا لا يتم أى انتقال و ينفذ السطر التالى مباشرة

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

    المرة القادمة إن شاء الله نعيد البرنامج بالبيزك ثم إن شاء الله بعده بلغة C

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

    افتراضي الغسالة باستخدام c51 و لغة البيزك

    الغسالة باستخدام C51 و لغة البيزك:

    من الأفضل أن نعيد هنا ذات الدائرة حتى نرجع إليها




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

    و نبدأ بالبيزك ، باسكوم ثم سنستخدم ميكروإلكترونيكا لتبيان الفرق ثم C . عند بدء مشروع جديد سيفتح لك صفحة خالية و من القائمة Option\Compiler\chip تحدد اسم المتحكم و تردد الكريستال الخ. ثم تنقر زر Add Code ثم تعود للصفحة و إن شئت تكتب فى أول سطر تعليق أنها تعريفات Definition فلا بأس يلى ذلك التعريفات السابق استخدامها. بما أننا نستخدم ذات الدائرة فللتسهيل يمكنك نسخ الكود بالأسيمبلى كاملا من بروتس و لصقه هنا ثم من قائمة Edit اختار Replace أو انقر CTRL+R و اكتب فى الخانة الأولى كلمة EQU و فى التالى كلمة Alias واختار Replace all و بهذا انتهت أول خطوة
    إن شئت يمكنك تجميع كل ثلاثة أوامر فى سطر واحد باستخدام ":” و إن شئت فلا ولكنى سأفعلها حتى لا تكون الصفحة طويلة خاصة فى المنتديات- لاحظ أن وجود كود الأسيمبلى لن يضير المترجم و ستصبح هكذا
    التعريفات

    كود:
    ' DEFINITIONS Leds Alias P0 : Relays Alias P1 : Switches Alias P2 : Controls Alias P3 Fullled Alias Leds.0 : Halfled Alias Leds.1 : Smallled Alias Leds.2 Hotled Alias Leds.3 : Mildled Alias Leds.4 : Coldled Alias Leds.5 Wateron Alias Relays.0 : Drainon Alias Relays.1 : Heateron Alias Relays.2 Motoron Alias Relays.3 : Run_nspin Alias Relays.4 : Waterfull Alias Relays.5 Waterempty Alias Relays.6 : Dooropen Alias Relays.7 : Midtemp Alias Switches.0 Hitemp Alias Switches.1 : Cold Alias Switches.2 : Mild Alias Switches.3 Hot Alias Switches.4 : Small Alias Switches.5 : Half Alias Switches.6 Full Alias Switches.7 : Run Alias Controls.1 ' VARIABLES Dim Runtime As Word Jobpending Alias PSW.5 Emergency: Goto Begin Counttime: Decr Runtime If Runtime = 0 Then Reset Jobpending Stop Timer0 End If Return


    هنا نلاحظ أننا وضعنا تعريفا بأن التالى متغيرات فقط لتذكيرك لكن المترجم لا يقرأه بل سيتعرف على ذلك من كلمة Dim السابق شرحها و نختار اسم Runtime وهو الزمن الإجمالى ثم As Word أى من صفر حتى 65535 و بذلك أكبر زمن هو 1092 دقيقة و نغير كلمة F0 بالمكافئ لها وهو PSW.5 لأن المترجم لا يعرفها وهذا قصور فيه ، ثم من شريط الأدوات ستجد زر عليه علامة صح فقط – انقر عليه سيتوقف على أول سطر org 0000h و ذلك لأنه لا يدعمها و نحن عادة لا نحتاجها إلا للمقاطعة وهذا المترجم يتعامل معها بطريقة خاصة فكما علمنا أن هذه المهام ليست من اللغات العالية ولكنها إضافات بحسب المترجم. حسنا احذف هذا السطر و التالى sjmp Start فلم نعد بحاجة إليه فهو سيتولى ذلك عنا.

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


    ثم بعد ذلك سنجد عنوان INT0 (IE0)Emergency وهو خانة 3 فى الذاكرة ولكن المترجم سيتولى ذلك فكيف نعرفه ما نريد أى أن هذا الكود لمقاطعة و أيها هى؟
    حسنا نضع عنوان فى أى مكان و ليكن Emergency: و نكتب تحته ما فعلناه فى البرنامج السابق و كان sjmp Start لكن بمجرد كتابة الكلمة Start ستظهر بجوار مؤشر الكتابة مربع به ثلاث خيارات للمؤقتات الثلاثة ، إذن كلمة Start من الكلمات المحجوزة لتشغيل و إيقاف المؤقتات و لن تصلح كعنوان فنستبدله بكلمة Begin و التى لا تسبب شيء فنضع بعدها مباشرة ":” لتصبح عنوان ولا تكتب شيء بعده على السطر . لاحظ أنك تفصل بين الأوامر بالحرف " : “ و الفارق هو مسافة قبله و بعده لذا لو وضعتها ستحصل على رسالة خطأ أن الأمر Emergency غير معروف فى السطر رقم كذا ، الآن sjmp Start ستصبح Goto Begin وهذا فقط ما يفعله لكن لم يعلم بعد أنه لمقاطعة
    سنكتب عنوان جديد للمقاطعة الثانية الخاصة بالتايمر صفر وكان لحساب الزمن فكنا ننقص الثوانى و من ثم الدقائق فإن أصبحت صفرا نوقف العداد و ننزل العلم أى نصفر F0 و هنا دمجناهما معا فى متغير واحد اسمه Runtime و لذا ننقصه ثم نختبره بالأمر IF فإن تحقق نستخدم الأمر RESET لجعل أى بت = صفر أى أنه صالح لبت من منفذ أو من متغير بأى حجم و عكسها Set و تكتب RESET x حيث x اسم البت أو RESET y.x حيث y هو المتغير و x رقم البت فيه وبذلك جعلنا العلم = صفر و الأمر Stop Timer0 لإيقاف التايمر و أخيرا أمر العودة من المقاطعة Return و أيضا هذا هو كود المقاطعة لكنه لم يعلم بعد أنها كذلك
    هنا ستسأل، لماذا لم تكتب فى الأولى أيضا Return ؟
    معك حق لكنها لن تنفذ لأن قبلها أمر انتقال للبداية وهناك يجب أن نتأكد أن كل الأمور مهيأة على الوجه الكامل.
    أرجو أن تمحو كل الأوامر بالأسيمبلى التى استبدلناها بالبيزك. ألآن سيكون لدينا البداية Begin و أول سطر كان

    كود:
    MOV IE,#10000011b ' Enable T0 & INT0 external MOV TMOD,#00000110b ; T0 8bit counter auto reload لم نعد بحاجة إليه ولا للسطر الخاص TMOD فسنستخدم بدلا منهما الأمر CONFIG TIMERx = COUNTER/TIMER , GATE=INTERNAL/EXTERNAL , MODE=0/3


    CONFIG من ما سميناه المكتبات وهى بعضها داخلية أى فى بناء المترجم مثل هذا الأمر و بعضها مضاف أى مكتبة يضاف كود منها عند اللزوم و توجد فى مجلد خاص بالمترجم وكلاهما تجد شرحه فى ملفات المساعدة و بعضها مضافة من مصدر ثالث وهذا الأمر اختصار CONFIGure أى نسّق أو هيأ أو أضبط التالى على الصورة التالية ، ثم اسم المطلوب تهيئته وهو TIMER0
    مجرد أن تكتب CONFIG ستظهر قائمة تختار منها بالأسهم أول بند هو TIMER0 ثم اضغط مسافة أو Enter أو إدخال فتضاف للكود ثم تكتب علامة = فيظهر خيارين COUNTER و TIMER و بالأسهم اختار COUNTER ثم مسافة أو Enter أو إدخال ثم تكتب فاصلة , فتظهر لك أربع خيارات MODE=x و تختار منها 2= MODE و اضغط مسافة و فاصلة لتختار بين INTERNAL/EXTERNAL و طبعا EXTERNAL لأنه سيعد نبضات من الخارج و بعد ذلك نضيف القيم 205 بالأمر = بدلا من الأمر mov ثم قيمة TCON لتجعل INT0 قدح بالحافة .
    التهيئة تجهز العداد لكن يبقى متوقف لذا نكتب Enable فتفتح قائمة نختار آخرها كلمة Interrupts لإتاحة الكل ثم نكرر ونختار Int0 لإتاحة المقاطعة. الأمر MOV SP أيضا سيتولاه المترجم ولم نعد بحاجة إليه
    هنا نلحظ فرق بين الأسيمبلى و اللغة العالية أننا فى الأسيمبلى بأمر واحد وضعنا فى IE إتاحة ما تشاء من المقاطعات بينمت هنا خطوة لكل شيء تتيحه. طبعا يمكنك استخدام الأمر IE=xx كما سبق لكن ستشرح ما هو المتاح و الغير متاح لتتذكره لاحقا مقابل الإختصار. المترجم الذكى يدرك سلسلة الأوامر المتتالية للإتاحة و يجمعها فى أمر واحد أيضا.

    كود:
    Begin: Config Timer0 = Counter , Mode = 2 , Gate = Exteral TH0 = 205 ; Auto reload TL0 = 205 TCON = 1 ; Clr All interrupts, Set INT0 Edge trigger Enable Interrupts Enable Int0 Leds = 11011011b ' Reset All PORTS! select Small cold cycle Relays = 255 Switches = 255 Controls = 255 On Int0 Emergency , Nosave On Timer0 CountTime Bitwait Run , Set ' Run button release LoopAgain:

    ثم تحدد القيم الابتدائية للمنافذ عند بدء التشغيل بالأوامر الأربعة التالية وسطر انتظار زرار Run عند الطوارئ و استخدمنا لهاjnb RUN,$ وهى سنستبدلها بالأمر BitWait أى انتظر البت ثم الاسم و القيمة Set تعنى 1 وهذا يعنى انتظر البت اسمها RUN حتى تصبح 1 ثم اكمل. و أخيرا السطرين
    On Int0 Emergency , Nosave
    On Timer0 CountTime
    والأول يعنى "عند حدوث مقاطعة من" Int0 انتقل للعنوان Emergency ولا تحفظ أى من قيم المسجلات فى الرصة
    و الثانى يعنى "عند حدوث مقاطعة من" Timer0 انتقل للعنوان CountTime مع حفظ أى من قيم المسجلات فى الرصة
    القيمة الفرضية عندما لا تكتب كلمة "Nosave” أن يحفظ البرنامج المسجلات التى تستخدم فى خطوات برنامج خدمة المقاطعة وهو أسلم بالطبع وبهاتين الخطوتين عرفنا المتحكم ماذا يفعل عند كل مقاطعة . و أخيرا كلمة Loop من كلمات اللغة لذا نستبدلها بكلمة LoopAgain و هكذا انهينا ألتهيئة ولو راجعتها الآن ستجدها أسهل من الأسيمبلى فأمر يغنيك عن كثير لكن أحيانا تجد أنك أقل حرية من الأسيمبلى. المرة القادمة إن شاء الله نكتب باقى البرنامج.

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

    افتراضي أول البرنامج

    أول البرنامج

    بعد التهيئة السابقة وصلنا لأول البرنامج حيث العنوان التكرارىLoopAgain بعد ذلك الاختبار If Full = 0 Then أى لو زرار Full مضغوط إذن نفعل السابق وهو ORL ثم LEDs,#00000111b الوظيفة "أو" OR وهى بالأسيمبلى ORL وفى البيزك OR لأنه هنا لا يعتمد النوع الآخر Boolean من OR و تتحول الوظيفة لهذه الصيغة Leds = Leds Or &B00000111
    أى أن اجعل LEDs تساوى = LEDs OR 00000111 و هنا
    &B لتعنى أن الرقم بألنظام ألثنائى Binary.
    قبل أن نترك هذه الخطوة نعلم أن هناك أربعة وظائف هى OR,AND,NOT, EXOR وهى أو – مع – عاكس – أو المطلقة وهى كما هى هكذا لا تحتاج لتفكير ولا تذكر ولا تستخدم رموز أو إشارات – لغة انجليزية بسيطة و مفهومة
    كان من الممكن أن نكمل بطريقتين، الأولى
    كود:
    If Full=0 Then Leds = Leds Or &B00000111 : Reset FulLed End if If Half = 0 Then Leds = Leds Or &B00000111 : Reset HalfLed End If if Small = 0 Then Leds = Leds Or &B00000111 : Reset SmallLed End If
    لكن كما ذكرنا أن الاختبار الأول لو نجح فمضيعة للوقت إجراء الثانى و الثالث لذلك فاستخدام الطريقة الثانية Elseif يجعل الاختبار الأول عند نجاحه سنخرج من المجموعة الأولى ذات الخيارات المتبادلة أى لا يمكن أن يختار 2 منها معا ، واحد وواحد فقط فى كل مرة ، و نفس الشيء فى المجموعة الثانية واحد من ثلاث فقط لذا سنكرر الهيكلية معهم
    البرنامج أصبح
    كود:
    LoopAgain: If Full = 0 Then Leds = Leds Or &B00000111 : Reset FulLed Elseif Half = 0 Then Leds = Leds Or &B00000111 : Reset HalfLed Elseif Small = 0 Then Leds = Leds Or &B00000111 : Reset SmallLed End If If Hot = 0 Then Leds = Leds Or &B00111000 : Reset Hotled Elseif Mild = 0 Then Leds = Leds Or &B00111000 : Reset Mildled Elseif Cold = 0 Then Leds = Leds Or &B00111000 : Reset Coldled End If If Run = 1 Then Goto Loop ' Wait Run Press Bitwait Dooropen , Reset ' Wait Door to close Reset Wateron ' Fill with water Bitwait Waterfull , Reset ' Wait full Tank Set Wateron ' Close water Valve
    أصبح استبدال أوامر الأسيمبلى بالبيزك تكراريا و مفهوما
    فى الأمر التالى استخدمنا فى الأسيمبلى الأمر
    JNB ColdLED,SetCycle ; Cold cycle No Heat needed
    لنختبر إذا زرار البارد قد اختير ننتقل و إلا نشغل السخان و تترجم

    كود:
    If Coldled = 1 Then Reset Heateron ' No Cold then Heater On
    ثم نختبر إذا زرار الوسط قد اختير ننتقل لنرقب حساس الدافئ و إلا نرقب حساس الحار
    JNB MildLED,HOTTemp
    jb HiTemp,$ ; wait mild sensor
    sjmp SetCycle
    HOTTemp:
    jb MidTemp,$ ; wait HOT sensor
    و تترجم هكذا
    كود:
    If Coldled = 1 Then ' not Cold then Reset Heateron ' Heater on If Mildled = 0 Then Bitwait Midtemp , Reset Else Bitwait Hitemp , Reset Set Heateron ' Turn off heater End If ' Now Start Washing

    تذكر أن تعليمه If فى سطر واحد لا تحتاج End If فى آخره،ثم يلى ذلك نفس الهيكلية لاختيار زمن التشغيل نختبر ليد Full أو حمولة كاملة أو small أى حمولة صغيرة ونحدد الزمن هكذا
    كود:
    SetCycle: ; Now Start Washing JNB FullLED,HalfCycle MOV Minutes,#20 sjmp RunMotor HalfCycle: JNB HalfLED,SmallCycle MOV Minutes,#8 sjmp RunMotor SmallCycle: MOV Minutes,#5 RunMotor: و تترجم هكذا If Fullled = 0 Then Runtime = 20 * 60 Elseif Halfled = 0 Then Runtime = 480 Else Runtime = 300 End If

    تعمدت أن اذكرك أننا سنكتب عدد الثوانى مرة واحدة و يمكنك كتابته بصورة رياضية للتذكر و سيحلها المترجم قبل التكويد أى الترجمة أى لن تضيف للناتج أى خطوات فبالنسبة للمترجم 20*60 هى ذاتها 1200 و بهذا لسنا فى حاجة لوضع
    59
    ثانية. الآن نشغل الموتور دورة الغسيل

    باقى الدورات موضوعنا القادم بإذن الله

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

    افتراضي باقى الدورات

    باقى الدورات

    ألان ندير الموتور الفترة الزمنية المحددة ، ولكى نعرف الزمن يجب أن نقيم JobPending أى نجعله = 1 و ندير الموتور و ننتظر JobPending أن يحدد نهاية المدة و كانت هكذا
    كود:
    RunMotor: MOV Seconds,#59 SETB JobPending CLR MotorOn SETB TR0 ; Start Timer/Counter JB JobPending,$ ; Wait to Finish SETB MotorON ; stop motor
    لا خانة للثوانى الآن فلا تترجم والعنوانRunmotor لا حاجة له ثم جعل دليل الوقت Jobpending=1 ثم تشغيل الموتور و انتظار نهاية الوقت ثم إيقاف الموتور .
    كود:
    Set Jobpending ' Timing flag Reset Motoron ' Start Motor Start Timer0 ' Start Timer/Counter Bitwait Jobpending , Reset ' Wait to Finish Set Motoron

    ألان نحتاج لدورتين للشطف و من المتوقع أن يكونا متطابقتين، لذا لونت إحداهما بلون مختلف ليمكنك متابعة خطوة بمثيلتها للتحقق من ذلك. فتح الصرف و انتظار حساس " فارغ" ثم غلق الصرف ثم فتح المياه و انتظار تمام ألملو ثم تشغيل الموتور و انتظار الوقت ثم إيقاف الموتور . حسنا هل كان من الممكن كتابة كود واحد و تكراره مرتين، نعم فقط سنضيف فى قسم التعريف بالأعلى التعريف Rinse Equ 20 أى أن متغيرا باسم Rinse فى خانة الذاكرة رقم 20 (أو أى خانى فارغة تريد) و هذا يتيح لنا أن نأتى فى أول الدورة و نكتب ما يلى بالأسيمبلى
    كود:
     
    
    
    CLR DrainON ; Open Drain JB WaterEmpty,$ ;Wait Drain Setb DrainON ; Close Drain CLR WaterON ; Fill again JB WaterFull,$ SETB WaterON ; Close Water MOV Minutes,#5 ; 1St Rinse MOV Seconds,#59 SETB JobPending CLR MotorOn ; Start Rinse SETB TR0 ; Start Timer JB JobPending,$ ; Wait to Finish Setb MotorOn ; Stop Rinse CLR DrainON ; Open Drain second cycle JB WaterEmpty,$ ;Wait Drain Setb DrainON ; Close Drain CLR WaterON ; Fill again JB WaterFull,$ SETB WaterON ; Close Water MOV Minutes,#5 ; 2nd Rinse MOV Seconds,#59 SETB JobPending SETB TR0 ; Start Timer/Counter CLR MotorOn ; Start Rinse SETB TR0 ; Start Timer JB JobPending,$ ; Wait to Finish Setb MotorOn ; Stop Rinse
    كود:

    هكذا نستخدم نظام الدورات لاحظ أن السطر الأول تمهيدى و قد أضيف لتحديد عدد الدورات بدورتين . أيضا السطر الأخير تكملة له أما باقى التعليمات فهى ملونة لتقارنها بالملون السابق و ستجدها نسخة مكررة.
    كود:
    Mov Rinse,#2 RinseLoop: CLR DrainON ; Open Drain JB WaterEmpty,$ ;Wait Drain Setb DrainON ; Close Drain CLR WaterON ; Fill again JB WaterFull,$ SETB WaterON ; Close Water MOV Minutes,#5 ; 1St Rinse MOV Seconds,#59 SETB JobPending CLR MotorOn ; Start Rinse SETB TR0 ; Start Timer JB JobPending,$ ; Wait to Finish Setb MotorOn ; Stop Rinse Djnz Rinse, RinseLoop
    وهكذا نوفر كتابة الكود مرتين و نضيف فقط زمن الاختبار و الانتقال وهذا مثال آخر للكود الأقصر طولا و أطول زمنا لكن له ميزة أخرى لا تقدر وهى أننا لو أردنا تغيير عدد دورات الشطف فكل ما نحتاجه هو أن نضع قيمة مختلفه (من المستخدم عبر لوحة مفاتيح مثلا) فى الخانة المسماة Rinse أو ذاكرة رقم 20 وهو سيكررها بالعدد آليا بدلا من تكرار الكود عدة مرات مستهلكا كم أكبر من ذاكرة البرنامج.
    ألان نترجم هذا بلغة البيزك نضيف فى التعريفات Dim Rinse As Byte , cntr as byte و هنا تترجم التعليمات هكذا .
    كود:
    For cntr = 1 To Rinse Reset Drainon ' Open Drain Bitwait Waterempty , Reset ' Wait Drain Set Drainon ' Close Drain Reset Wateron ' Fill again Bitwait Waterfull , Reset Set Wateron ' Close Water Runtime = 300 ' Rinse Time Set Jobpending Reset Motoron ' Start Rinse Start Timer0 ' Start Timer Bitwait Jobpending , Reset ' Wait to Finish Set Motoron ' Stop Rinse Next ' Loop Back
    الخطأ هنا أننا لم نضع قيمة فى المتغير Rinse لذا يجب أن نكتب فى التهيئة مثلا Rinse=2 أو لاحقا يمكنك تطوير البرنامج ليعدل مرات الشطف حسب كمية الغسيل أو باختيار المستخدم من لوحة مفاتيح الخ. فهذا تعليمى على أى حال. الباقى هو دورة العصر وهى لا تختلف إلا فى تفعيل ريلاى العصر لدوران الموتور بسرعة عالية
    كود:
    CLR DrainON ; Open Drain JB WaterEmpty,$ ;Wait Drain MOV Minutes,#3 ; SPIN MOV Seconds,#59 SETB JobPending CLR MotorOn ; Start Rinse CLR Run_Nspin ; SPIN SETB TR0 ; Start Timer/Counter JB JobPending,$ ; Wait to Finish MOV Relays,#255 ; ALL OFF, INITIAL State MOV Controls,#255 jmp Loop ;==================================== END وتترجم هكذا Reset Drainon ' Open Drain second cycle Bitwait Waterempty , Reset ' Wait Drain Runtime = 180 ' SPIN Set Jobpending Reset Motoron ' Start Rinse Reset Run_nspin ' SPIN Start Timer0 ' Start Timer/Counter Bitwait Jobpending , Reset ' Wait to Finish Relays = 255 ' ALL OFF, INITIAL State Controls = 255 Goto Loopِagain
    لو استخدمتGoto Begin يمكنك الاستغناء عن الأمرين السابقين لها أيضا للتكرار . المرة القادمة إن شاء الله سنستخدم بيزك ميكروإلكترونيكا و بعدها C من ميكروإلكترونيكا

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

    افتراضي

    البرنامج بمترجم بيزك من ميكروإلكترونيكا

    ها هو البرنامج كاملا لمترجم باسكوم و سنعدل ما نحتاج فقط
    كود:
    نظرا لعدم قبوله أكثر من أمر لكل سطر فسنضطر إلى التعريف هكذا program WM ' Declarations section symbol FullLED = LEDs.0 symbol HalfLED = LEDS.1 symbol SmallLED = LEDs.2 symbol HOTLED = LEDs.3 symbol MildLED = LEDs.4 symbol ColdLED = LEDs.5 symbol WaterOn = Relays.0 symbol DrainOn = Relays.1 symbol HeaterOn = Relays.2 symbol MotorOn = Relays.3 symbol Run_Nspin = Relays.4 symbol WaterFull = Relays.5 symbol WaterEmpty = Relays.6 symbol DoorOpen = Relays.7 symbol MidTemp = Switches.0 symbol HiTemp = Switches.1 symbol Cold = Switches.2 symbol Mild = Switches.3 symbol Hot = Switches.4 symbol SmallLoad = Switches.5 symbol Half = Switches.6 symbol Full = Switches.7 symbol RUN = Controls.1 Dim Leds as byte at P0 dim Relays as byte at P1 Dim Switches as byte at P2 Dim Controls as byte at P3 Dim JobPending as sbit at PSW.F0 dim RunTime as word dim Rinse as byte dim cntr as byte sub procedure INT0_Interrupt() org IVT_ADDR_EX0 asm sjmp 0 end asm end sub sub procedure Timer0_Interrupt() org IVT_ADDR_ET0 Dec (RunTime) If RunTime = 0 then JobPending = 0 TR0_bit = 0 ' Stop Timer1 end if end sub

    السطر الأول اسم البرنامج ثم التعريفات كما سبق الشرح و لكن هذا المترجم يتطلب إعلان الاسم بكلمه DIM قبل استخدامه أى Symbol لا تجدى فى تعريف ما يلى كما فى باسكوم لذا سنعرف المنافذ كلها
    للمقاطعة يستخدم هذا المترجم تعريف مختلف
    sub procedure INT0_Interrupt() org IVT_ADDR_EX0
    حيث Sub كلمة يستخدمها دوما كما فى فكر لغة C وهى زائدة كما بينا فى باسكوم فهو يتبعها بكلمة procedure أو كلمة Function وواحدة تغنى ثم اسم المقاطعة وهو هنا INT0_Interrupt() ثم كلمة org أو IV لتخبره أنها مقاطعة Interrupt Vector و أخيرا العنوان IVT_ADDR_EX0
    فى المقاطعة الخاصة بالطوارئ كنا سنستخدم انتقال للبداية GOTO Begin لكنها لا تقبل رقم و تطلب عنوان "سبق تعريفه" لذا إما ننقل كل الكود لآخر البرنامج أو لنتحايل و نبقى على التتابع استخدمنا الأسيمبلى بالتعريف asm ثم القفز ثم end asm. المقاطعة الثانية نستخدم نفس الأوامر.
    يلى ذلك أوامر التهيئة ما بين Begin , LoopAgain

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

    افتراضي

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

صفحة 4 من 4 الأولىالأولى ... 2 3 4

المفضلات

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

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

https://fahraf1.com/wp

https://electricstuffs.com

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