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

أدوات الموضوع

ahmad alharbi
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 17
نشاط [ ahmad alharbi ]
قوة السمعة:0
قديم 12-10-2016, 06:59 PM المشاركة 1   
افتراضي طلب شرح الية عمل دخل واحد يتحكم بعدة مخارج لغة السي Twitter FaceBook Google+



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


اخواني الكرام احتاج مساعدتكم في شرح الية عمل الكود التالي :

عندي مايكروكونترولر PIC16F877A

وعندي مفتاح Pushbutton

وعندي عدد اربعة مخارج وجميعها عبارة عن LED

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

وعنده ضغطه مرة ثانية يغلق المخرج الاول ويعمل المخرج الثاني وهكذا حتى المخرج الرابع


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


حاليا بخبرتي البسيطة ماستطعت سوا ان اجعل المفتاح يقوم بتشغيل جميع المخارج في نفس الوقت او يقوم بتشغيلهم واحد واحد عن طريق التاخير الزمني

اعلانات

ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 453
نشاط [ ahmed idris ]
قوة السمعة:0
قديم 12-10-2016, 09:22 PM المشاركة 2   
افتراضي


السلام عليكم
في انتظار اقتراحات أفضل من مهندسي القرية ، هذه طريقة:
كود:
#define SW1 PORTA.RA0
unsigned char  const led_out[5] = {0,1,2,4,8};
unsigned char counter=0;
unsigned int count = 0;

void main() {
  ADCON1 = 7;           
  PORTB=0;
  TRISB  = 0;           
  TRISA0_bit  = 1;      

  while(1){

      if (!SW1)          
      {
         delay_ms(100);  
         if (!SW1)       
         {
        PORTB = (led_out[counter]);

   delay_ms(500);    
   counter++;
   if (counter>4)counter=0;
         }
      }
      else
      {
        PORTB = (led_out[counter]);
      }
    }
}
هذا جزء من الدائرة لتوضيح المدخل والمخارج المستخدمة:

ملحوظة:
الضغطة الرابعة تجعل المخارج 0
إذا أحببت ان يعود العداد الى الخرج الاول يمكنك تغيير هذا السطر من الكود:
;if (counter>4)counter=0
الى:
;if (counter>4)counter=1

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

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 13-10-2016, 06:39 AM المشاركة 3   
sun


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

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

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

#define SW1 PORTA.RA0
void main() {
  ADCON1 = 7;
  PORTB=0;
  TRISB  = 0;
  TRISA0_bit  = 1;

  while(1){
         if (!SW1)
          {
             delay_ms(200);
             PORTB = 1;
             while((!SW1) && (PORTB < 8))
             {
                  delay_ms(200);
                  PORTB = PORTB << 1 ;
             }

        }
  }
}



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



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




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


السلام عليكم
في انتظار اقتراحات أفضل من مهندسي القرية ، هذه طريقة:
كود:
#define SW1 PORTA.RA0
unsigned char  const led_out[5] = {0,1,2,4,8};
unsigned char counter=0;
unsigned int count = 0;

void main() {
  ADCON1 = 7;           
  PORTB=0;
  TRISB  = 0;           
  TRISA0_bit  = 1;      

  while(1){

      if (!SW1)          
      {
         delay_ms(100);  
         if (!SW1)       
         {
        PORTB = (led_out[counter]);

   delay_ms(500);    
   counter++;
   if (counter>4)counter=0;
         }
      }
      else
      {
        PORTB = (led_out[counter]);
      }
    }
}
هذا جزء من الدائرة لتوضيح المدخل والمخارج المستخدمة:

ملحوظة:
الضغطة الرابعة تجعل المخارج 0
إذا أحببت ان يعود العداد الى الخرج الاول يمكنك تغيير هذا السطر من الكود:
;if (counter>4)counter=0
الى:
;if (counter>4)counter=1



شكرا جزيلا


عندي كم نقطة في الكود احتاج منك شرحها

unsigned char const led_out[5] = {0,1,2,4,8};
ممكن تشرح لي عمل هذا السطر بالتفصيل


وايضا لماذا عرفت ADCON1 ب 7


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


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

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

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

#define SW1 PORTA.RA0
void main() {
  ADCON1 = 7;
  PORTB=0;
  TRISB  = 0;
  TRISA0_bit  = 1;

  while(1){
         if (!SW1)
          {
             delay_ms(200);
             PORTB = 1;
             while((!SW1) && (PORTB < 8))
             {
                  delay_ms(200);
                  PORTB = PORTB << 1 ;
             }

        }
  }
}



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



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




شكرا لك اخي الكريم

هل من الممكن ان تشرح لي السطر التالي

PORTB = PORTB << 1 ;


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


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

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

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

شكرا لك اخي الكريم

هل من الممكن ان تشرح لي السطر التالي

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



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



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




ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 453
نشاط [ ahmed idris ]
قوة السمعة:0
قديم 13-10-2016, 03:42 PM المشاركة 7   
افتراضي


شكرا جزيلا


عندي كم نقطة في الكود احتاج منك شرحها

unsigned char const led_out[5] = {0,1,2,4,8};
ممكن تشرح لي عمل هذا السطر بالتفصيل


وايضا لماذا عرفت ADCON1 ب 7
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


adelmb
:: مهندس ::
تاريخ التسجيل: Sep 2016
المشاركات: 10
نشاط [ adelmb ]
قوة السمعة:0
قديم 13-10-2016, 06:26 PM المشاركة 8   
افتراضي


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


اخواني الكرام احتاج مساعدتكم في شرح الية عمل الكود التالي :

عندي مايكروكونترولر PIC16F877A

وعندي مفتاح Pushbutton

وعندي عدد اربعة مخارج وجميعها عبارة عن LED

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

وعنده ضغطه مرة ثانية يغلق المخرج الاول ويعمل المخرج الثاني وهكذا حتى المخرج الرابع


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


حاليا بخبرتي البسيطة ماستطعت سوا ان اجعل المفتاح يقوم بتشغيل جميع المخارج في نفس الوقت او يقوم بتشغيلهم واحد واحد عن طريق التاخير الزمني
السلام عليكم و رحمة الله و بركاته

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

صورة الدارة



كود البرنامج
كود:
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 الساعة الآن: 03:13 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025