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

   

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 13-06-2018, 09:45 AM المشاركة 17   
افتراضي أول برامجنا ج2




ابتكر أحدهم فى شركة إنتيل استخدام كلمة Move وهى تعنى حرك أو انقل لكى تعنى انسخ ولا أدرى لماذا بينما استخدم نظيره فى موتورولا كلمة Load وهى بمعنى "حمًّل" أو "ضع شيء فى" ، وهى أقرب للمنطق لكن هكذا سارت الأمور و تبنت Mov كل من إنتيل و لاحقا أتميل و أيضا ميكرو تشيب
الاسم Mov هو مختصر ودوما بدون حرف e و يليها المنقول إليه أو الهدف ثم فاصلة "," ثم المنقول منه أو المصدر و لا قيود على من سيكون المصدر و من سيكون الهدف ، محتوى خانة ذاكرة أو عنوان الخانة أو مسجل و بهذا. لو كان المصدر حرفيا بمعنى رقم ما تريد نسخه أو وضعه فى مسجل ما نضع قبله علامة شباك "#” و بدون هذه العلامة سواء فى المصدر أو الهدف فهو عنوان لخانة ذاكرة و ما سيتأثر هو محتواها

السطر الأول سيكون
Mov P0 , #255
Mov p3 , #255
وهذا يعنى ضع فى المنفذ P0 القيمة 255 لوجود علامة "#” ثم السطر الثانى سيعنى ضع فى المنفذ P3 القيمة 255 لوجود "#” أيضا. هذا يعنى جعل كل أطراف هذين المنفذين عليهما +5 فولت و يمكن استخدامهم كمداخل أيضا.
ماذا لو لم نضع الشباك؟ أى هكذا MOV P3 , 255 سيترجمها المترجم انك تريد محتوى خانة الذاكرة رقم 255 حسبما يتصادف محتواه.
كود:
Loop:	
     jb	p3.0 ,  SW2test
     mov	P0 , #11111110b
SW2Test:     
     jb	P3.1 , SW3Test
     mov	P0 , #11111100b
SW3Test:
     jb	p3.2 , start
     mov	P0 , #11111000b
      jmp start
;===========================
  END

الآن انسخ السطور السابقة فى مترجم بروتس وهذا شرح كل منها.
Loop:
عنوان و لدينا أيضا عنوانين آخرين هما SW2Test و SW3Test وهى ذات فائدة فى تحديد مسار البرنامج
يليه الأمر JB وهو اختصار Jump if Bit set و يعنى اقفز لو البت =1 وهو يليه اسم هذه البت ثم فاصلة ثم إزاحة عدد الخطوات التى يجب الانتقال إليها. هذه الخطوات هى فى بايت واحدة لذا ستكون بإجمالي 255 خانة بين للأمام 128 خطوة و للخلف 127 خطوة.
سيكون من الصعب عليك حساب عدد الخطوات فستحتاج لمعرفه كم خطوة لكل تعليمه الخ لذا نستخدم عنوان و نترك المهمة الصعبة للمترجم.
إذن السطر التالى يعنى
لو البت "المنفذ3 الطرف صفر" =1 اقفز حيث العنوان SW2test وهذا يعنى أنني اختبرت المفتاح SW1 فإن لم يفعل سينتقل للعنوان "اختبار المفتاح2” وهذا من فوائد العنوان أن يكون معبرا عن هدف هذه الخطوة لتذكيرك ماذا أنت ذاهب لتفعل
أما لو كان مضغوطا على المفتاح1 سيجعل الطرف = صفر و من ثم لن ينتقل و سينفذ ألتعليمه
mov P0 , #11111110b
أى سيضع صفرا على الطرف المتصل بالليد الأول ليضئ وهنا كان ممكن أن نكتب MOV P0 , 254 لكن قد تتساءل لاحقا ماذا تعنى 254 ووضعها بالصورة الثنائية أوضح لك أن كل الأطراف آحاد ماعدا الأول بصفر ، ثم نكرر عند العنوان SW2Test حيث نجد نفس ألتعليمه إلا أن البت أصبحت P3.1 أى المنفذ 3 الطرف رقم 1 و القفز للعنوان SW3Test
إن لم ينتقل أو يقفز سينفذ الأمر
mov P0 , #11111100b
و به تضيء ألليد الأول و الثانى.
و بعد العنوان الأخير سنجد الاختبار الأخير للبت الثالثة إلا أن القفز للبداية فإن لم يقفز سيضيء الليدات الثلاث ثم يقفز للبداية لتكرار الاختبارات مرة أخرى بالأمر Jmp لتحديد متى يتم الضغط على أى الأزرار.
و فى الحقيقة أمر JMP ليست من الأوامر رغم أن كل المترجمات تتبناها و الأمر الصحيح هو
AJMP أو LJMP و الفرق بينهم بايت واحدة فالأول AJMP من2 بايت و يعمل على 2 ك من حيث كتبت بينما الثانى LJMP من 3 بايت و يغطى المدى كاملا وهو ما تترجم إليه كلمة Jmp عادة.
قبل أن نترك الموضوع تعلمنا الأمر JB و هناك الأمر عكسه وهو JNB أظن توقعت Jump if Not Bit set يعنى سيختبر البت و الانتقال سيكون لو = صفرا بدلا من لو =1
آخر سطر وهو END لا معنى له و كثير من المترجمات استغنت عنه ولكنه مستبقى لأسباب تاريخية فقط.
قديما عندما كانت البرامج تدخل للحاسب بالبطاقات المثقبة لم يكن هناك وسيلة لتعلم الحاسب أن هذا آخر كارت برنامج وهذا تمام الكود عكس الآن حيث يقوم نظام التشغيل بهذه المهمة و يحدد لك أول و آخر الملف . لذا كان لابد أن يكون آخر كارت عليه هذا الكود END و إلا سيحصل على رسالة أن الملف غير كامل. أما الآن فسيقول لك لم أجد كلمة END، حسنا وماذا لو وجدتها؟؟ أليست آخر كلمة فى الملف؟ ولو انتهى الملف أليس هذا كاف من نظام التشغيل أن يخبرك بتمام الملف؟؟
الآن جرب محاكاة البرنامج و ستجده يعمل و الليدات تضئ و تطفئ طالما الزر مضغوطا عليه.
لكن هناك ملاحظات تتطلب التعديل، حاول أن تكتشفها و تعدلها قبل موضوعنا القادم بإذن الله.

اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 14-06-2018, 09:46 AM المشاركة 18   
افتراضي المشكلة و اصلاحها



لعلك لاحظت أن المحاكاة كشفت أن الليدات الثلاث تطفئ ثم تضيء مرة أخرى وهذا فى برنامجنا لا شيئ لكن فى الواقع لو هذا فى آله و تقوم بذبذبة جزء منها بهذا المعدل قد تتلفها، إذن ما العيب و كيف نصلحه؟؟
العيب أنك فى كل مرة تقفز إلى 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 ثم نقفز لتكرار الاختبارات دون إطفاء.

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


ألمرة القادمة بإذن الله سنكرر نفس البرنامج مع بيك.

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

الصورة الرمزية burai nuraldaem
burai nuraldaem
:: عضو فضى ::
تاريخ التسجيل: Nov 2015
الدولة: السودان
المشاركات: 501
نشاط [ burai nuraldaem ]
قوة السمعة:
قديم 14-06-2018, 05:36 PM المشاركة 19   
افتراضي


ماشاء الله تعالي
متابعين معك انشاء الله الي النهايه


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 15-06-2018, 10:44 AM المشاركة 20   
افتراضي


ماشاء الله تعالي
متابعين معك انشاء الله الي النهايه
أولا كل عام و انتم بخير أعاده الله علينا جميعا بالخير و اليمن و البركات
ثانيا أسعدنى جدا هذا التعليق الرقيق و اكرر شكرى


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 15-06-2018, 10:56 AM المشاركة 21   
افتراضي الدائرة باستخدام ميكروتشيب PIC16F877A



ميكروتشيب PIC16F877A
الآن سننفذ ذات الدائرة على بروتس باستخدام PIC16c877A متحكم و معه ذات المكونات و الدائرة كما بالرسم.
سنلاحظ اختلاف فى توصيل الليدات و السبب أن منافذ ألبيك قادرة على الإمداد بالتيار عكس أتميل التى تقبل فقط.

نلاحظ أيضا أننا لن نتعامل حاليا مع منفذي A,E لارتباطهما بالمحول تماثلى رقمى و يجب تهيئتهما للتعامل كمنفذ رقمى فقط.
يمكننا استخدام ألباقى وسنختار المنفذ D .

