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

   

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



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

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

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



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


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



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


السلام عليكم و رحمة الله و بركاته
عذرا أستاذي الفاضل
برنامجي سيعمل بشكل جيد حتى لو بقيت ضاغط على المفتاح لساعة كاملة .
هذا هو الكود
كود:
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){}
                }
}
}

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

اعلانات

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


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

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

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


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

استاذى العزيز لعلى اثقلت فى النصيحة و لم ابين جيدا فعذرا ,
ولكنى الحمد لله افهم كودك جيدا ولذلك اقول انه لن يحل مشكلة الارتداد اطلاقا .
لو استطعت تجربته فتثبت لك التجربة و عرفنا النتيجة , ليس عندى pic لكنت جربته !
و ارجو منك مراجعة ملاحظتى الاخيرة بدقة , ثم مشاهدة احد الفيديوهات لشرح مشكلة debounce و هناك كتيب ستجده على النت لشرح المشكلة debounce
يمكنك البحث باسم المشكلة , الكتيب فيه تقريبا كل الحلول سوفت و هاردوير لكن ليس بها كود مثل استخدام while مثلما فعلت حضرتك لانه عفوا عمليا خطأ
.

و اخيرا و ما أوتيتم من العلم الا قليلا
و نتعاون لنتعلم من بعضنا و
الله ولى التوفيق



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


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

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 14-10-2016, 03:27 AM المشاركة 19   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما



السلام عليكم و رحمة الله و بركاته
عذرا أستاذي الفاضل
برنامجي سيعمل بشكل جيد حتى لو بقيت ضاغط على المفتاح لساعة كاملة .
هذا هو الكود
كود:
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){}
                }
}
}

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



السلام عليكم ورحمه الله ..


نقاش علمي جميل ومفيد جداااا للمهتمين بعالم الميكرو كنترولر ..


أخى الكريم ...
كما قال لك اخونا الفاضل .. مهندس / مشتاق اللهأن كتابه الكود بهذة الطريقه اللتى كتبتها سيحدث عدم استقرار لسير البرنامج وسيكون الخرج غير متوقع ... بمثال لو لو الخرج على البورت " ب " يساوى واحد وضغط على المفتاح فهذة اللحظه من الممكن أن يحدث ارتداد للمفتاح .. وتكون النتيجه 3 .. أو 4 ... والمفروض انها تكون 2 ..


إذا ماذا حدث ... وهنا هى المشكله اللتى تكلم عنها .. أخونا " مشتاق الله " وهى ارتداد المفتاح ..

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


إذا عند الضغط على المفتاح يحدث " ارتداد " بمعنى المفتاح يوصل ويفصل مرة أو مرتين فى لحظه الضغط عليه ..

وهنا ماذا سيحدث ؟؟؟

