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

   

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 13-10-2016, 09:55 PM المشاركة 9   
sun



بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

الحمد لله الذى هدانا لهذا و ما كنا لنهتدى لولا ان هدانا الله .


اخ adelmb :
هناك ملاحظة صغيرة ان شاء الله برنامجك جيد و فكرته جيدة لكن به مشكلة انه سيعمل جيدا على البروتيوس و لكنه لن يعمل عمليا .. لماذا ؟

لانك لم تعالج مشكلة ارتداد المفتاح او debounce و ابسط الطرق هى وضع زمن تاخير كما فى الكودين مثلا delay_ms(200) .
و الله اعلى و اعلم .



الله ولى التوفيق



اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و اهلها و سائر بلادنا



اعلانات

ahmad alharbi
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 17
نشاط [ ahmad alharbi ]
قوة السمعة:
قديم 13-10-2016, 09:58 PM المشاركة 10   
افتراضي


بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

الحمد لله الذى هدانا لهذا و ما كنا لنهتدى لولا ان هدانا الله .



ازاحة لليسار بمقدار بت واحدة , لو كانت PORTB=0000 0001
فبعد الازاحة مرة ستكون PORTB=0000 0010
و مرة اخرى ستكون PORTB=0000 0100
وهكذا



الله ولى التوفيق



اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و اهلها و سائر بلادنا


شرح واضح يعطيك العافية

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

ahmad alharbi
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 17
نشاط [ ahmad alharbi ]
قوة السمعة:
قديم 13-10-2016, 09:59 PM المشاركة 11   
افتراضي


1/
كما ذكر الأخ الكريم مشتاق الله جزاه الله خيرا فهناك أكثر من طريقة لتحقيق الهدف.
الطريقة التي عرضت عليك تستخدم عداد يعد نبضات المفتاح SW .
وعرض عدد النبضات على مخارج PORTB
العداد هو متغير (variable) تم حجزه من ذاكرة RAM للبيك يمكن تسميته بأي اسم كما هو معروف كمثال : counter.
المشكل أن الخرج سيكون بالطبع بنظام العد التنائي (binary) هكذا:
0000
0001
0010
0011
0100
وهذا غير مناسب لتحقيق الهدف المنشود والذي يفرض هذا العرض:
0000
0001
0010
0100
1000
من أجل ذلك تم استخدام مصفومة تضم 5 ثوابت (constant) وذلك بحجز 5 مواضع من ذاكرة الروم للبيك.
و تم اسناد قيم هذه المصفوفة بالتتابع لقيم العداد counter
علما بأني ومن باب التيسير في الكتابة، كتبت قيم المصفوفة {0,1,2,4,8} بنظام العد العشري ،حيث في العادة الكتابة تكون بنظام العد السادس عشري .
لكن ربما إذا تحولت هذه القيم الى النظام التنائي ستبدو العلاقة أكثر وضوحا ، بينها وبين مخارج المنفذ "ب" الاربع الاولى:
كود:
unsigned const char led_out[5] = {0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000};
هذه الطريقة مستخدمة في العرض على عارضة سباعية (7segment display)
كالمثال في الرابط المرفق والذي أخذت منه الفكرة وطوعته ليناسب طلبك .
و بالمناسبة هناك سطر زائد في الكود لا ضرورة له نسيت أن أزيله:
;unsigned int count = 0
++++
http://www.studentcompanion.co.za/in...roller-mikroc/

2/
بالنسبة للقيمة 7 المسندة للمسجل adcon1 فلأنها القيمة التي تهيئ الدخل RA0 ليكون دخلا يجتال وليس أنالوج
وهنا بالمشاركة #5 تفاصيل إن شاء الله تفيدك أكثر أخي الكريم
http://www.qariya.info/vb/showthread.php?t=170178
وضحت لي جميع النقاط شكرا لك عالشرح المفصل


ahmad alharbi
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 17
نشاط [ ahmad alharbi ]
قوة السمعة:
قديم 13-10-2016, 10:01 PM المشاركة 12   
افتراضي


السلام عليكم و رحمة الله و بركاته

هذه مجرد محاولة بسيطة

صورة الدارة



