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

   

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



ولكن عم تواجهني مشكلة باعداد بتات الTIMER0 CONTROL REGISTER عم يعطيني اخطاء انها متحولات غير معرفة
السلام عليكم
اخى الكريم قرأت طلبك من بداية وانا شغال لك على برنامج تايمر وحين الانتهائ منة هرفعه اليوم أو غدااا ان شاء الله

اعلانات

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


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

تفضل اخى الكريم هذا برنامج كتبتهولك بالغة السى

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

ملاحظات هامة حول البرنامج ...

الليد الاخضر للدلاله على ان البرنامج يعمل...

الليد الاحمر للدلاله على انتهاء عمل البرنامج .....

لإعادة تشغيل البرنامج ...

1 _ يجب عليك بتصفير العدادات بالضغط على مفتاح TEMR 0,0,0,0,0....

2_ بعد تصفير العدادات يجب عليك بأدخال الرقم السرى المكون من اربع ارقام .. وهم من اليمن الى الشمال .. 2 5 1 7 ....

3_ بعد ادخال الرقم السري اضغط على مفتاح .. استارت ليتم تشغيل البرنامج

ملحوظه .. يمكنك تغيير الرقم السرى المكون من اربع ارقام من خلال الكود فقط ..


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


صور الدائرة الالكترونية على برنامج المحاكاة








كودالبرنامج


كود:
 unsigned short mask(unsigned short num);
  unsigned int  a1=0,m1=0,e1=0,w1=0;
        void interrupt(){
  portb=1;
  portd=mask(a1);
  delay_ms(5);
  portb=2;
  portd=mask(m1);
  delay_ms(5);
  portb=4;
  portd=mask(e1);
  delay_ms(5);
  portb=8;
  portd=mask(w1);
  delay_ms(5);
  
  INTCON=0b00100000;
  TMR0=0;
}
    void main() {
     int m=9;
     int a=9;
     int e=9;
     int w=9;
     

     
     int x=0;

 OPTION_REG=0b10000101;
 INTCON=0b10100000;
    TMR0=217;
 trisb=0; portb=0;
 trisd=0; portd=0;
 trisc=1; portc=0;
 trisa=0; porta=0;
 trise=0; porte=0;

  
  /*eeprom_write(0,0);
  eeprom_write(1,0);
  eeprom_write(2,0);
  eeprom_write(3,0);
  eeprom_write(4,0);
  eeprom_write(5,0);
  eeprom_write(6,0);
  eeprom_write(7,0);*/

   a1 = eeprom_read(0);delay_ms(10);
   m1 = eeprom_read(1);delay_ms(10);
   e1 = eeprom_read(2);delay_ms(10);
   w1 = eeprom_read(3);delay_ms(10);
   
      delay_ms(500);
          loop:
        for(;;){
   if(x==0){goto loop1;};
   if(a1==2&&m1==5&&e1==1&&w1==7&&portc.f4==1)
    {x=0;portc.f1=1; a1=0;m1=0;e1=0;w1=0;};
   
   if(portc.f6){a1=0;m1=0;e1=0;w1=0;};
   if(portc.f0==1){a1++;   delay_ms(300);};
   if(portc.f1==1){m1++;   delay_ms(300);};
   if(portc.f2==1){e1++;   delay_ms(300);};
   if(portc.f3==1){w1++;   delay_ms(300);};
  
   if(a1==10){a1=0;};
   if(m1==10){m1=0;};
   if(e1==10){e1=0;};
   if(w1==10){w1=0;};
  }
            loop1:
           porta.f1=1;
            for(;;){

        /*delay_ms(1);*/
             a1++;
  eeprom_write(0,a1); delay_ms(10);
  
if(a1==10){m1++;a1=0; eeprom_write(1,m1); delay_ms(10);};

if(m1==10){e1++;m1=0; eeprom_write(2,e1); delay_ms(10);};

if(e1==10){w1++;e1=0;eeprom_write(3,w1); delay_ms(10);};

if(a==a1&&m==m1&&e==e1&&w==w1){x=1;porta.f1=0; porta.f0=1; 

  eeprom_write(0,0); delay_ms(10);
  eeprom_write(1,0); delay_ms(10);
  eeprom_write(2,0); delay_ms(10);
  eeprom_write(3,0); delay_ms(10);
  eeprom_write(4,0); delay_ms(10);
  eeprom_write(5,0); delay_ms(10);
  eeprom_write(6,0); delay_ms(10);
  eeprom_write(7,0); delay_ms(10);
                      goto loop;}
}
}
unsigned short mask(unsigned short num){
switch (num){

case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;

}
}