الميكرو منتظر تحقق الشرط .. و المستخدم ضغط على المفتاح .. والشرط تحقق .. سيدخل الميكرو فى تنفيذ أوامر الشرط بسرعه عاليه جداااا .. وهنا من الممكن أن المفتاح فصل عند لحظه تلامسه .. وهنا المشكله لأن ارتداد المفتاح سيجعل أمر [code]while(porta.f0==0){}[/CODE بلا فائدة لأن المفتاح وصل وفصل بسرعه كبيرة ومن ثم استقر ووصل ... وهنا يكون الأمر قد نفذ ربما مرة أو مرتين أو ثلاث مرات ..

وهنا يأتى فائدة أمر
كود:
  delay_ms(100);
... لماذا لأن عند الضغط على المفتاح سيتحقق الشرط ومباشرة يدخل البك فى تنفيذ أمر الإنتظار وهنا تجنبنا عمليه عدم استقرار المفتاح .. ويكون المفتاح اطرافه الداخليه تلامست بشكل جيد ولا يوجد أى عمليه فصل أو وصل للمفتاح .. وهنا سيخرج البك من أمر الإنتظار وسينفذ أوامر الشرط ويذهب الى حلقة
كود:
while(porta.f0==0){}
ويجد أن المفتاح مزال مضغوط عليه ولا يخرج من اللوب الى أن يحرر المفتاح ..


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


تحياتى للجميع ..

وأرجو أن تتقبلو المداخلة "احبكم فى الله "


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


السلام عليكم ورحمه الله

أنتظر أخى "" ثوف أقوم بطرح فكرة أعتقد انها جديدة ... لتقليل استخداد مخارج الميكرو كنترولر مع السوتشات ..


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 14-10-2016 الساعة 06:54 AM

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


السلام عليكم ورحمه الله

أخى الكريم صاحب الموضوع .. اليك فكرة اعتقد انها جديد ..

وهى ربط عدد 4 سوتشات على بن واحدة فقط من البورت " A " وهى البن رقم PORTA.F0 ..

الفكرة هنا استخدام محول الإشارة الداخلى فى البيك 16F877A ومقارنه الفولتيات الداخلة عليه من خلال 4 سوتشات وبعد مقارنه الفولتات يبدأ فى تنفذ الأوامر المتعلقه ب الشرط المكتوب ..

اليك المشروع كامل للتحميل https://drive.google.com/file/d/0Bxg...ew?usp=sharing


وايضاااا صورة للدائرة الإلكترونيه ..

https://drive.google.com/open?id=0Bx...jg5c25VMHY1OGc






كود البرنامج


كود:
         
      // ENG/ ABDALLA HYGAZY //

      unsigned int channel =0;

        void main() {

      TRISA  = 1;  // PORTA is input
      TRISB  = 0;     // PORTB is output
      PORTB  = 0;    // PORTB is OFF
      ADC_Init();  // Initialize ADC module with default settings
    //************************************//
      
       while(1){
       channel =  ADC_Read(0);  // Read analog value from channel 1
       channel = (channel*5)/1023;
    //*********************************//

      if(ADC_Read(0)==1023)   {   delay_ms(350); PORTB =1;                }
      if((ADC_Read(0)>500) && (ADC_Read(0)<550)){delay_ms(350); PORTB =2; }
      if((ADC_Read(0)>400) && (ADC_Read(0)<450)){delay_ms(350); PORTB =4; }
      if((ADC_Read(0)>300) && (ADC_Read(0)<350)){delay_ms(350); PORTB =8; }
      
 }
}


تحياتى وبالتوفيق


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 14-10-2016 الساعة 06:55 AM

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


قمت بعمل بعض التعديلات عالكود

كود:
unsigned char g=0;
unsigned int DutyCycle=10;
void main() {
PWM1_Init(4000);
PWM1_Start();

adcon1=7;
trisa=1;
trisc=0; portc=0;
trisb=0; portb=0;
while(1)
{
if(g==1){Delay_ms(40); PWM1_Set_Duty(63);}
if(g==2){Delay_ms(40); PWM1_Set_Duty(127);}
if(g==3){Delay_ms(40); PWM1_Set_Duty(191);}
if(g==4){Delay_ms(40); PWM1_Set_Duty(255);}
if(g==5){Delay_ms(40); PWM1_Set_Duty(191);}
if(g==6){Delay_ms(40); PWM1_Set_Duty(127);}
if(g==7){Delay_ms(40); PWM1_Set_Duty(63);}

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

                 if(g>7)g=1;

                 while(porta.f0==0){}
                }
}
}
الهدف هو التحكم بشدة اضائة الليد والان عند الضغط لمرة واحدة راح يشتغل الليد تقريبا بربع القوة وعن الضغطة الثانية تصبح شدة الاضائة النصف وهكذا حتى الضغطة الرابعة وهي راح تعطينا اقوى شدة للاضائة وثم تبدأ الاضائة بالتناقص التدريجي بعد الضغطة الخامسة

طبعا ماختبرت هالخاصية حتى الان بسبب عدم توفر pic حاليا

السؤال وش التحسينات اللي ممكن ندخلها عالكود



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