المنفذ B يحتوي مقاومات جذب للأعلى Pull-up وهى خاصية ضرورية لأن المنفذ عندما يهيأ كدخول ستكون له معاوقة دخول عالية و من ثم الجهد عليه غير محدد و عند قراءته كطرف رقمى قد يقرأ 1 ثم يقرأ صفر بلا انتظام ولكنها توضع للأطراف الثمانية معا أو تحذف معا ولا ينصح باستخدامها لو البعض دخول و الباقى خروج و هذا يعالج بوضع المقاومات هذه خارجيا وهى R4,R5,R6 و عادة ما تكون 10 ك أوم , ولذا لم يعد مهما استخدام المنفذ B كدخول أو خروج و سنختار كما هو بالرسم.
بمراجعة صفحة الكود سنجد كما سبق كثير من الأسطر لا حاجة لها الآن سوى سطر
كود:
#include p16f877a.inc                ; Include register definition file
وهو لتعريف المترجم أسماء مكونات المتحكم ثم يلى ذلك تعريف بدء البرنامج بتحديد البدء RESET ثم الانتقال لأول البرنامج بالأمر GOTO START وأخيرا إلغاء طرف البرمجة فى البوردة PGM

RST code 0x0
goto Start
PGM code

بعد ذلك نبدأ بتهيئة المنفذ B كخروج و المنفذ D كدخول و هذا بتنفيذ الأمر TRISB=0 و يكتب هكذا

كود:
      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

حيث CLRF تعنى Clear أو إلغاء محتوى المسجل المشار إليه بالحرف f وهو هنا STATUS وهذا لاختيار المجموعة صفر حيث لا يمكن للبيك أن يتعامل مع الذاكرة ككل و يقسمها لمجموعات كل منها تسمى بانك أو مجموعة أو BANK و نختار Bank0 لجعل المخارج أصفار بالأمرين CLRF PORTB ثم CLRF PORTD بعد ذلك نختار بانك رقم 1 بالأمر BSF STATUS, RP0 لتهيئة المنافذ بعد ذلك بالأمر CLRF TRISB لجعل المنفذ B مخارج.

لتهيئه المنفذ D كدخول نحتاج لأمر مشابه للسابق أى TRISD=255 و المشكلة أنك لا تملك أمر مماثل لأتميل حيث تكتب ما تشاء حيث تشاء كيف تشاء لكن يمكنك فقط كتابه ما تشاء فى المسجل W ثم تنسخه حيث تشاء بعد ذلك، ولهذا تحتاج لأمرين هما

MOVLW 255
MOVWF TRISD

حيث الأول Move Literal W أو اكتب حرفيا فى المسجل W و القيمة المطلوب كتابتها هى 255 أى 11111111 ثنائى ثم نسخها للمسجل TRISD بالأمر التالى MOVWF أو انقل محتوى W للمسجل F و المسمى هنا TRISD و أخيرا الأمر
CLRF STATUS ; Bank0
لنعود للبانك صفر مرة أخرى لنكتب فى المنافذ. نبدأ البرنامج بالعنوان

كود:
Loop:  
      BTFSC      PORTD , 0
      GOTO	 Sw1
      MOVLW      1
      MOVWF      PORTB
      GOTO       Loop
هذا حيث سيتكرر البرنامج دوما و سنختبر المفاتيح بالأمر

BTFSS f, b Bit Test f, Skip if Set
و هى تعنى اختبر البت f و لو =1 لا تنفذ الأمر التالى مباشرة و عكسها
BTFSC f, b Bit Test f, Skip if Clear
و هى تعنى اختبر البت f و لو =0 لا تنفذ الأمر التالى مباشرة وهذا الأمر التالى طبعا يجب أن يكون أمر انتقال لمكان ما
GOTO xxx
وهكذا يصبح اختبر المنفذ PORTD الطرف صفر فإن كان =1 انتقل لعنوان Sw1 و إلا فالزر مضغوط ولذا نكتب 1 فى المسجل W ثم ننسخه للمنفذ B و نعود للعنوان Loop لنكرر الاختبار. أما لو انتقلنا إلى Sw1 سنجد
كود:
Sw1:
      BTFSC      PORTD , 1
      GOTO       Sw2
      MOVLW      3
      MOVWF      PORTB
      GOTO       Loop
اختبار مماثل لكن للمنفذ PORTD الطرف 1 بدلا من صفر و الانتقال إلى Sw2 أو إنارة 2 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
Sw2:
      BTFSC      PORTD, 2
      GOTO       SW3
      MOVLW      7
	MOVWF      PORTB
	GOTO       Loop
