- ہمارے پاس تاخیر () ہونے پر ٹائمر کیوں؟
- پی آئی سی مائکروقانونی ٹائمر:
- پروگرامنگ اور ورکنگ وضاحت:
- سرکٹ ڈایاگرام اور پروٹیوس تخروپن:
یہ ہماری PIC ٹیوٹوریل سیریز کا پانچواں سبق ہوگا ، جو آپ کو PIC16F877A میں ٹائمر سیکھنے اور استعمال کرنے میں مدد فراہم کرے گا ۔ ہمارے پچھلے سبق میں ، ہم نے پی آئی سی اور ایم پی ایل ایکس ایکس آئی ڈی آئی کے تعارف کے ساتھ شروعات کی تھی ، پھر ہم نے پی آئی سی کا استعمال کرتے ہوئے ایل ای ڈی کو جھپکانے کے لئے اپنا پہلا پی آئی سی پروگرام لکھا اور پھر پی آئی سی مائکروکونٹرولر میں تاخیر کی تقریب کا استعمال کرکے ایل ای ڈی پلکنے والی ترتیب بنائی۔ اب ہم وہی ایل ای ڈی چمکنے والی ترتیب کا استعمال کریں جو ہم نے پچھلے سبق ہارڈویئر میں استعمال کیا ہے اور اس کے ساتھ ہم اپنے PIC MCU میں ٹائمر استعمال کرنے کا طریقہ سیکھیں گے ۔ ہم نے اس ٹیوٹوریل کے لئے ایل ای ڈی بورڈ میں ابھی ایک اور بٹن شامل کیا ہے۔ مزید جاننے کے لئے ٹیوٹوریل کو دیکھیں۔
ایمبیڈڈ پروگرامر کے ل Time ٹائمر ایک اہم ورک ہارس ہیں۔ ہر ایک درخواست جو ہم ڈیزائن کرتے ہیں اس میں کسی نہ کسی طرح وقت کی درخواست شامل ہوتی ہے ، جیسے وقت کے ایک وقفے کے بعد کسی چیز کو آن یا آف کرنا۔ ٹھیک ہے ، لیکن ہمیں ٹائمر کی ضرورت کیوں ہے جب ہمارے پاس پہلے سے ہی یہی کام کرنے میں میکرو (__Dlay_ms ()) میں تاخیر ہوتی ہے !!
ہمارے پاس تاخیر () ہونے پر ٹائمر کیوں؟
تاخیر سے متعلق میکرو کو "ڈمپ" تاخیر کہا جاتا ہے۔ کیونکہ تاخیر کے عمل کے دوران ایم سی یو صرف تاخیر پیدا کرکے ڈمپ بیٹھتا ہے ۔ اس عمل کے دوران ایم سی یو اپنی اے ڈی سی اقدار کو نہیں سن سکتا اور نہ ہی اپنے رجسٹروں سے کچھ پڑھ سکتا ہے۔ لہذا ایل ای ڈی پلکنے جیسے ایپلی کیشنز کے لئے جہاں تاخیر درست یا لمبی نہیں ہونے کی ضرورت ہوتی ہے سوائے اس میں تاخیر کا استعمال کرنا مناسب نہیں ہے۔
تاخیر والے میکروز میں بھی درج ذیل مختصر آتے ہیں ،
- تاخیر کی قیمت کو میکرو کے لئے تاخیر کا ہونا ضروری ہے۔ پروگرام پر عمل درآمد کے دوران اسے تبدیل نہیں کیا جاسکتا۔ لہذا یہ باقی ہے پروگرامر کی وضاحت ہے.
- ٹائمر کے استعمال کے مقابلے میں تاخیر درست نہیں ہوگی۔
- میکروز کا استعمال کرتے ہوئے تاخیر کی بڑی اقدار نہیں بنائی جاسکتی ہیں ، مثال کے طور پر آدھے گھنٹے کی تاخیر میکرو کے ذریعہ نہیں بنائی جاسکتی ہے۔ زیادہ سے زیادہ تاخیر جو استعمال ہوسکتی ہے وہ استعمال کردہ کرسٹل آسکیلیٹر پر مبنی ہے۔
پی آئی سی مائکروقانونی ٹائمر:
جسمانی طور پر ، ٹائمر ایک رجسٹر ہوتا ہے جس کی قیمت مستقل 255 تک بڑھتی جارہی ہے ، اور پھر اس کا آغاز دوبارہ ہوتا ہے: 0 ، 1 ، 2 ، 3 ، 4… 255…. 0 ، 1 ، 2 ، 3…… وغیرہ
PIC16F877A PIC MCU تین ٹائمر ماڈیولز ہے. وہ ٹائمر0 ، ٹائمر 1 اور ٹائمر 2 کے نام ہیں۔ ٹائمر 0 اور ٹائمر 2 8 بٹ ٹائمر ہیں اور ٹائمر 1 16 بٹ ٹائمر ہے۔ اس ٹیوٹوریل میں ہم اپنی درخواست کے لئے ٹائمر 0 استعمال کریں گے۔ ایک بار جب ہم ٹائمر 0 کو سمجھ گئے تو ٹائمر 1 اور ٹائمر 2 پر بھی کام کرنا آسان ہوجائے گا۔
ٹائمر 0 ماڈیول ٹائمر / کاؤنٹر میں درج ذیل خصوصیات ہیں:
- 8 بٹ ٹائمر / کاؤنٹر
- قابل مطالعہ اور قابل تحریر
- 8 بٹ سافٹ ویر پروگرام قابل پریسکلر
- اندرونی یا بیرونی گھڑی کا انتخاب کریں
- FFh سے 00h تک اوور فلو میں مداخلت کریں
- بیرونی گھڑی کے ل Ed کنارے کا انتخاب کریں
ٹائمر کا استعمال شروع کرنے کے ل we ہمیں کچھ پسند کی اصطلاحات کو سمجھنا چاہئے جیسے 8 بٹ / 16 بٹ ٹائمر ، پریسکلر ، ٹائمر مداخلت اور فوکس۔ اب ، ہم دیکھتے ہیں کہ ہر ایک کا اصل مطلب کیا ہے۔ جیسا کہ پہلے کہا گیا ہے کہ ہمارے پی آئی سی ایم سی یو میں 8 بٹ اور 16 بٹ ٹائمر دونوں موجود ہیں ، ان کے مابین بنیادی فرق یہ ہے کہ 16 بٹ ٹائمر کے پاس اس سے کہیں بہتر قرارداد ہے کہ 8 بٹ ٹائمر۔
پری اسکیلر ایک مائکرو قابو کرنے والے کے حصے کا نام ہے جو منطق تک پہنچنے سے پہلے آسکیلیٹر گھڑی کو تقسیم کرتا ہے جس سے ٹائمر کی حیثیت بڑھ جاتی ہے۔ پرسکلر آئی ڈی کی حد 1 سے 256 تک ہے اور پریسکلر کی قیمت آپشن رجسٹر (وہی ایک ہے جسے ہم مزاحم کو کھینچنے کے لئے استعمال کرتے ہیں) کا استعمال کرتے ہوئے طے کرسکتے ہیں۔ مثال کے طور پر اگر پرسکلر کی قیمت 64 ہے تو ہر 64 ویں پلس کے لئے ٹائمر میں 1 کا اضافہ کیا جائے گا۔
جب ٹائمر میں اضافہ ہوتا ہے اور جب یہ اپنی زیادہ سے زیادہ قیمت 255 تک پہنچ جاتا ہے تو ، یہ ایک رکاوٹ پیدا کردے گا اور خود کو 0 میں واپس شروع کردے گا۔ اس رکاوٹ کو ٹائمر مداخلت کہا جاتا ہے۔ اس رکاوٹ سے MCU کو آگاہ کیا جاتا ہے کہ اس خاص وقت نے لیپ کیا ہے۔
فاسک کا مطلب آسکیلیٹر کی تعدد ہے ، یہ استعمال شدہ کرسٹل کی تعدد ہے۔ ٹائمر رجسٹر کے ل taken جانے والا وقت پریسکلر کی قدر اور فاسک کی قدر پر منحصر ہے۔
پروگرامنگ اور ورکنگ وضاحت:
اس ٹیوٹوریل میں ہم دو بٹنوں کو دو آدانوں اور 8 ایل ای ڈی کو آؤٹ پٹ کے طور پر ترتیب دیں گے۔ پہلا بٹن وقت کی تاخیر (ہر دھکے کے لئے 500 م) مقرر کرنے کے لئے استعمال ہوگا اور دوسرا بٹن ٹائمر تسلسل کو ٹمٹمانے شروع کرنے کے لئے استعمال ہوگا۔ مثال کے طور پر ، اگر پہلا بٹن تین بار دبایا جاتا ہے (500 * 3 = 1500 ملی میٹر) تاخیر 1.5 سیکس کے لئے طے کی جائے گی اور جب بٹن دو دبائے جاتے ہیں تو پہلے سے طے شدہ وقت کی تاخیر کے ساتھ ہر ایل ای ڈی آن اور آف ہوجائے گا۔ چیک کریں مظاہرے ویڈیو اس ٹیوٹوریل کے آخر میں.
اب ، ان بنیادی باتوں کو ذہن میں رکھتے ہوئے آئیے کوڈ سیکشن کے آخر میں دیئے گئے اپنے پروگرام کو دیکھیں ۔
اگر آپ کو پروگرام نہیں ملا تو ٹھیک ہے ، لیکن اگر آپ نے حاصل کیا تو !! اپنے آپ کو کوکی دیں اور اپنے آؤٹ پٹ سے لطف اندوز ہونے کے لئے پروگرام ڈمپ کریں۔ دوسروں کے ل I میں پروگرام کو معنی خیز حصوں میں تقسیم کروں گا اور آپ کو بتاتا ہوں کہ ہر بلاک میں کیا ہو رہا ہے۔
ہمیشہ کی طرح کوڈ کی پہلی چند لائنیں کنفیگریشن سیٹنگ اور ہیڈر فائلیں ہوتی ہیں ، اس لئے میں اس کی وضاحت نہیں کروں گا کیوں کہ میں پہلے ہی اپنے سبق میں یہ کر چکا ہوں۔
اگلا ، ہم تمام لائنوں کو چھوڑ دیں اور سیدھے باطل مرکزی فعل میں کودیں ، جس کے اندر ہمارے پاس ٹائمر0 کے لئے پورٹ ترتیب موجود ہے۔
باطل مین () {/ ***** ٹائمر کے لئے پورٹ کنفیگریشن ****** / آپشن _ جی = 0b00000101؛ بیرونی فریق کے ساتھ // ٹائمر0 اور 64 بطور نسخہ // اس کے علاوہ پل آر اپ ٹی ایم آر0 = 100 کو بھی اہل بناتا ہے۔ // 0.0019968s کے لئے وقت کی قیمت لوڈ کریں؛ delayValue 0-256 کے درمیان ہوسکتی ہے صرف TMR0IE = 1؛ // PIE1 رجسٹر GIE = 1 میں ٹائمر مداخلت بٹ کو فعال کریں۔ // عالمی مداخلت PEIE = 1 کو فعال کریں؛ // پیریفرل رکاوٹ کو قابل بنائیں / *********** ______ *********** /
اس کو سمجھنے کے ل we ہمیں اپنے PIC ڈیٹاشیٹ میں آپشن رجسٹر دیکھنا ہوگا۔
جیسا کہ پچھلے سبق میں بحث کی گئی ہے ، PORTB کے لئے کمزور پل اپ ریزسٹر کو چالو کرنے کے لئے بٹ 7 کا استعمال کیا جاتا ہے۔ مذکورہ اعداد و شمار کو دیکھیں ، ایم سی یو کو ہدایت دینے کے لئے بٹ 3 کو 0 بنایا گیا ہے کہ درج کیا جارہا ہے کہ مندرجہ ذیل نسخہ ٹائمر کے لئے استعمال کیا جانا چاہئے نہ کہ واچ ڈاگ ٹائمر (WDT) کے لئے۔ ٹائمر وضع کا انتخاب بٹ 5 ٹی0 سی ایس کو صاف کرکے کیا جاتا ہے
(OPTION_REG <5>)
اب ، بٹس 2-0 ٹائمر کے لئے نسخہ قدر مقرر کرنے کے لئے استعمال کیا جاتا ہے۔ جیسا کہ 64 کی قیمت مقرر کرنے کیلئے مندرجہ بالا جدول میں دکھایا گیا ہے ، بٹس کو 101 کے طور پر سیٹ کرنا ہوگا۔
اگلا ، آئیے ٹائمر 0 سے وابستہ رجسٹروں کو دیکھیں
ٹائمر ایک بار سیٹ ہونے اور 256 کی قیمت تک پہنچنے کے بعد اوور فلو میں اضافہ کرنا شروع کردے گا ، تاکہ اس مقام کے دوران ٹائمر کی مداخلت کو قابل بنایا جاسکے تاکہ ٹی ایم آر0IE رجسٹر کو اونچا رکھا جائے۔ چونکہ ٹائمر 0 خود ایک پیریفرل ہے ، ہمیں پیئآئ = 1 بناکر پیریفرل رکاوٹ کو چالو کرنا ہے ۔ آخر کار ہمیں عالمی رکاوٹ کو اہل بنانا ہے تاکہ ایم سی یو کو کسی بھی کارروائی کے دوران مداخلت کے بارے میں مطلع کیا جاسکے ، ایسا GIE = 1 کرکے کیا جاتا ہے ۔
تاخیر = ((256-REG_val) * (پریسل * 4)) / فاسک
مندرجہ بالا فارمولہ تاخیر کی قیمت کا حساب کرنے کے لئے استعمال ہوتا ہے۔
کہاں
آر ای جی_وال = 100؛
پریسل = 64
فوسک = 20000000
یہ حساب کتاب دیتا ہے ،
تاخیر = 0.0019968s
لائنوں کا اگلا سیٹ I / O بندرگاہوں کو قائم کرنا ہے۔
/ ***** I / O ****** / TRISB0 = 1 کیلئے پورٹ کنفیگریشن۔ // ایم سی یو کو ہدایت دیں کہ بٹن 1 میں PORTB پن 0 ان پٹ کے بطور استعمال ہوتا ہے۔ TRISB1 = 1؛ // ایم سی یو کو ہدایت دیں کہ پورٹ بی پن 1 بٹن 1 میں ان پٹ کے بطور استعمال ہوتا ہے۔ TRISD = 0x00؛ // ایم سی یو کو ہدایت دیں کہ پورٹ ڈی پر تمام پنوں آؤٹ پٹ پورٹ ہے = 0x00؛ // تمام پنوں کو 0 / *********** _____ *********** / میں شروع کریں
یہ ہمارے پچھلے ٹیوٹوریل کی طرح ہی ہے کیوں کہ ہم وہی ہارڈ ویئر استعمال کررہے ہیں۔ سوائے اس کے کہ ہم نے ایک اور بٹن کو بطور ان پٹ شامل کیا ہے۔ یہ لائن TRISB1 = 1 کے ذریعہ کیا جاتا ہے ۔
اگلا ، اندر لامحدود جبکہ لوپ میں ہمارے پاس کوڈ کے دو بلاکس ہیں۔ ایک استعمال کنندہ سے ٹائمر ان پٹ حاصل کرنے کے لئے استعمال کیا جاتا ہے اور دوسرا ایل ای ڈی پر تاخیر کے سلسلے کو انجام دینے کے لئے۔ میں نے ہر لائن کے خلاف تبصرے استعمال کرکے ان کی وضاحت کی ہے۔
جبکہ (1) {گنتی = 0؛ // مین لوپ میں ہوتے وقت ٹائمر نہ چلائیں // ******* صارف کی طرف سے نمبر میں تاخیر حاصل کریں **** ////// اگر (RB0 == 0 && پرچم == 0) // کب ان پٹ given get_scnds + = 1؛ // get_scnds = get_scnds + http: // اضافہ متغیر والا پرچم = 1؛ } if (RB0 == 1) // مسلسل بڑھنے والے پرچم کو روکنے کے لئے = 0؛ / *********** ______ *********** /
گیٹ اسکینڈز نامی متغیر کو ہر بار صارف کے بٹن کو دبانے پر اضافہ کیا جاتا ہے۔ جھنڈے (سافٹ ویئر کی وضاحت شدہ) متغیر کا استعمال بڑھنے کے عمل کو روکنے کے لئے کیا جاتا ہے جب تک کہ صارف اپنی انگلی کو بٹن سے نہیں ہٹاتا ہے۔
// ******* تاخیر کے ساتھ تسلسل پر عمل کریں **** ////// جبکہ (RB1 == 0) OR پورٹ = 0b00000001 <
اگلا بلاک عمل میں آجاتا ہے اگر بٹن دو دبا ہوا ہے۔ چونکہ صارف نے پہلے ہی بٹن کا استعمال کرتے ہوئے مطلوبہ وقت کی تاخیر کی وضاحت کی ہے اور اسے متغیر get_scnds میں محفوظ کردیا گیا ہے ۔ ہم ایک متغیر کا استعمال کرتے ہیں جسے hscnd کہتے ہیں ، اس متغیر کو ISR (مداخلت سروس روٹین) کے ذریعے کنٹرول کیا جاتا ہے۔
تسلسل سروس معمول کے مطابق ایک تسلسل ہر وقت Timer0 کناروں سے باہر ہے پکارا جائے گا کہ ہے. آئیے دیکھتے ہیں کہ اگلے بلاک میں یہ کس طرح آئی ایس آر کے ذریعہ کنٹرول کیا جارہا ہے ، جیسے ہم ہر بٹن پریس میں نصف سیکنڈ (0.5 سیکنڈ) کی تاخیر میں اضافہ کرنا چاہتے ہیں پھر ہمیں ہر آدھے سیکنڈ میں متغیر ایچ ایس سی این ڈی بڑھانے کی ضرورت ہے ۔ جیسا کہ ہم نے اپنے ٹائمر کو ہر 0.0019968s (ms 2ms) کے بہاؤ کے لئے پروگرام بنایا ہے ، لہذا آدھے نمبر گننے کے متغیر کی تعداد 250 ہونی چاہئے کیونکہ 250 * 2ms = 0.5 سیکنڈ۔ تو جب گنتی 250 (250 * 2ms = 0.5 سیکنڈ) ہوجاتی ہے ، اس کا مطلب یہ ہے کہ اس کا آدھا سیکنڈ ہو گیا ہے لہذا ہم hscnd میں 1 اضافہ کرتے ہیں اور گنتی کا آغاز صفر کرتے ہیں۔
باطل مداخلت ٹائمر_ آئسسر () {if (TMR0IF == 1) // ٹائمر پرچم ٹائمر اوور فلو کی وجہ سے متحرک ہوگیا ہے {TMR0 = 100؛ // ٹائمر کی قیمت لوڈ کریں TMR0IF = 0؛ // صاف ٹائمر مداخلت والے پرچم کی گنتی ++؛ } if (گنتی == 250) sc hscnd + = 1؛ // hscnd ہر آدھی سیکنڈ گنتی میں اضافہ ہوگا = 0؛ }
لہذا ہم اس قدر کو استعمال کرتے ہیں اور اسے اپنے hscnd سے موازنہ کرتے ہیں اور صارف کے متعین وقت کی بنیاد پر اپنی ایل ای ڈی شفٹ کرتے ہیں۔ یہ بھی آخری ٹیوٹوریل سے ملتا جلتا ہے۔
ہمارا پروگرام سمجھ اور کام کر رہا ہے۔
سرکٹ ڈایاگرام اور پروٹیوس تخروپن:
حسب معمول پہلے پروٹیوس کا استعمال کرتے ہوئے آؤٹ پٹ کی تصدیق کرنے دیتا ہے ، میں نے یہاں پرٹیوس کی اسکیمیٹک فائلوں کو لنک کیا ہے۔
ہمارے پچھلے ایل ای ڈی بورڈ میں ایک بٹن شامل کریں اور ہمارا ہارڈ ویئر تیار ہے۔ اسے کچھ اس طرح نظر آنا چاہئے:
کنکشن مکمل ہونے کے بعد ، کوڈ اپ لوڈ کریں اور آؤٹ پٹ کی تصدیق کریں۔ اگر آپ کو کوئی پریشانی ہے تو براہ کرم کمنٹس سیکشن کا استعمال کریں۔ پورے عمل کو سمجھنے کے لئے نیچے دیئے گئے ویڈیو کو بھی چیک کریں ۔