كود البرنامج
كود:
unsigned char g=0;
void main() {
adcon1=7;
trisa=1;
trisb=0; portb=0;
while(1)
{
if(g==1)portb=0b00000001;
if(g==2)portb=0b00000010;
if(g==3)portb=0b00000100;
if(g==4)portb=0b00001000;

if(porta.f0==0){ g++;

                 if(g>4)g=1;
                 
                 while(porta.f0==0){}
                }
}
}

شكرا جزيلا عالكود المختصر


بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

الحمد لله الذى هدانا لهذا و ما كنا لنهتدى لولا ان هدانا الله .


اخ adelmb :
هناك ملاحظة صغيرة ان شاء الله برنامجك جيد و فكرته جيدة لكن به مشكلة انه سيعمل جيدا على البروتيوس و لكنه لن يعمل عمليا .. لماذا ؟

لانك لم تعالج مشكلة ارتداد المفتاح او debounce و ابسط الطرق هى وضع زمن تاخير كما فى الكودين مثلا delay_ms(200) .
و الله اعلى و اعلم .



الله ولى التوفيق



اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و اهلها و سائر بلادنا


شكرا لك تم اضافة التعديل عالكود وشغال تمام


ahmad alharbi
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 17
نشاط [ ahmad alharbi ]
قوة السمعة:
قديم 13-10-2016, 10:28 PM المشاركة 13   
افتراضي


طيب يا اخوان الان اتحكمنا بعدة مخارج بمفتاح واحد

طيب لو ابغى مفتاح واحد وخرج واحد

ولكن تتنفذ عدة اوامر مختلفة على نفس الخرج عند كل ضغطة

مثلا عند الضغطة الاولى

يشتغل الليد لمدة 5 ثواني

ولكن عند الضغطة الثانية يشتغل لمدة 3 ثواني


adelmb
:: مهندس ::
تاريخ التسجيل: Oct 2016
المشاركات: 10
نشاط [ adelmb ]
قوة السمعة:
قديم 13-10-2016, 10:37 PM المشاركة 14   
افتراضي


بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

الحمد لله الذى هدانا لهذا و ما كنا لنهتدى لولا ان هدانا الله .


اخ adelmb :
هناك ملاحظة صغيرة ان شاء الله برنامجك جيد و فكرته جيدة لكن به مشكلة انه سيعمل جيدا على البروتيوس و لكنه لن يعمل عمليا .. لماذا ؟

لانك لم تعالج مشكلة ارتداد المفتاح او debounce و ابسط الطرق هى وضع زمن تاخير كما فى الكودين مثلا delay_ms(200) .
و الله اعلى و اعلم .



الله ولى التوفيق



اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و اهلها و سائر بلادنا


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


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 13-10-2016, 11:11 PM المشاركة 15   
sun


بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

الحمد لله الذى هدانا لهذا و ما كنا لنهتدى لولا ان هدانا الله .

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


الله ولى التوفيق



اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و اهلها و سائر بلادنا



adelmb
:: مهندس ::
تاريخ التسجيل: Oct 2016
المشاركات: 10
نشاط [ adelmb ]
قوة السمعة:
قديم 13-10-2016, 11:21 PM المشاركة 16   
افتراضي


طيب يا اخوان الان اتحكمنا بعدة مخارج بمفتاح واحد

طيب لو ابغى مفتاح واحد وخرج واحد

ولكن تتنفذ عدة اوامر مختلفة على نفس الخرج عند كل ضغطة

مثلا عند الضغطة الاولى

يشتغل الليد لمدة 5 ثواني

ولكن عند الضغطة الثانية يشتغل لمدة 3 ثواني
السلام عليكم و رحمة الله و بركاته

هذه صورة الدائرة



هذا هو الكود
كود:
unsigned char g=0;
void main() {
  adcon1=7;
  trisa=1;
  trisb=0; portb=0;
while(1)
{
if(porta.f0==0)
  { 
    switch (g) {
     case 0 : portb.f0=1; delay_ms(5000); break;
     case 1 : portb.f0=1; delay_ms(3000); break;
     case 2 : portb.f0=1; delay_ms(1000); break;
                }
    portb.f0=0;
    g++;
    if(g==3)g=0;
   }
}
}



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