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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 16-09-2014, 07:55 PM المشاركة 9   
افتراضي



جزاك الله خيرا اخى الكريم وان امكن اريد مثال عن كيفية استخدام كلب الحراسه لعمل ريست للميكرو عند حدوث خلل بعمله وشكرا مقدما وربنا يجعله فى ميزان حسناتك
السلام عليكم
هذا مثال عن كيفيه دخول مايكرو الى حاله نوم اي وضعت سويج اسمه on_off وهذا مربوط على RB0
http://up.top4top.net/downloadf-top4...43d91-rar.html
كود:
sbit sw_on_off at RB0_bit;
/* Project name:
     Understanding sleep mode in PIC microcontrollers
 * Copyright:
     (c) Rajendra Bhatt
 * Test configuration:
     MCU:             PIC16F628A
     Oscillator:      XT, 4.0000 MHz
*/
int count=0 , count_sleep,sw_on_off_count=0;
char sw_on_off_flag=0 , state_on_off=0;
//Timer1
//Prescaler 1:1; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1()
{
  T1CON	 = 0x01;
  TMR1IF_bit	 = 0;
  TMR1H	 = 0x3C;
  TMR1L	 = 0xB0;
  TMR1IE_bit	 = 1;
  //INTCON	 = 0xC0;
}

void Interrupt()
{
   if(INTF_bit==1)
                 {
                  INTF_bit=0;
                  state_on_off=~state_on_off;
                 
                 }
  if (TMR1IF_bit)
  {
    TMR1IF_bit = 0;
    TMR1H	 = 0x3C;
    TMR1L	 = 0xB0;
    //Enter your code here
    count++;
    if(sw_on_off_flag==1)sw_on_off_count++;
  }
}


void main() 
{
TRISB = 0b00000001;
portb=0;
InitTimer1();
INTCON	 = 0xD0;
OPTION_REG=0xC0;
 while(1) {
           if(sw_on_off==0){
                            sw_on_off_flag=1;
                           }

           if( count>=5){
                         count=0;
                         rb1_bit=~rb1_bit;
                         rb2_bit=~rb2_bit;
                         rb3_bit=~rb3_bit;
                        }
           if(state_on_off==255 && sw_on_off_count>5)
                               {
                                sw_on_off_flag=0;
                                sw_on_off_count=0;
                                rb1_bit=0;
                                rb2_bit=0;
                                rb3_bit=0;
                                RB4_bit=1;
                                asm sleep;
                               
                               }

         }
}
مثال بسيط حيث استفاد من تايمر1 لتوليد ازمنه بدلا من أستخدام الامر delay لانه من خلال تايمر1 مايكرو ينفذ كل اوامر موجوده في while اما delay يجعل مايكرو مشغول

تلاحظ انه اذا تم الضغط على سويج على أطفاء سوف يصبح متغير state_on_off==255 وبعد انتظار فتره 250ms اي لما يصبحsw_on_off_count>5
هنا شيئ مهم لازم قبل لاتدخل مايكرو الى وضع sleep لازم تطفئ كل مخارج لديك والا سوف تبقى شغاله
مثلا تلاحظ ليدات قمت بأطفائها وقمت بتشغيل ليد على RB4 لدلاله على ان مايكرو على وضع sleep

على عموم الامر asm sleep هو يدخل مايكرو في حاله نوم ولكي أجعله يستغيظ فطريقه وحيده هي انتربت وبالطبع سوف يتوقف كل تايمرات لان كرستاله سوف تتوقف وعليه يكون انتربت عبر مثلا portb او غيره ولكن ليس تايمرات او التي تعتمد على كرستاله


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 16-09-2014 الساعة 07:59 PM
اعلانات

عبدالعزيز السيد
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2013
المشاركات: 72
نشاط [ عبدالعزيز السيد ]
قوة السمعة:
قديم 16-09-2014, 08:30 PM المشاركة 10   
افتراضي


