بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
تحضير الكلمات الإنجليزية يستغرق وقتا طويلا... لهذا سأبدأ في الشرح ونكمل إن شاء الله في المشاركات القادمة.
يا سلام على إحساسك لما تكتب الموضوع في ساعة أو ساعتين ثم يعملها معاك الأندرويد ويعيد تحميل الصفحة وتضيع كل ما كتبته!!
هههههههههه.
😃😃😃
😂😂😂
والآن لندخل في الجد.
تايمر1 يحتوي على 16 بت للعد.. وليس 8 بت كما هو الحال في تايمر زيرو.. حيث يمكن لتايمر1 أن يعد من صفر حتى 65535
ولكن يوجد عيب صغير.. وهو أن الـ 16 بت ليست مجتمعة في سجل واحد.. وإنما مقسمة على سجلين.. كل سجل 8 بت.
السجل الذي يحمل أول 8 بت من اليمين (البتات الصغيرة) اسمه TMR1L وحرف L اختصار لكلمة منخفض (low).
وأما السجل الذي يحمل الـ 8 بت التي على الشمال (البتات الكبيرة) فاسمه TMR1H والحرف H اختصار كلمة مرتفع (high).
السجل الذي يتحكم في تايمر1 اسمه T1CON وهو كما بالصورة من الداتا شيت:
البت الأول (رقم صفر) هو الذي يجعل تايمر1 يبدأ في العد أو يتوقف.
فإذا جعلته بواحد فإن التايمر1 يبدأ في العد.. وإذا جعلته بصفر فإنه يتوقف عن العد عند الرقم الذي واقف عنده.. فإذا جعلت هذا البت مرة أخرى بواحد فإنه لا يبدأ العد من الصفر وإنما يبدأ العد من الرقم الذي كان متوقفا عنده.
ملحوظة هامة جدا:
في بداية عمل المتحكم فإن قيمة TMR1L و TMR1H لا تكون بصفر... وإنما تكون بقيمة عشوائية.. وكذلك تايمر زيرو... لهذا سيكون عليك أن تكتب هذا الأمر في البداية قبل أن يبدأ التايمر في العد:
TMR1L=0
TMR1H=0
ولا تنس ; في نهاية التعليمة إن كنت تستخدم مايكروسي.
البت الثاني (رقم1) وظيفته هو هل تريد أن تجعل تايمر1 يعد من خلال مذبذب البك أم من خلال نبضات خارجية على الطرف T1CKI؟
فإذا جعلت هذا البت بواحد سيعد تايمر1 من خلال الطرف T1CKI بحيث كل نبضة يزداد بواحد (هذا مع عدم وجود بريسكيلر)... ويسمى في هذه الحالة عداد (counter).
أما إن جعلت هذا البت بصفر سيعد من خلال نبضات مذبذب المتحكم بحيث كل أربع نبضات من مذبذب المتحكم يزداد واحد (هذا مع عدم وجود بريسكيلر).. والسبب أن البك ينفذ تعليمة كل أربع نبضات من مذبذب البك... ويسمى في هذه الحالة مؤقت (timer).
لاحظ أن تايمر زيرو أيضا هناك بت يتحكم فيه يشبه هذا البت حيث يجعله إما يعد من خلال مذبذب البك وإما يعد من خلال نبضات خارجية على الطرف T0CKI.
لا تنس أن تايمر0 عندما يعمل كعداد فإنه يستقبل النبضات الخارجية على الطرف T0CKI.
بينما تايمر1 عندما يعمل كعداد فإنه يستقبل النبضات الخارجية على T1CKI.
في تايمر زيرو عندما كان يعمل كعداد فإنه كان بإمكاننا أن نجعل النبضة حافة صاعدة أو حافة هابطة... بينما تايمر1 عندما يعمل كعداد فإنه لا يزداد إلا مع الحافة الصاعدة (يعني عندما يتحول T1CKI من صفر إلى واحد).
لا تظن أنه عندما تجعل تايمر1 عداد فأن المتحكم سيجعل T1CKI كدخل ويتجاهل تعليمة trise ... كلا... بل يمكنك أن تجعل هذا الطرف دخل أو خرج بالرغم أنه مصدر عد تايمر1
البت الثالث (رقم2) وظيفته هي:
إن كان تايمر1 يعمل كمؤقت من خلال نبضات مذبذب المتحكم فإن هذا البت الثالث لن تكون له فائدة لأنه بهذا الشكل عندما يدخل البك في حالة النوم من خلال التعليمة asm sleep فإن مذبذب المتحكم سيتوقف عن العمل من أجل توفير الطاقة وبالتالي يتوقف تايمر1 عن العد.
أما إن كان تايمر1 يعمل كعداد من خلال الطرف T1CKI فهنا تأتي وظيفة هذا البت الثالث حيث يقول لك أمامك خياران:
الخيار الأول أن نبضات T1CKI تصل لتايمر1 سواء كان مذبذب المتحكم متوقفا أو غير متوقف.
الخيار الثاني هل تريد أن تصل نبضات T1CKI إلى تايمر1 إن كان مذبذب المتحكم يعمل.. وأما إن كان مذبذب المتحكم لا يعمل فلا تصل؟
هذه تسمى بمزامنة نبضات T1CKI مع نبضات مذبذب المتحكم.
فإن جعلت هذا البت بواحد فستوقف هذه المزامنة... ويستمر T1CKI في العد حتى لو دخل المتحكم في وضع النوم.
وأما إن جعلت هذا البت بصفر فأنت تفعل المزامنة.. وسيتوقف تايمر1 عن العد عندما يدخل المتحكم في وضع النوم.
ملحوظة:
في تايمر زيرو سيتوقف عن العد إن دخل المتحكم في وضع النوم ولا يمكن تشغيله أبدا حتى يستيقظ المتحكم... أما تايمر1 فهو الذي بإمكانه أن يستمر في العد والمتحكم في حالة النوم.
البت الرابع (رقم3) يقول لك هل تريد أن تضع كريستالة ترددها 32768 هرتز على الطرف T1CKI؟
على فكرة.. هذه العبارة بهذا الشكل خطأ.. وذلك لأنك إن أردت أن تضع كريستالة على هذا الطرف فإنه لن يعمل بوظيفة T1CKI وإنما سيعمل بوظيفة T1OSO.
وستضع الطرف الآخر للكريستالة على الطرف T1OSI.
إذا اخترت هذا الخيار فإن تايمر1 لن يعتمد في العد على زر كنت تضغط عليه.. وإنما سيعد 32768 مرة في الثانية... ولا تقل سيقسم التردد على 4 فهذا كان عندما يأخذ العد من مذبذب المتحكم.. أما الآن فكل نبضة على الطرف T1OSO سيعدها واحد.
وإذا اخترت هذا الأسلوب فسيتجاهل المتحكم تعليمة trise الخاصة بالطرفين T1OSO و T1OSI.
أما إن لم تحب ذلك فستضع زر ومقاومة رفع على الطرف T1CKI ويعمل تايمر1 كعداد.
إن جعلت هذا البت الرابع بواحد فأنت تفعل مذبذب الكريستالة 32768
وأما إن جعلت هذا البت بصفر فأنت تختار أن تستخدم زر ومقاومة رفع على الطرف T1CKI.
لاحظ أن الطرف T1CKI هو نفسه الطرف T1OSO ولكن هذا الطرف إما أن يعمل بهذه الوظيفة وإما أن يعمل بهذه الوظيفة.
كما أنك إن اخترت تشغيل هذا المذبذب فيستحب أن تضع مكثفين بقيمة 15 بيكو بين طرفي الكريستالة والأرضي كما هو الحال في كريستالة مذبذب البك.
سأشرح إن شاء الله لاحقا فوائد هذه الكريستالة.. حيث إن لها فوائد مهمة جدا.
البت الخامس والسادس (رقم4 و5) يتحكمان في البريسكيلر.
البريسكيلر وحدة تقوم بتقسيم النبضات قبل دخولها على التايمر (سواء كان سيعمل كمؤقت أو كعداد).
يمكنه أن يقسم النبضات على 1 أو على 2 أو على 4 أو على 8 أو على 16 إلخ...
تايمر زيرو كان يمتلك بريسكيلر يمكنه التقسيم حتى 256
أما تايمر1 فيمتلك بريسكيلر يمكنه التقسيم حتى 8 فقط.
ويتحكم في هذا البريسكيلر هذان البتان رقم 4 و5
فإذا جعلتهما 00 كان التقسيم على واحد
وإذا جعلته 01 كان التقسيم على 2
وإذا جعلته 10 كان التقسيم على 4
وإذا جعلته 11 كان التقسيم على ثمانية.
أما البتان السابع والثامن (رقم6 و7) فهما غير مستخدمين.
(ولكنهما مستخدمين في حالة PIC16F887).
لن أشرح السجلات المسؤولة عن مقاطعة تايمر1 وإنما أحيلك على هذا الرابط:
http://www.qariya.info/vb/showpost.p...26&postcount=4
ولا تنس أني قلت هنا في مشاركة الكلمات الإنجليزية التي ستحفظها:
|
أسماء السجلات والبتات(لا بد من حفظها ولو حفظا مؤقتا قبل قراءة الداتا شيت إن أردت أن تكون محترفا):
اسم السجل المسؤول عن جميع المقاطعات INTCON
اسم البت رقم 7 من هذا السجل GIE
(وإذا كان قيمته صفر سيتم تعطيل جميع المقاطعات)
اسم البت رقم 6 من هذا السجل PEIE
(وإذا كان بصفر سيتم تعطيل جميع المقاطعات الإضافية [والمقاطعات الإضافية كثيرة إحداها مقاطعة طفحان تايمر1])
اسم السجل المسؤول عن جميع المقاطعات الإضافية PIE1
(ويوجد في المتحكمات الكبيرة سجل آخر اسمه PIE2 لكننا لا نحتاجه في التايمر1)
اسم البت رقم 0 من هذا السجل TMR1IE
(وهو المسؤول عن تفعيل أو تعطيل مقاطعة تايمر1)
اسم السجل الذي يظهر فيه أعلام المقاطعات الإضافية PIR1
(ويوجد في المتحكمات الكبيرة سجل آخر اسمه PIR2 لكننا لا نحتاجه في تايمر1)
اسم البت رقم 0 من هذا السجل TMR1IF
(وهو الذي يظهر فيه عَلَم حدوث مقاطعة طفحان تايمر1)
اسم السجل المتحكم في تايمر1 T1CON
اسم البت رقم 5 من هذا السجل T1CKPS1
اسم البت رقم 4 من هذا السجل T1CKPS0
اسم البت رقم 3 من هذا السجل T1OSCN
اسم البت رقم 2 من هذا السجل T1SYNC
(وستجد فوق الاسم خط)
اسم البت رقم 1 من هذا السجل TMR1CS
اسم البت رقم 0 من هذا السجل TMR1ON
وسنعرف إن شاء الله في المشاركات القادمة وظيفة كل بت.
وإذا كنت تستخدم PIC16F887 فهناك بت 6 وبت 7 حيث:
اسم البت رقم 7 من هذا السجل T1GINV
اسم البت رقم 6 من هذا السجل TMRIGE
|
والآن نأتي إلى شيء آخر وهو ما فائدة وضع كريستالة 32768 هرتز لتايمر1 بينما يوجد كريستالة أخرى 4 ميجا أو 8 ميجا أو 20 ميجا يعمل عليها البك؟
المذبذب الذي تردده عالي يستهلك طاقة كبيرة... لهذا فإن الكهرباء التي يستهلكها مذبذب البك إن كانت الكريستالة مثلا 4 ميجا أكبر بكثير من التي يستهلكها مذبذب 32768
وهكذا عندما يدخل البك في وضع توفير الطاقة (وضع النوم) عن طريق التعليمة asm sleep ويتوقف مذبذب البك يستمر تايمر1 في العمل كمؤقت (هذا إن عطلت المزامنة).
أضف إلى ذلك ميزة أخرى... لو تتذكر عندما كنا نحسب حسابات تايمر زيرو عندما يعمل على كريستالة 4 ميجا كنا نحسب البريسكيلر وأيضا تطلع نسبة خطأ... وذلك ببساطة لأن 4 ميجا لا تقبل القسمة على 256 فكنا لا بد أن ننتج قيمة تقريبية لواحد ثانية.
كان وقتها (مع تايمر زيرو) كان الحل أن نجعل مذبذب البك 32768 ونجعل البريسكيلر يقسم على 32 وهكذا يحدث طفحان لتايمر زيرو بالضبط كل ثانية بدون نسبة خطأ (على افتراض أن الكريستالة مثالية).
فقام تايمر1 بتوفير هذه الميزة (العمل على مذبذب32768 هرتز) وفي نفس الوقت يعمل البك على مذبذب آخر بأي قيمة.
وهكذا فإنه بجعل البليسكيلر يقسم على واحد (أي يصبح البريسكيلر كأنه غير موجود) فحينئذ يحدث طفحان لتايمر1 كل ثانيتين بالضبط بدون نسبة خطأ (على افتراض أن الكريستالة مثالية).
هناك فائدة أخرى لهذه الكريستالة سأذكرها لاحقا.
قد يسألني سائل فيقول أنا لا أريد أن يحدث طفحان كل ثانيتين.. بل أريد كل ثانية واحدة.
سأقول لك عندي الحل...
كل ما يحدث طفحان لتايمر1 اكتب هذه التعليمة:
تايمر1 يساوي 32768
طبعا لن تكتبها بهذا الشكل.. سأشرح لاحقا كيف تكتبها.
عندما تكتب هذه التعليمة فإنه بعد ثانية واحدة سيصل العد إلى 65536 ويحدث طفحان.
ماذا لو أردت أن أجعله يعمل طفحان كل ربع ثانية؟
سأقول لك...
ربع ثانية يعني كم نبضة؟
تساوي 8192 نبضة.
ويحدث الطفحان عندما يصل التايمر إلى 65536
فكل ما يحدث طفحان تكتب التعليمة:
تايمر1 يساوي 57344
وهكذا بعد 8192 نبضة (أي ربع ثانية) يحدث طفحان.
بقي أن أخبركم بفائدة أخرى مهمة لاستخدام كريستالة 32768 هرتز بينما البك يعمل بكريستالة 4 ميجا مثلا... أذكرها لكم إن شاء الله المشاركة القادمة.
بالإضافة إلى كيف تكتب تعليمة تايمر1 يساوي كذا.
وكيف تضع قيمة تايمر1 في متغير من نوع unsigned int.
والسلام عليكم ورحمة الله وبركاته.