هذة الجزئيه من الكود هى المسؤله عن الوقت وبالاخص امر
delay_ms(1000);

loop1:
porta.f1=1;
for({

delay_ms(1000);
a1++;
eeprom_write(0,a1); delay_ms(10);

غدااا هرفعلك ملف المحاكاة ان شاء الله

تحياتى لك


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 17-05-2015 الساعة 05:10 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

Logic
:: عضو فضي ::
تاريخ التسجيل: Mar 2014
المشاركات: 682
نشاط [ Logic ]
قوة السمعة:
قديم 17-05-2015, 04:12 PM المشاركة 19   
افتراضي


أظن أخي العزيز ان اجابتك الاخيرة هي تماما ما ابحث عنه ...
شكرا جزيلا وجزاكم الله خيرا ..

تحياتي ومحبتي
ولكن عم تواجهني مشكلة باعداد بتات الTIMER0 CONTROL REGISTER عم يعطيني اخطاء انها متحولات غير معرفة
السلام عليكم
أخي ذكرت أنك تعمل بلغة سي ولم تحدد هل تقصد الميكروسي أم غيره؟
لأن بعض التعليمات لها syntaxe مختلف من كومبيلر إلى آخر كما هو معروف .
لكن إذا كنت تستخدم الميكروسي وباستخدام برنامج Timer Calculator لست بحاجة إلى التعامل مع أي مسجل !
انت فقط تحدد في خطوات بسيطة ، نوع الكومبيلر وعائلة المتحكم و نوع التايمر وقيمة المذبذب .. والبرنامج يعطيك تعليمات دالة الانتربت المطلوبة ويوضح لك مكان إدماج كود الساعة (يعني تعليمات متغيرات المؤقت التي تكلمنا عنها).
هنا تذكير بالرابط :
http://www.mikroe.com/timer-calculator/
وهنا مثال لتوليد نبضات بقيمة 100 ميلي تانية:

وهذا هو الكود الذي تم توليده :

وبما أن زمن النبضات هنا هو 100ms للحصول على نبضات بقيمة 1 تانية تقوم بحجز متغير تسميه مثلا counter يحسب لك 10 مرات هذه النبضات .
أرجو لك التوفيق


التعديل الأخير تم بواسطة : Logic بتاريخ 17-05-2015 الساعة 05:30 PM

moha-affa
:: مهندس ::
تاريخ التسجيل: May 2015
المشاركات: 14
نشاط [ moha-affa ]
قوة السمعة:
قديم 18-05-2015, 10:28 AM المشاركة 20   
افتراضي


ألف شكر الكم يا اخوان وجزاكم الله خير ... سأعمل على تجريب الطريقتين و على الله الاتكال ...


ابن فرناس
:: مهندس متواجد ::
تاريخ التسجيل: May 2007
الدولة: الجزائر
المشاركات: 83
نشاط [ ابن فرناس ]
قوة السمعة:
قديم 23-05-2015, 10:37 PM المشاركة 21   
افتراضي


بسم الله والصلاة على رسول الله ...
أولا : أتمنى أن يكون استخدامك لنصائح الأخوة في الخير، وهذا ما أرجوه.
ثانيا: هناك مقاربة أخرى للمشكلة، كالتالي:
سيعمل الجهاز ليس مدة محددة من الزمن، بل عددا محددا من المرّات. وهذه المقاربة أبسط وهي المعمول بها في الصناعة (سواءا في البرامج أو بعض الأجهزة).
ويكمن الحل أن المعالج كلما شغل يزيد قيمة في خانة من الذاكرة الداخلية له (EEPROM)، ويراقب هل وصلت لقيمة محددا سلفا فيه، مثلا 100 تشغيل، فإن وصلت قيمة تلك الخانة لهذا العدد يدخل في حلقة مفرغة، ولا يكمل بقية البرنامج المفيد. وهنا عليك أن تحمي المعالج من أن يقرأ. وهو حل سهل.
أتمنى أن يبيع ربّ عملك الجهاز بسعره الكامل مقدّما، كي تتجنب هذه الحيل، وخصوصا أنك في بداية الطريق، ولكنك حسب الظاهر مهندس واعد، ما دمت توصّلت لبرمجة تحكم في مضخات سيارة... ولكن لا بأس من استشارة أهل العلم.


moha-affa
:: مهندس ::
تاريخ التسجيل: May 2015
المشاركات: 14
نشاط [ moha-affa ]
قوة السمعة:
قديم 26-05-2015, 11:06 AM المشاركة 22   
افتراضي


بسم الله والصلاة على رسول الله ...
أولا : أتمنى أن يكون استخدامك لنصائح الأخوة في الخير، وهذا ما أرجوه.
ثانيا: هناك مقاربة أخرى للمشكلة، كالتالي:
سيعمل الجهاز ليس مدة محددة من الزمن، بل عددا محددا من المرّات. وهذه المقاربة أبسط وهي المعمول بها في الصناعة (سواءا في البرامج أو بعض الأجهزة).
ويكمن الحل أن المعالج كلما شغل يزيد قيمة في خانة من الذاكرة الداخلية له (EEPROM)، ويراقب هل وصلت لقيمة محددا سلفا فيه، مثلا 100 تشغيل، فإن وصلت قيمة تلك الخانة لهذا العدد يدخل في حلقة مفرغة، ولا يكمل بقية البرنامج المفيد. وهنا عليك أن تحمي المعالج من أن يقرأ. وهو حل سهل.
أتمنى أن يبيع ربّ عملك الجهاز بسعره الكامل مقدّما، كي تتجنب هذه الحيل، وخصوصا أنك في بداية الطريق، ولكنك حسب الظاهر مهندس واعد، ما دمت توصّلت لبرمجة تحكم في مضخات سيارة... ولكن لا بأس من استشارة أهل العلم.
شكرا جزيلا أخي الكريم على المساعدة في الحل أولا وعلى النصيحة ثانيا وأخيرا على الاطراء ....
وبالنسبة للجهاز فبالفعل هذا ما قمت بعمله .. وضعت عداد لمرات التشغيل والان الجهاز في مرحلة الانتاج ولله الحمد .... شكرا لك اخي وشكرا لكل الاخوان الذين قدمو المساعدة جزاكم الله كل خير وأرجو أن أكون عضوا مفيدا في هذا المنتدى الرائع في الايام المقبلة .. تحياتي للجميع ....


الصورة الرمزية ياسين الحانوتي
ياسين الحانوتي
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2013
المشاركات: 164
نشاط [ ياسين الحانوتي ]
قوة السمعة:
قديم 28-05-2015, 11:10 AM المشاركة 23   
افتراضي


السلام عليكم..
كيف استطيع جعل البرنامج داخل البيك عديم الفائدة بعد مدة معينة من الزمن.. مثلا بعد سنة او بعد الف ساعة تشغيل او بعد الف عملية تشغيل.. بحيث تكون الpic بعد انقضاء هذا الزمن غير فعالة او البرنامج الذي داخلها غير فعال...
لكم جزيل الشكر....
السلام عليكم وحمة الله
اذا كنت تريد ابطال عمل البرنامج بعد ألف عملية تشغيل يمكنك استغلال ذاكرة ال eeprom كالتالي
في أول مرة تبرمج البيك ضع في الذاكرة القيمة 1000
قبل كود البرنامج بأكمله ضع جملة شرطية if تختبر هل محتوى الذاكرة 0 أم أكبر من 0 (فإذا كان أكبر من صفر يتحقق الشرط ويكمل البرنامج ..)
ضع مع كود البرنامج تعليمة تنقص من الذاكرة 1
أي أنه في كل مرة سيعمل البرنامج يتم حذف 1 من 1000
وبالتالي بعد 1000 تشغيل سيكون محتوى الايبروم 0 وهذا سيبطل البرنامج


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 28-05-2015, 03:47 PM المشاركة 24   
افتراضي


السلام عليكم
أعتقد أحتساب عدد مرات التشغيل وحدها خاطئ لانه ممكن أحتيال على جهاز وعدم السماح له بالاطفاء
لكن يجب وضع التالي
هو وضع فتره زمنيه محدده وهذه فتره لاتعتمد على مصدر خارجي وانما تعمل كتالي انه البرنامج بيتوقف خلال شهر واحد مثلا وتسميه بالبرنامج التجريبي
وهنا كما تفضلو الاخوه الكرام بتشغيل تايمر0 على 1 ثانيه ويحسب وكل 24 ساعه مثلا بسيجل عداد ويتم خزنه في ايبروم ولما بيوصل الى 30 يوم يتوقف البرنامج وتظهر رساله expire ولكن يجب ان تظهر رساله تحذير تخبر مستخدم بان البرنامج سوف يتوقف بعد 5 ايام
تحياتي



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