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

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

A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 14-01-2018, 05:32 AM المشاركة 1   
افتراضي السلام عليكم ... سؤال بخصوص التايمر؟؟ Twitter FaceBook Google+



اخواني الكرام هل يمكن لنا ان نتحكم في زمن تشغيل اللد و اطفائه عن طريق التايمر ؟؟و ليس عن طريق الديليه ... انا اعرف ان اتحكم بنفس الزمن يعني تشغيل ثانيه و اطفاء ثانيه ... و لكن اريد ان اقوم بتشغيل اللد خمس ثواني و اطفائه عشر ثواني عن طريق التايمر .. مع مثال و شرح عليه اذا سمحتم و دمتم..

اعلانات

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 14-01-2018, 08:56 AM المشاركة 2   
افتراضي


السلام عليكم
تفضل اخى اشعال الليد المتصل ب portb.f1 لمدة 5 ثوانى واطفأه لمدة 10 ثوانى
باستخدام تايمر زيرو

كود:
#define  led1    portb.f1
#define  led2    portb.f2
#define  led3    portb.f3
////////////////////////////
int i,x;
////////////////////////////
void interrupt(){
x++;
if(x>240)x=0;
if(x<80)
led1=1;
else led1=0;
intcon.f2=0;
                 }
/////////////////////////////
void main() {
portb=0;
trisb=1;
intcon=160;
option_reg=215;
             }


التعديل الأخير تم بواسطة : magdy_3 بتاريخ 14-01-2018 الساعة 08:59 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 14-01-2018, 12:38 PM المشاركة 3   
افتراضي


السلام عليكم
تفضل اخى اشعال الليد المتصل ب portb.f1 لمدة 5 ثوانى واطفأه لمدة 10 ثوانى
باستخدام تايمر زيرو

كود:
#define  led1    portb.f1
#define  led2    portb.f2
#define  led3    portb.f3
////////////////////////////
int i,x;
////////////////////////////
void interrupt(){
x++;
if(x>240)x=0;
if(x<80)
led1=1;
else led1=0;
intcon.f2=0;
                 }
/////////////////////////////
void main() {
portb=0;
trisb=1;
intcon=160;
option_reg=215;
             }
تسلم ايدك اخي و بارك الله فيك .. و انت دائما سباق للخير ...لكن انا طمعان في كرمك اخي .. هل لك ان تشرح لي الطريقه ؟؟ لان الهدف من سؤالي هو للمعرفه و ليس لاحتياج الكود... انا دائما استخدم في ذلك برنامج time calculater و هو يعطيني النتيجه و اقوم بتحويل الوقت الذي اريده الى ميلي ثانيه و من ثم اقسمه على 10 ملي ثانيه و بذلك احصل على النتيجه و لكن هنا يكون زمن الاطفاء هو نفسه زمن التشغيل .. و لكن ما اردته هو انه كيف اقوم بكتابة زمن الاطفاء و يختلف عن زمن التشغيل عن طريق التايمر زيرو ..كما كتبته لي حضرتك مشكورا و لكن اخي لو تشرح لي الكود السابق و هل بالامكان عمل هذا الكود عن طريق البرنامج time calculater و ذلك للسهوله و الترتيب ؟؟ تقبل تحياتي

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب عريبى محمود ( أعجبته المشاركة )

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 15-01-2018, 12:31 AM المشاركة 4   
افتراضي


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


A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 15-01-2018, 05:20 AM المشاركة 5   
افتراضي


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


التعديل الأخير تم بواسطة : A-M-S بتاريخ 15-01-2018 الساعة 05:26 AM

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 16-01-2018, 08:56 PM المشاركة 6   
افتراضي


بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
التايمر زيرو نقدر نقول عليه كونتر بيعد من اى من
1-المذبذب الداخلى
2-الطرف a4
ونحن من نحدد هل سيعد من المذبذب الداخلى ام الطرف a4
فى حالة انى محتاج استخدم التايمر زيرو كامؤقت سوف اختار العد من المذبذب الداخلى
وهنا تبدأ الحسابات
نفرض ان المذبذب يعمل على 4 ميجا هيرتز
ومن المعروف ان البيك يحتاج الى اربع نبضات لكل عملية
اذن العد سيكون 1 ميجا هيرتز اذن الزمن المستغرق فى العد 1/1000000 من الثانية
اى 1 ميكرو ثانية
ولاكن هل التايمر يعد كل نبضة ام ماذا
مصممى البيك جعلو لنا ان نختار نسبة للعد اى ممكن ان يعد كل 2 او 4 او 8 او 16 او 32 او 64 او 128 او 256 نبضة

