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

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

Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 121
نشاط [ Microchip2012 ]
قوة السمعة:0
قديم 04-11-2011, 11:14 PM المشاركة 1   
افتراضي [درس] بسيط لإستعمال timer0 مع pic18 خطوة بخطوة Twitter FaceBook Google+



السلام عليكم,
قمت بإنشاء درس بسيط لإستعمال الـtimer0 مع عائلة pic18 لأنني مثال له في المنتدى
<بالمناسبة انا لست خبيرا في المؤقتات قد تكون معلوماتي النظرية غير صحيحة ولكن عمليا قد تكون صحيحة>
في هذا الدرس سأستعمل pic18f4550 نظرا لشهرته وتردد الكريستال 4mhz
في هذا الدرس سنقوم بجعل الـled يضيء كل ثانية وذالك بإستخدام المؤقت timer0 والمقاطعات(interrupts) في وضع 8-bit
كيفية عمل الـtimer0 وهي عند حدوث الطفحان(overflow) يتم تنفيذ/استدعاء الكود الموجود داخل الدالة interrupt
---------------------------------------------
بالنسبة للدرس المسجلات(registers) المستخدمة:-
TMR0L:هذا المسجل نقوم بوضع قيمة له على حسب معادلة معينة(سنناقشها معا)
INTCON:مسؤول عن بعض المقاطعات انظر الصورة

T0CON:يقوم بالتحكم في الـtimer0 انظر الصورة



بما ان مدة التأخير ثانية واحدة كبيرة نسبيا فإننا سنقوم بجعل المقاطعة تحدث كل 1000us أي 1ms ومن ثم نقوم بوضع عداد يعد إلى 1000
لأن الثانية =1000 ميلي ثانية في حال وصل العداد إلى 1000 نقوم بتصفير العداد ونقوم بتبديل(toggle) قيمة الbit السابع من المنفذ B اي نعكس قيمته الحالية.




لحساب قيمة المسجل tmr0l لتأخير 1000 ميكرو ثانية يجب علينا الأخذ في الإعتبار الطول الموجي و الـprescaler

هذه المعطيات:-
time=1000us
clockperiod=1/4 mhz=0.25us
prescaler=32
الأن نقوم بتعويض القيم في المعادلة وسيكون ناتج العملية الحسابية بعد التقريب هو 225
قيمة الـprescaler تعتمد على المسجل T0CON كما شاهدت في الرسم يمكنك تغيرها عن طريق تغير قيمتها في المسجل T0CON
لكنني لن أتطرق إليها الأن لأني أريد أن يكون الدرس أبسط ما يمكن


الهيكل العام للبرنامج:-
كود:
 void interrupt(){
 
 }
 void main()
 {




}
البرنامج:-
سنقوم بتعريف متغير ونسميه count
كود:
 int count;
داخل main():-
نقوم بتصفير قيمة المتغير(count)
نقوم بجعل المنفذ B كخرج
نقوم بتصفير المنفذ B
نقوم بوضع القيمة 225 داخل المسجل TMR0L
نقوم بوضع القيمة 196 داخل المسجل T0CON
نقوم بوضع القيمة 160 داخل المسجل INTCON
أخيرا نقوم بوضع جملة تكرار إلا مالا نهاية


الكود:-

كود:
 void main()
 {
 count=0;
 trisb=0;
 portb=0;
TMR0L = 225;
T0CON = 196;
INTCON = 160;

  while(1){}

}


بالنسبة للدالة interrupt لن أقوم بشرح كل شيء لوضوح الكود عدا أخر سطرين
نقوم بإعادة تحميل المسجلTMR0L بالقيمة 225
ونقوم بتصفير قيمة العلم الخاص بالمقاطعة وإعادة تفعيل مقاطعاته وذلك من خلال وضع القيمة 32 في المسجل INTCON
الكود:-

كود:
 void interrupt(){
 count++;
 if(count==500){
 count=0;
 portb.f7=!portb.f7;
 }
 TMR0L = 225;
  INTCON=32;
 }

ملاحظة: عدلت قيمة العداد إلى 500 لكي يعطينا high كل ثانية
لأنه عندما كان 1000 كان يأخذ ثانية low وثانية high أي ثانيتين