السلام عليكم
هذا مثال عن كيفيه دخول مايكرو الى حاله نوم اي وضعت سويج اسمه on_off وهذا مربوط على RB0
http://up.top4top.net/downloadf-top4...43d91-rar.html
كود:
sbit sw_on_off at RB0_bit;
/* Project name:
     Understanding sleep mode in PIC microcontrollers
 * Copyright:
     (c) Rajendra Bhatt
 * Test configuration:
     MCU:             PIC16F628A
     Oscillator:      XT, 4.0000 MHz
*/
int count=0 , count_sleep,sw_on_off_count=0;
char sw_on_off_flag=0 , state_on_off=0;
//Timer1
//Prescaler 1:1; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1()
{
  T1CON	 = 0x01;
  TMR1IF_bit	 = 0;
  TMR1H	 = 0x3C;
  TMR1L	 = 0xB0;
  TMR1IE_bit	 = 1;
  //INTCON	 = 0xC0;
}

void Interrupt()
{
   if(INTF_bit==1)
                 {
                  INTF_bit=0;
                  state_on_off=~state_on_off;
                 
                 }
  if (TMR1IF_bit)
  {
    TMR1IF_bit = 0;
    TMR1H	 = 0x3C;
    TMR1L	 = 0xB0;
    //Enter your code here
    count++;
    if(sw_on_off_flag==1)sw_on_off_count++;
  }
}


void main() 
{
TRISB = 0b00000001;
portb=0;
InitTimer1();
INTCON	 = 0xD0;
OPTION_REG=0xC0;
 while(1) {
           if(sw_on_off==0){
                            sw_on_off_flag=1;
                           }

           if( count>=5){
                         count=0;
                         rb1_bit=~rb1_bit;
                         rb2_bit=~rb2_bit;
                         rb3_bit=~rb3_bit;
                        }
           if(state_on_off==255 && sw_on_off_count>5)
                               {
                                sw_on_off_flag=0;
                                sw_on_off_count=0;
                                rb1_bit=0;
                                rb2_bit=0;
                                rb3_bit=0;
                                RB4_bit=1;
                                asm sleep;
                               
                               }

         }
}
مثال بسيط حيث استفاد من تايمر1 لتوليد ازمنه بدلا من أستخدام الامر delay لانه من خلال تايمر1 مايكرو ينفذ كل اوامر موجوده في while اما delay يجعل مايكرو مشغول

تلاحظ انه اذا تم الضغط على سويج على أطفاء سوف يصبح متغير state_on_off==255 وبعد انتظار فتره 250ms اي لما يصبحsw_on_off_count>5
هنا شيئ مهم لازم قبل لاتدخل مايكرو الى وضع sleep لازم تطفئ كل مخارج لديك والا سوف تبقى شغاله
مثلا تلاحظ ليدات قمت بأطفائها وقمت بتشغيل ليد على RB4 لدلاله على ان مايكرو على وضع sleep

على عموم الامر asm sleep هو يدخل مايكرو في حاله نوم ولكي أجعله يستغيظ فطريقه وحيده هي انتربت وبالطبع سوف يتوقف كل تايمرات لان كرستاله سوف تتوقف وعليه يكون انتربت عبر مثلا portb او غيره ولكن ليس تايمرات او التي تعتمد على كرستاله
جزاك الله خيرا يابشمهندس بس ياريت لو شرح مع مثال لكلب الحراسه وكيفية استخدامه لعمل ريست للميكرو عند وجود خلل بعمله نتيجة الضوضاء

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

abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:
قديم 16-09-2014, 09:57 PM المشاركة 11   
افتراضي


موضوع جيد
وفقك الله اخي


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 16-09-2014, 10:09 PM المشاركة 12   
افتراضي


جزاك الله خيرا يابشمهندس بس ياريت لو شرح مع مثال لكلب الحراسه وكيفية استخدامه لعمل ريست للميكرو عند وجود خلل بعمله نتيجة الضوضاء
أخي كريم هو نفس مثال بس تحتاج الى تفعيل لكلب الحراسه


ايضا أمر اخر وهو ريجيستر OPTION_REG=0xCF تلاحظ من هذا ريجيستر
وضعنا تفعيل انتربت لــ RB0 على حافه مرتفعه
وهنا (مهم هذا ) حولنا معامل تقسيم prescaler الى watchdog
تلاحظ OPTION_REG=0xCF حيث F تعني جعلنا معامل تقسيم لكلب حراسه وبنسبه تقسيم 128


وعند تفعيل كلب حراسه سوف تلاحظ انه لنفس مشروع بالضغط على سويج سوف يذهب مايكرو الى وضع نوم ومن ثم يستغيظ بسبب انتهاء مهله زمن كلب حراسه
تحياتي



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