يتبع


A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 22-01-2018, 12:22 PM المشاركة 7   
افتراضي


بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
التايمر زيرو نقدر نقول عليه كونتر بيعد من اى من
1-المذبذب الداخلى
2-الطرف a4
ونحن من نحدد هل سيعد من المذبذب الداخلى ام الطرف a4
فى حالة انى محتاج استخدم التايمر زيرو كامؤقت سوف اختار العد من المذبذب الداخلى
وهنا تبدأ الحسابات
نفرض ان المذبذب يعمل على 4 ميجا هيرتز
ومن المعروف ان البيك يحتاج الى اربع نبضات لكل عملية
اذن العد سيكون 1 ميجا هيرتز اذن الزمن المستغرق فى العد 1/1000000 من الثانية
اى 1 ميكرو ثانية
ولاكن هل التايمر يعد كل نبضة ام ماذا
مصممى البيك جعلو لنا ان نختار نسبة للعد اى ممكن ان يعد كل 2 او 4 او 8 او 16 او 32 او 64 او 128 او 256 نبضة

يتبع
تسلم اخي كلك ذوق..
اخي عن انا اعرف هذه التفاصيل و اعرف طريقة الحساب و اعرف التعامل مع برنامج time calculater و مبدأ العمل كذلك اعرف كيف اضيف وقت معين لتشغيل ليد و اطفائه و لكن بنفس الوقت يعني ممكن اشغله لمدة ثانيه و اطفيه ثانيه .... انا اريد طريقة تغيير وقت التشغيل و الاطفاء .. يعني اشغله ثانيه و اطفيه خمس ثواني ... و ليكن عن طريق البرنامج سالف الذكر


محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 24-01-2018, 08:06 PM المشاركة 8   
افتراضي


اخواني الكرام هل يمكن لنا ان نتحكم في زمن تشغيل اللد و اطفائه عن طريق التايمر ؟؟و ليس عن طريق الديليه ... انا اعرف ان اتحكم بنفس الزمن يعني تشغيل ثانيه و اطفاء ثانيه ... و لكن اريد ان اقوم بتشغيل اللد خمس ثواني و اطفائه عشر ثواني عن طريق التايمر .. مع مثال و شرح عليه اذا سمحتم و دمتم..
1-يمكن استخدام التايمر لتوليد نبضات دقيقة
و لتنفيذ ما تريد تضيف له عدادا أو أكثر لعد تلك النبضات كما ستلاحظ في المثال المرافق.
وللتحكم في العداد وإجباره على التوقف عند قيمة معينة ممكن تستخدم جملة شرطية مثل جملة if.
2- في الميكروسي يمكن تحويل متغير إلى عداد بطريقة بسيطة :
مثال : هذا متغير اخترت له هذا الاسم: counter
يمكن تحويل هذا المتغير الى عداد بهذه الطريقة في الكتابة :
;++counter
وهي في نفس الوقت تعليمة العد .

3- الآن كيف نستفيد من خدمات برنامج حاسب التايمر ؟
هذا مثال لتوليد نبضات من التايمر 1 بقيمة 100ms:


البيك الذي اخترته Pic16F628A
- إذن اخترت عائلة 16F بأعلى الصفحة.
- اخترت كريستالة : 4Mhz فهي الأكثر انتشارا لكن ممكن تختار غيرها مما هو متاح.
- اخترت التايمر1
- حددت قيمة النبضة المطلوبة وهي 100ms
- تأكدت من أن البرنامج مفعل على الميكروسي في اسفل الصفحة.
- حصلت على الكود الذي يظهر جانب منه في الصورة.
هو هنا كاملا:
كود:
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
 
//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON	 = 0x11;
  TMR1IF_bit = 0;
  TMR1H	 = 0x3C;
  TMR1L	 = 0xB0;
  TMR1IE_bit = 1;
  INTCON	 = 0xC0;
}
 
void Interrupt(){
  if (TMR1IF_bit){ 
    TMR1IF_bit = 0;
    TMR1H	 = 0x3C;
    TMR1L	 = 0xB0;
    //Enter your code here
  }
}
في الصفحة فقرتين بالأخضر ليستا من الكود هما توضيحات فقط.
الفقرة الاولى :
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms

//Place/Copy this part in declaration section
توضح نوع التايمر و قيم المقسم Prescaler والمقسم Preload
وتوجه إلى مكان وضع هذا الكود.
والاهم العبارة التي تشير الى قيمة النبضة التي سنشتغل عليها وهي:
Actual Interrupt Time : 100 ms
الفقرة الثانية:
//Enter your code here
توجهنا إلى المكان الذي نضع فيه الكود الذي سنكتب للاستفادة من كود المقاطعة.
و هو هذا الكود البسيط ل 5 تواني تشغيل الليد و 10 إطفاء :
كود:
///
        ms_counter++;

        if (ms_counter == 10)
        {
         ms_counter = 0;
         s_counter ++;
        }
        
        if (s_counter == 5)
        {
         portb.b0 = 0;
        }

        if (s_counter == 15)
        {
         s_counter = 0;
         portb.b0 = 1;
        }
     ///
ويتضمن متغيرا سميته ms_counter وحولته إلى عداد يعد نبضات التايمر1 ذات القيمة 100ميلي تانية.
بهذه التعليمة:
;++ms_counter
وبما اني أريد الحصول على 1 تانية
وأن 1 تانية = 100 ميلي تانية * 10 ،
يجب أن يعد لي ++ms_counter النبضات ذات القيمة 100ms عشر مرات ويتوقف .
ولكي يتوقف استخدمت جملة if الاولى :
كود:
if (ms_counter == 10)
        {
         ms_counter = 0;
         s_counter ++;
        }
وفيها قمت بتصفيره حتى يكون مستعدا للعد مرة أخرى للحصول على مزيد من التواني.
وضمن نفس الجملة الشرطية شغلت عدادا جديدا بنفس الطريقة وسميته s_counter ليعد لي تلك التواني .

جملة if الثانية ستراقب عداد التواني s_counter ولما يصل الى 5 كما طلبت يجعل الخرج Portb.b0=0:
كود:
 if (s_counter == 5)
        {
         portb.b0 = 0;
        }
للاشارة Portb.b0 منذ بداية عمل البرنامج يساوي 1 ، يعني عليه 5 فولت

جملة if الاخيرة سترصد متى يصل عداد التواني s_counter الى 15 لتقوم بجعل Portb.b0=1 يعني عليه جهد 5 فولت من جديد .
و ايضا تصفير هذا العداد عداد التواني s_counter استعدادا لدورة أخرى.
علما بأن 15s=10s+5s
كود:
if (s_counter == 15)
        {
         s_counter = 0;
         portb.b0 = 1;
        }
ملحوظة هامة :
يجب وضع تعليمة المناداة على دالة تهيئة مقاطعة التايمر في المكان المضبوط.
هي هنا مكتوبة بالاحمر للتوضيح وفي مكانها المخصص لها:
كود:
void main()
{
        cmcon = 7;
        trisb = 0; portb.b0 = 1;
        InitTimer1();
                
        while (1)
        {


        }
}
بدون ذلك السطر لن يعمل كود المقاطعة .
معلومة لا يشير لها الحاسب ..

وهنا الكود الكامل لو تحب تجربته أو الاستفسار حوله:

كود:
unsigned short ms_counter =0;
unsigned short s_counter =0;
 

//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
 ///// Crystal:4Mhz.
 
//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x11;
  TMR1IF_bit    = 0;
  TMR1H         = 0x3C;
  TMR1L         = 0xB0;
  TMR1IE_bit    = 1;
  INTCON        = 0xC0;
}
 
void Interrupt(){
  if (TMR1IF_bit){ 
    TMR1IF_bit = 0;
    TMR1H         = 0x3C;
    TMR1L         = 0xB0;
        
// Enter your code here
        ///
        ms_counter++;

        if (ms_counter == 10)
        {
         ms_counter = 0;
         s_counter ++;
        }
        
        if (s_counter == 5)
        {
         portb.b0 = 0;
        }

        if (s_counter == 15)
        {
         s_counter = 0;
         portb.b0 = 1;
        }
     ///
  }
} 

void main()
{
        cmcon = 7;
        trisb = 0; portb.b0 = 1;
        InitTimer1();
                
        while (1)
        {


        }
}


التعديل الأخير تم بواسطة : محمد إلياس بتاريخ 24-01-2018 الساعة 09:43 PM
احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب رسول العراق ( أعجبته المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

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