الكود كاملا:-
كود:
 int count;
 void interrupt(){
 count++;
 if(count==500){
 count=0;
 portb.f7=!portb.f7;
 }
 TMR0L = 225;
  INTCON=32;
 }
 
 
 
 void main()
 {
 count=0;
 trisb=0;
 portb=0;
 TMR0L = 225;
T0CON = 196;
INTCON = 160;


  while(1){}  //loop forever

}

في النهاية أتمنى أن يكون الدرس سهل الفهم وبسيط وكذلك مفيد

اعلانات

ahmad abdullah
:: مهندس متميز ::
تاريخ التسجيل: Jun 2010
الدولة: لبنان-فلسطين
المشاركات: 586
نشاط [ ahmad abdullah ]
قوة السمعة:0
قديم 05-11-2011, 06:14 AM المشاركة 2   
افتراضي


الله يبارك فيك ... موضوع مهم جدا و معلومات جديدة ...
لكن لو تشرح الكودات لانه عن استخدام التايمر يجب علينا ان نعرف الكود بشكل واضح

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

lasersat
:: مهندس متواجد ::
تاريخ التسجيل: Apr 2010
المشاركات: 89
نشاط [ lasersat ]
قوة السمعة:0
قديم 05-11-2011, 09:50 AM المشاركة 3   
Thumbs up


الله يبارك فيك ... موضوع مهم جدا و معلومات جديدة ...
لكن لو تشرح الكودات لانه عن استخدام التايمر يجب علينا ان نعرف الكود بشكل واضح
الله يبارك فيك


Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 121
نشاط [ Microchip2012 ]
قوة السمعة:0
قديم 05-11-2011, 11:38 AM المشاركة 4   
افتراضي


اخي العزيز,انا سعيد جدا لأن الدرس كان مفيدا
بالنسبة لشرح الكود لقد شرحته خطوة بخطوة اعتقد على ما يبدو انك لم تقرأ الموضوع كاملا
بالنسبة إلى قيمة المسجل T0CON و INTCON هي نفسها الموجودة في الرسم
ولكنني حولتها إلى decimal فقط

رغم ذلك سأشرح البرنامج كاملا :-
في الدالة main :-
قمنا بتصفير المتغير الخاص بالعداد(count) والمنفذ B كخرج
قمنا بوع قيمة التأخير في المسجل TMR0L (على حسب معادلة تكلمنا عنها سابقا)
ثم قمنا بتفعيل اعدادات الـtimer0 ومن ثم قمنا بتفعيل المقاطعة الخاصة بالمؤقت عن طريق وضع قيمة في المسجل INTCON
ووضع جملة تكرار الى مالا نهاية
في الدالة interrupt بالمناسبة عند حدوث اي مقاطعة سيتم استدعاء هذه الدالة ولا يمكن تغير اسمها لأنها مربوطة بالـcompiler الخاص بالميكرو سي وأيضا سيتم استدعائها في مقاطعات الUSB
بما اننا قمنا بضبط المئقت كي تحدث المقاطعة كل 1 ميلي ثانية اي 1000 ميكروثانية
فإننا سنستخدم عداد يعد إلى 1000 لأن الثانية = 1000 ميلي ثانية.

ملاحظة: عدلت قيمة العداد إلى 500 لكي يعطينا high كل ثانية
لأنه عندما كان 1000 كان يأخذ ثانية low وثانية high أي ثانيتين

وفي نهاية الدالة قمنا بإعادة تحميل قيمة المسجل TMR0L وتصفير علم حدوث الطفحان
وإعادة تفعيل المؤقت في المسجل INTCON


بالنسبة إلى قيمة المسجل T0CON و INTCON هي نفسها الموجودة في الرسم
ولكنني حولتها إلى decimal فقط


ارجو ان اكون قد اجبتك
واي سؤال فأنا موجود


ahmad abdullah
:: مهندس متميز ::
تاريخ التسجيل: Jun 2010
الدولة: لبنان-فلسطين
المشاركات: 586
نشاط [ ahmad abdullah ]
قوة السمعة:0
قديم 06-11-2011, 08:01 AM المشاركة 5   
افتراضي


بارك الله فيك ... فعلاً كلام زي العسل ...
يعطيك الف عافية ...