فى عنوان Sw2 سنجد اختبار مماثل لكن للمنفذ PORTD الطرف 2 بدلا من صفر أو 1 و الانتقال إلى Sw3 أو إنارة 3 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
SW3:     
     CLRF	PORTB 
     GOTO Loop
;===========
      END
و أخيرا فى عنوان SW3 سنطفئ الكل لنعود للأول Loop مرة أخرى و كما ذكرنا أن واقعيا هذه الدائرة لا تعمل و يجب أن تصبح هكذا

من الواضح أن كم التعليمات أكثر بكثير مما استخدم مع السابق C51 وهذا راجع لقله الأوامر المتاحة فضلا عن كثير من التعليمات لا تستنتجها وحدك لبدء التهيئة و التشغيل.
لذا فألبيك يفضل دوما برمجته باستخدام اللغات العالية مثل البيزك أو C. فهذا البرنامج البسيط تطلب العديد من التعليمات ولو كان البرنامج أكثر تطورا ربما أصبح من الصعب تنفيذه بالأسيمبلى بألبيك .
يجب أن نتذكر هنا أننا باستخدام لغة ما غير الأسيمبلى قد تضيف كثير من التعليمات التى كان من الممكن اختصارها بالأسيمبلى.، لكن هناك أمر لا يسهل التغاضي عنه وهو استخدام مكتبات الأرقام العشرية و أنا شخصيا لو احتاج لعدد ثابت من الأرقام العشرية استخدم الحساب بدلا من المكتبات الجاهزة لاستهلاكها لذاكرة البرنامج فمثلا لو احتاج لرقمين صحيحين و كسرين عشريين أعتبر الحسابات ستكون على رقم أعلاه 9999 صحيح و استخدم له 2 بايت (حتى 65000) أو بالإشارة +/-32000 ثم فى عرض الرقم أضيق علامة عشرية بين الثانى و الثالث.
من المثال السابق نستخلص منهجا لما سيلى وهو أننا يمكننا مناقشة الأسيمبلى لمنتجات أتميل C51 فقط بينما AVR , ميكروتشيب سنكتفي باللغات العالية وذلك لكون الأسماء قد تغيرت و أيضا ذاكرة البرنامج زادت حتى سهل استخدام الحساب بالأرقام العشرية و من ثم اقتصرت البرمجة بالأسيمبلى على السرعة أولا و تقليل الحجم إن اضطر الأمر .

المرة القادمة إن شاء الله سنحاول كتابة هذا البرنامج باللغات العالية



الصورة الرمزية burai nuraldaem
burai nuraldaem
:: عضو فضى ::
تاريخ التسجيل: Nov 2015
الدولة: السودان
المشاركات: 501
نشاط [ burai nuraldaem ]
قوة السمعة:
قديم 15-06-2018, 11:54 PM المشاركة 22   
افتراضي


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


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 16-06-2018, 09:51 AM المشاركة 23   
افتراضي تمهيد للغات العالية



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

قبل أن نتناول اللغات العالية يجب أن نتعرض لما تركناه فى الشرح السابق و هو يخص البرمجة بشكل عام سواء بالأسيمبلى أو أى من اللغات العالية وهى الأجزاء الثلاث التالية
كود:
;==================================
; 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 ثم يقوم بالترجمة باستخدام الأعداد و ليس الأسماء و سنوضح الفروق بالأمثلة على لغتى البيزك و السي..
لكن هل من الممكن أن نعدل هذه القيمة بحسب الحاجة؟ هذا يسمى "المتغيرات" لكن لتنوعها سنجعلها المرة القادمة بإذن الله


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 17-06-2018, 04:36 AM المشاركة 24   
افتراضي السلام عليكم ورحمه الله


والله انا متابع من البدايه وماسك نفسي مش عايز اضف تعليق حتي لا افسد تنسيق الموضوع ...بس الموضوع جميل جدااااا وشيق .. اشكرك مهندسنا القدير بارك الله فيك ..
بعد كل هذه المعلومات عن المتحكم AVR اقتنعت به وان شاء الله سوف ابدأ معك في الإنتقال من برمجه ال PIC الي AVR لأنه كما ذكرت حضرتك يحتوي علي امكانيات كثيره تفوق ال PIC

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

تحياتي لك استاذي ...
.



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