الله يعطيك الف عافية اخوي محمود
و الله كفيت و وفيت
بوزكت
الحمد لله عامتني اليوم شيأ جديد بارك الله فيك
ادا ما ثقلت علبك يالغالي
عندي استفسار اخير
عن طلريقة استعمال المقاطعة في التايمر
انا لحد الان استعمل الديلاي
و لاكن وصلت لحد حيث الديلاي لا تصلح
و الف شكر لك
|
سلام عليكم
امر بسيط اخي
طبعا الفرق بين ديلي وتايمرزيرو هو ان مايكرو يصبح مشغول في تنفيذ الامر ديلي ولاينفذ اي شي الا باستخدام بعض حيل
اما في تايمرزيرو فان تايمر يكون عمله مستقل تماما عن عمل مايكرو وينطبق على حال pwm ايضا يعمل باستقلال تام عن مايكرو
نرجع كيف نفعل تايمر زيرو
=================
هنا لابد من تفعيل سجل مقاطعات وهما intcon , option_reg
http://upload.qariya.info/images/qar...2c8e5d399c.png
http://upload.qariya.info/images/qar...3afd5fae10.png
INTCON :
وهو كما في الصورة عبارة عن سجل مكون من (8Bit) كل( Bit ) له وظيفة محددة وتوضيحها كالتالي:
البيت رقم 7 : وهو بيت تفعيل جميع انواع المقاطعات :عندما نضع القيمة (1)في هذا البيت يقوم بتفعيل جميع انواع المقاطعات الموجودة في المتحكم وبدونه لن تعمل اي مقاطعة في المتحكم.طبعا يتم الغاء جميع المقاطعات بوضع القيمة( 0) في هذا البيت.
البيت رقم6: وهو بيت تفعل مقاطعة الملحقات (مثل تفعيل مقاطعة المحول من ثماثلي الى ديجيتال ADC ) فعندما نريد استخدام مقاطعات للاجزاء الملحقة نقوم بوضع القيمة(1) في هذا البيت ، اما لالغائها فنقوم بوضع القيمة(0) في هذا البيت.بما ان المعظم لا يستخدم الملحقات لذلك فنحن نضع القيمة(0) غالبا في هذا البيت.
البيت رقم5: وهو بيت تفعيل مقاطعة طفحان التايمر زيرو، ولكن ماذا يعني هذا (طفحان التايمر زيرو)؟؟ان التايمر زيرو هو سجل مكون من 8 بيت ايضا، ويستطيع هذا السجل ان يعد من القيمة(00000000) وحتى القيمة (11111111) اي من صفر وحتى 255 فعتدما يصل الى القيمة الاخيرة وهي 255 فان التايمر يعود الى القيمة (0) بعدها (وهذا يدعي بالطفحان عندما تعود قيمة المسجل من 255 الى صفر بسبب وصوله للقيمة العليا للسجل )، فعندما نقوم بتفعيل هذه المقاطعة بوضع القيمة (1) في هذا البيت فان المقاطعة ستحدث عندما تتغير قمية العدد في التايمر زيرو من 255 الى صفر، وطبعا فان الغائها يتم بوضع القمية (0) في هذا البيت.وهذه من اهم المقاطعات وسنذكر السبب لاحقا.
البيت رقم4: وهو بيت تفعيل المقاطعة على الطرف صفر في البورت B اي انه عنما يتغير الجهد على الطرف (RB0) من القيمة صفر الى 5 فولت او العكس تحدث عملية مقاطعة في المتحكم وعندها يمكننا ان نطلب من المتحكم ان ينفذ مجموعة تعليمات عند حدوث هذه المقاطعة،يتم تفعيل هذه المقاطعة بوضع القيمة (1) في هذا البيت والغائها يتم بوضع القيمة (0) في هذا البيت.
البيت رقم3: وهو بيت تفعيل المقاطعة عندما يتغير الجهد على واحد من الاطراف رقم 4 او 5 او 6 او 7 للبورت B اي عندما يتغير الجهد على واحد من الاطراف (RB4\RB5\RB6\RB7) على الاقل من القمية صفى الى 5 فولت او العكس، وتحدث هذه المقاطعة عندما يتغير واحد على الاقل من الاطراف السابقة ، يتم تفعيل هذه المقاطعة بوضع القيمة (1) في هذا البيت والغائها يتم بوضع القيمة (0) في هذا البيت.
البيت رقم 2: وهو علم حدوث طفحان في التايمر زيرو، ايضا نسال انفسنا ماذا يعني علم حدوث مقاطعة,الان كما نعرف في الرياضات بشكل عام مثل كرة القدم فانه عند خروج الكرة من الملعب فان الحكم برفع العلم ليدل على ان الكرة خرجت خارج الملعب.. وهذه وظيفة العلم هنا. فعندما يحدث طفحان وتغير في القيمة من 255 الى القمية صفر فان هذا البيت يتحول تلقائيا من القيمة صفر الى القيمة واحد دلالة على حدوث طفحان للتايمر..طبعا تتم تصفير هذا البيت في بداية البرنامج وذلك ليستطيع ان يتغير الى القيمة واحد عند حدوث الطفحان في التايمر.
البيت رقم1: وهو علم حدوث تغير في الطرف RB0 اي انه حدث هناك تغير للجهد على الطرف RB0 من القيمة صفر الى واحد او العكس .فعند حدوث تغيير للجهد على هذا الطرف تتحول قيمة هذا البيت من صفر الى واحد ، طبعا تتم تصفير هذا البيت في بداية البرنامج وذلك ليستطيع ان يتغير الى القيمة واحد عند حدوث تغيير للجهد على هذا الطرف.
البيت رقم0: وهو علم حدوث تغير في احد الاطراف (RB4\RB5\RB6\RB7) اي تغير احد هذه الاطراف على الاقل من القيمة صفر الى 5 فولت او العكس . فعند حدوث التغير لاحد الاطراف يتغير هذا البيت من القمية صفر الى واحد ، طبعا تتم تصفير هذا البيت في بداية البرنامج وذلك ليستطيع ان يتغير الى القيمة واحد عند حدوث تغيير للجهد على احد الاطراف السابقة ..
بالنسبه لريجيستر option_reg
http://upload.qariya.info/images/qar...86edee74db.png
http://upload.qariya.info/images/qar...48a87fffb6.png
فاننا نحتاج من هذا ريجيستر مجال تقسيم
ايضا في تايمر زيرو نحتاج
1- تفعيل انتربت لتمكين اي داله تعمل بانتربت ونكتب
;GIE_BIT=1
2-لتفعيل مقاطعه تايمرزيرو نكتب
;T0IE_BIT=1
3-نصفر طفحان تايمرزيرو لماذا نصفره انظر للملاحظه
كود:
1 = TMR0 register has overflowed (must be cleared in software)
ونكتب في برنامج ;T0IF_BIT=0
http://upload.qariya.info/images/qar...0b89edbf94.png
4- عامل تقسيم نحوله الى تايمر زيرو اي نكتب ;PSA_BIT=0
5- نختار نسبه تقسيم فاذا كتبت
;PS2_BIT=1 ;PS1_BIT=1;PS0_BIT=1
فان معامل تقسيم = 1/256
http://upload.qariya.info/images/qar...2be5398ecb.png
==========================================
اخي كريم اليك ملاحظه مهمه
بعض مايكروكنترولر لا يوجد فيها سجل option_reg وانت تريد مجال تقسيم اين يمكنك ايجاده اليك طريقه وهي سهله جدا
انت لابد من معرفه اسم بت ومجال التقسيم اسمه PSA حمل منول للبك الذي تتعامل معه ثم افتح منول من قائمه EDIT اختار find
http://upload.qariya.info/images/qar...172f492435.png
راح يطلعلك مستطيل صغير اكتب اي شي تريده اي تبحث عنه انا اريد الان مجال تقسيم ايضا اكتب في مربع PSA ثم اضغط على ENTER راح يقودني في كل صفحه موجود فيها كلمه PSA استمر اضغط على انتر راح يقود الى سجل المطلوب
لاحظ في البك 18F45K22 لايوجد اسم سجل option_reg وانما اسمه T0CON
اتبع ملاحظه اعلاه وان شالله يقودك الى سجل مطلوب
=========================================
ان شالله تكون الامور واضحه ناتي الان الى جزء العملي
لابد من وضع هذه الاوامر التي تم شرحها سابقا وبالصور نضعها في قائمه الرئيسيه
اي في void main
كود:
GIE_BIT=1;//Global Interrupt Enable bit
T0IE_bit=1;//Timer0 Overflow Interrupt Enable bit
T0IF_bit=0;// Timer0 Overflow Interrupt Flag bit
T0CS_bit=0; // Internal instructioncycle clock (FOSC/4)
PSA_bit=0; // Prescaler is assigned to the Timer0 module
PS2_bit=1;PS1_bit=1;PS0_bit=1; //1 : 256
ونكتب داله الانتربت طبعا اسم داله ليس عشوائيا وانما هو اسم داله الانتربت ومتى حدث وجود اشاره الانتربت يترك مايكرو عمله وينتقل مباشره الى هذه داله
واليك هذا مثال
كود:
void interrupt()
{
if( T0IF_bit == 1) cont1++;
if(cont1 =256){ cont1=0;cont++;}
tmr0=0;
T0IF_bit=0;
}
طبعا اخي انتربت تعني مقاطعه اي ان مايكرو يقطع عمله لينفذ الاوامر التي كتبت في داله الانتربت وبعد الانتهاء يعود الى نفس مكان الي تمت فيها مقاطعه
اليك شرح مثال ( اقصد الاوامر التي وضعتها كأكواد وملونه بلون الازرق)
في بدايه برنامج فعلت الانتربت وبعدها تايمر زيرو وصفرت طفحان تايمرزيرو وجعلت نسبه تقسيم الى تايمرزيرو وجعلت نسبه تقسيم 1/256
طبعا انا اختاريت تردد كرستاله 4mhz وبما انه يتم تقسيم تردد على 4 ايضا يصبح 1mhz اي زمن تنفيذ كل الامر = 1us
مجال تقسيم =256 هذا يعني كل 256 نبضه يحدث طفحان ويحدث مقاطعه اي
راح يزيد متغير cont1 بمقدار 1 وهذا اصبح =256 يزداد cont بمقدار 1
يعني شنو صار
قلنا كل 256 يحدث طفحان وزمن تنفيذ =1 يعني لمايحدث طفحان زمن =
256x1us= 256us
وهكذا يجمع cont1 عدد طفحان وفي كل طفحان زمن =256 وعندما يصل cont1 الى 256 وهذه اقصى قيمه لماذا لان تايمر زيرو هو 8 بت اي اقصى قيمه له 256
عندها يصبح زمن 65536 مايكروثانيه هنا سيتم تصفير cont1 وزياده cont
تلاحظ انه كل مايحدث طفحان يتم تصفير اعلام خاص بالطفحان وكذلك تصفير تايمرزيرو
فاذا كان مطلوب 5 ثواني كم اتوقع وصول عداد cont
cont=5000000/65536=77
اذن لما يصل cont الى 77 فانه وصل تقريبا الى 5 ثواني
اذن اخي عندما تحتاج زمن معين كا يحسب لك زمن ضغطه مفتاح او اي شي يجب بالبدايه تصفر متغيرات التي وضعتها في داله الانتربت والتي تحسب لك كم مره حدث طفحان وكذلك تصفر بت خاص باعلام طفحان وكذلك تايمرزيرو وهذه الامور تفعلها عند كل مره تحسب فيها زمن لماذا لان تايمر زيرو مستقل بعمله فهو يعد باستمرار اذا لم نصفره فاننا اكيد سنحصل على نتائج خاطئه
اتمنى لك كل توفيق واي استفسار انا حاضر ان شالله