ahmad abdullah
:: مهندس متميز ::
تاريخ التسجيل: Jun 2010
الدولة: لبنان-فلسطين
المشاركات: 586
نشاط [ ahmad abdullah ]
قوة السمعة:0
قديم 06-11-2011, 09:30 AM المشاركة 6   
افتراضي


اخي اعتذر على الجهد الذي اطلبه منك

اخي لكن ما سبب وجود قيمة 160 و 32 و 196 ... اقصد لماذا هذه القيم و ليس قيم اخرى ... بكلام اخر ، لو تكرمت علينا و وقلت اي bits في الرجسترات استخدمت للوصول الى هذه القيم ... شكرا لك


Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 121
نشاط [ Microchip2012 ]
قوة السمعة:0
قديم 06-11-2011, 12:52 PM المشاركة 7   
افتراضي


اخي اعتذر على الجهد الذي اطلبه منك

اخي لكن ما سبب وجود قيمة 160 و 32 و 196 ... اقصد لماذا هذه القيم و ليس قيم اخرى ... بكلام اخر ، لو تكرمت علينا و وقلت اي bits في الرجسترات استخدمت للوصول الى هذه القيم ... شكرا لك
اوه....نعم اسف لقد فهمت ما تعنيه
بالنسبة للريجستر TMR0Lفهو مسؤول عن وقت التأخير وقيمته وضعناها بحسب معادلة ناقشتها في بداية الموضوع وهي معادلة تعوض فيها بقيم والناتج تضعه في المسجل TMR0L
في حالتنا ناتج العملية هو 225

اما بالنسبة للمسجل T0CON فقد وضعنا فيه الإعدادات الخاصة التي نريدها بالمؤقت0 وضعنا فيها القيمة 196 اي 11000100 binary ويمكنك معرفة ماذا يعني كل بت من الرسم التالي

ثم في المسجل INTCON المسؤول عن المقاطعات قمنا بتفعيل المقاطعات العامة ومقاطعة المؤقت0 ووضعنا القيمة 160 اي 10100000 binary ويمكنك معرفة كل بت من الرسم التالي


في الدالة interrupt قمنا باعادة وضع القيمة 225 في المسجل TMR0L لأن المقاطعة تحدث عن حدوث طفحان للمسجل TMR0L اي ستكون قيمته عند الطفحان 255 اذا تركنا هذا المسجل وقيمته 255 اي في حالة الطفحان بدون اعادة وضع قيمته بـ225 فإن المقاطعة لن تحدث مرة اخرا لهذا قمنا بإعادة وضع القيمة 255 في المسجل لبدء دورة اخرى
وفي المسجل INTCON قمنا بتفعيل المقاطعات العامة ووضعنا فيه القيمة 32 اي 100000 binary
ويمكنك معرفة ماذا يعني كل بت من الرسم

بالنسبة للكود الذي وضعته وهو نفسه الذي وضعته في بداية الموضوع.
كود:
 int count;
 void interrupt(){
 count++;
 if(count==500){
 count=0;
 portb.f7=!portb.f7;
 }
 TMR0L = 0b11100001;
  INTCON=0b100000;
 }
 
 void main()
 {
 count=0;
 trisb=0;
 portb=0;
 TMR0L = 0b11100001;
T0CON = 0b11000100;
INTCON = 0b10100000;


  while(1){}  //loop forever

}
اذا كنت تريد تغير مدة التأخير فقط غير قيمة المسجل TMR0L وترك باقي المسجلات كما هي
المسجل TMR0L لا توضع فيه قيم اعتباطية ولكنني قلت سابقا هي بحسب معادلة وهي موجودة في الصور بداية الموضوع.

اتمنى ان اكون قد شرحتها جيدا

وأي سؤال انا جاهز(لا تستحي يمكنك ان تسأل كما تشاء)
^_^


Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 121
نشاط [ Microchip2012 ]
قوة السمعة:0
قديم 06-11-2011, 05:33 PM المشاركة 8   
افتراضي


بالنسبة للجملة في بداية الموضوع لقد انقصت كلمتا سهوا اعتذر على ذلك
قمت بإنشاء درس بسيط لإستعمال الـtimer0 مع عائلة pic18 لأنني مثال له في المنتدى
الجملة الصحيحة هي :قمت بإنشاء درس بسيط لإستعمال الـtimer0 مع عائلة pic18 لأنني لم اجد مثيل له في المنتدى

إضافة رد

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

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

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


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

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