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

   

ayam
:: مهندس جيد ::
تاريخ التسجيل: Dec 2005
المشاركات: 287
نشاط [ ayam ]
قوة السمعة:
قديم 19-06-2018, 05:13 PM المشاركة 33   
افتراضي



استاذى ال العزيز , انا استعمل mplab , واستعمل البيسك , ولم اجد الكود jb , انما هو bz و bnz او jnz
وشكرا لك

اعلانات

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


استاذى ال العزيز , انا استعمل mplab , واستعمل البيسك , ولم اجد الكود jb , انما هو bz و bnz او jnz
وشكرا لك
شكرا للمتابعة و لكنى لا استعمل mplab

أيضا قبل أن نناقش المسأله فالتعليمة JB هى بالأسيمبلى و ليست بيزك و المفترض أن مترجم البيزك سيتعرف عليها لو سبقت مجموعة الأوامر بأمر يخبره أنها اسيمبلى مثل #asm فى بعض المترجمات الخ و البعض يطلب أن تنهى أيضا بأمر

هذا الملف
http://ww1.microchip.com/downloads/e...oc/doc0509.pdf
من الشركة الصانعة و به كافة الأوامر التى يمكنك استخدامها مع هذه العائلة و ستجد هذا الأمر فى صفحة 26 و ما تجده فى هذا المستند معتمد من الصانع فإن لم تجده فى مترجم آخر فهو قصور بهذا المترجم الآخر

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

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

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 20-06-2018, 10:18 AM المشاركة 35   
افتراضي صورة أخرى من ألتعليمه 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

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


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



البرنامج باستخدام 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


احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 322
نشاط [ احمد شهيد جواد ]
قوة السمعة:
قديم 21-06-2018, 12:03 PM المشاركة 37   
افتراضي


السلام عليكم استاذ ماجد ....

سؤال : لو أنني عرفت مدخل تماثيلي لقراءة اشارة معينة كـ قياس الجهد مثلا . ثم انقطعت هذي الاشارة .. هل سيؤثر هذا على استقرار المتحكم ؟؟؟

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


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


السلام عليكم استاذ ماجد ....

سؤال : لو أنني عرفت مدخل تماثيلي لقراءة اشارة معينة كـ قياس الجهد مثلا . ثم انقطعت هذي الاشارة .. هل سيؤثر هذا على استقرار المتحكم ؟؟؟

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

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


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 22-06-2018, 09:16 AM المشاركة 39   
افتراضي البرنامج باستخدام 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 = 3
       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 وهذه أيضا إحدى حسنات اللغات العالية وهى أن الكود أغلبه لا يحتاج تعديل .
مزيد من خواص المتحكم فى المرة القادمة إن شاء الله



ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 23-06-2018, 10:00 AM المشاركة 40   
افتراضي مسجل الوظائف الخاصة 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 مباشرة
على المقابل من الأمر مثلا
MOV 50, #data
حيث تحتاج لبايت للأمر MOV مشيرا للذاكرة ثم بايت أخرى لتحدد العنوان 50 فى الذاكرة و البايت الثالثة قيمة data التى تريد حفظها.
حسنا ! أين إذن هذه المسجلات الثمانية؟
لا تفاجأ – فهى يمكن أن تحتل أربع أماكن من الذاكرة العشوائية ، إما من صفر إلى 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 ولها خواص برمجية مميزة.
فى عائلة ميكروتشيب فعددها محدود جدا مما يعقد استخدامها

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




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