পিআইসি টিউটোরিয়াল- রেজিস্টার থেকে বিঘ্ন পর্যন্ত

সমস্যাগুলি দূর করার জন্য আমাদের উপকরণটি ব্যবহার করে দেখুন





পিআইসি প্রোগ্রামিংয়ের মিনিট বিশদে gettingোকার আগে কিছু ভাল প্রোগ্রামিং পদ্ধতি শেখা প্রথমত গুরুত্বপূর্ণ হবে।

নিবন্ধগুলি বোঝা

ধরুন আপনি প্রোগ্রামের যে কোনও জায়গায় একটি (সেমিকোলন) টাইপ করেন, এই সেমিকোলনের পরে আসা সমস্তই সংকলক দ্বারা উপেক্ষা করা হবে, অবশ্যই গাড়ি চালিয়ে যাওয়া পজিশনে না আসা পর্যন্ত।



উপরের বৈশিষ্ট্যটি আমাদের মতামত বা মন্তব্যগুলি যুক্ত করতে দেয় যাতে তারা প্রোগ্রামের অংশ না হয়ে তবুও আমাদের পাশে থাকা মন্তব্যের সাহায্যে প্রোগ্রামটি সনাক্ত করতে সহায়তা করে। কোনও আইসি প্রোগ্রাম করার সময় মন্তব্য করা একটি প্রস্তাবিত অনুশীলন।

কোর্সের পরবর্তী গুরুত্বপূর্ণ বিষয়টি হল বিভিন্ন ধ্রুবকের নাম নির্ধারণ করা (আপনি পরে এগুলি বিস্তারিতভাবে শিখতে পারবেন)। অন্তর্ভুক্ত সংখ্যার সাথে বিভ্রান্ত হওয়ার পরিবর্তে এই লিখিতকরণটি কীভাবে লিখিত হচ্ছে বা জড়িত মানগুলি সম্পর্কে তা বোঝা সহজ করে তোলে।



তাত্ক্ষণিক স্বীকৃতির জন্য উপরেরগুলি অবশ্যই প্রকৃত নামগুলির আকারে করা উচিত, উদাহরণস্বরূপ COUNT, এটি লক্ষ করা গুরুত্বপূর্ণ যে এখানে সমস্ত মূল অক্ষর এটি আলাদা করার জন্য নিযুক্ত করা হয় এবং এটি স্থির মান হিসাবেও নির্দেশ করে।


যেমন আমরা দেখতে পাচ্ছি, উপরেরটি সেমিকোলন দিয়ে তৈরি একটি বক্স আকারে সম্পন্ন হয়েছে এটি কেবল এটি আরও পরিষ্কার দেখায়। পাশাপাশি কাগজে প্রোগ্রামটি নথিভুক্ত করার চেষ্টা করুন, এই অনুশীলনটি ধাপে ধাপে পদ্ধতিতে জিনিসগুলি বুঝতে সাহায্য করবে।

2. নিবন্ধ।

পিআইসির মধ্যে নিবন্ধভুক্তি এমন একটি অঞ্চল যা লিখিত বিবরণ গ্রহণ করে পাশাপাশি এটি পড়ার অনুমতি দেয়। আপনি এটিকে কাগজের শীটের সাথে তুলনা করতে পারেন যেখানে আপনি বিষয়বস্তুগুলিকে ভিজ্যুয়ালাইজ করতে পারেন এবং এটিতে লিখে লিখে যোগ করতে পারেন।

নীচের চিত্রটি একটি সাধারণ রেজিস্টার ফাইল মানচিত্রকে একটি PIC16F84 এর মধ্যে এমবেড করা চিত্রিত করে। ফর্ম্যাটটি এমন কিছু নয় যা আসলে পিআইসির অভ্যন্তরে সেট করা থাকে, এটি কেবল চিপের ভিতরে কীভাবে বিটগুলি সাজানো হতে পারে তা বোঝানো এবং জড়িত কমান্ডগুলির কয়েকটি বোঝার জন্য to

আপনি দেখতে পাচ্ছেন যে এটি মূলত ব্যাংক 0 এবং ব্যাঙ্ক 1 এ বিভক্ত রয়েছে। পিআইসির প্রকৃত কাজটি নিয়ন্ত্রণের জন্য ব্যাংক 1 দায়বদ্ধ, উদাহরণস্বরূপ এটি পিককে বলে যা পোর্ট এ-তে বিটগুলি ইনপুট হিসাবে নির্ধারিত হয় এবং যা আউটপুট হিসাবে নির্ধারিত হয়।

ব্যাংক 2 কেবল তথ্যটি পরিচালনা করার জন্য।

আসুন নিম্নলিখিত উদাহরণের মাধ্যমে এটি বুঝতে পারি:

মনে করুন আমরা পোর্টএ হাইতে কিছুটা নির্ধারণ করতে চাই। এর জন্য আমাদের প্রথমে একটি আউটপুট আকারে পোর্ট এ এ নির্দিষ্ট বিট বা পিন সেট করার জন্য প্রথমে ব্যাংক 1 এ যেতে হবে। এর পরে আমরা ব্যাঙ্ক 0 এ ফিরে আসি এবং সেই নির্দিষ্ট পিনটিতে একটি যুক্তি 1 (বিট 1) সরবরাহ করি।

ব্যাঙ্ক ১-এ আমরা সবচেয়ে সাধারণ যে রেজিস্টারগুলি ব্যবহার করতে পছন্দ করি সেগুলি হ'ল স্ট্যাটাস, ট্রাইসা এবং ট্রাইসবি।

স্ট্যাটাস আমাদের ব্যাঙ্ক 0 এ ফিরে যেতে সহায়তা করে, পোর্ট এ-তে কোন পিনগুলি আউটপুট এবং কোনটি ইনপুট হতে পারে তা বেছে নিতে ট্রাইসা আমাদের অনুমতি দেয়, যখন ট্রাইসবি পোর্ট বিতে আউটপুট এবং ইনপুট পিনের মধ্যে নির্বাচন করতে সহায়তা করে। ব্যাংক 0 তে নির্বাচন করুন নিবন্ধটি ব্যবহারকারীকে অনুমতি দেয় ব্যাংক 1 এ ফ্লিপ করতে।

আসুন নীচের বর্ণনার সাথে পুরো ধারণাটি সংক্ষেপিত করুন:

পরিস্থিতি:

ব্যাংক 0 থেকে 1 ব্যাঙ্কে স্যুইচ করার জন্য আমরা স্ট্যাটাস রেজিস্টারকে আদেশ করি। এটি স্ট্যাটাস রেজিস্টারের বিট # 5 স্থাপন করে 1 এ প্রয়োগ করা হয়। ব্যাংক 0 এ ফিরে আসার জন্য, আমরা স্ট্যাটাস রেজিস্টারের বিট 5 নির্ধারণ করি 0 তে। স্ট্যাটাস রেজিস্টারটি 03h ঠিকানায় অবস্থিত, এখানে এইচটি সংখ্যার উল্লেখ করে হেক্সাডেসিমালে থাকতে পারে।

ট্রিসা এবং ট্রিসবি:

এগুলি 85h এবং 86h ঠিকানায় ঠিকানায় অবস্থিত। আউটপুট বা একটি ইনপুট হিসাবে পিন প্রোগ্রাম করার জন্য, আমরা কেবলমাত্র শূন্য বা একটি একটি নির্দিষ্ট বিটকে রেজিস্টারে সরবরাহ করি। এখন এটি বাইনারি বা হেক্সের মাধ্যমে দুটি উপায়ে করা যেতে পারে। যদি কেউ পরামিতি রূপান্তর করতে অক্ষম হয় তবে সে মানগুলি বাস্তবায়নের জন্য কোনও বৈজ্ঞানিক ক্যালকুলেটরের কাছে যেতে পারে।

এখন আমাদের পোর্ট এ-তে 5 টি পিন রয়েছে যা 5 টি পিনের সাথে সমান। যদি আমরা পিনগুলির মধ্যে একটিকে ইনপুট হিসাবে ঠিক করতে চাই, আমরা নির্দিষ্ট বিটকে একটি '1' সরবরাহ করি।

যদি আমরা পিনগুলির মধ্যে একটিকে আউটপুট হিসাবে বরাদ্দ করতে চেয়েছিলাম তবে আমরা নির্দিষ্ট পিনটি '0' তে সেট করব। বিটগুলি বিটগুলির সাথে যথাযথভাবে সহায়তা করে বা আরও সুনির্দিষ্ট বিট 0 হয় আরএ 0, বিট 1 হবে আরএ 1, বিট 2 = আর 2 এবং আরও অনেক কিছু। আসুন এটি এইভাবে বুঝতে পারি:

ধরুন আপনি RA0, RA3 এবং RA4 কে আউটপুট হিসাবে ঠিক করতে চান, আর RA1 / RA2 আই / PS হিসাবে, আপনি 00110 (06 ঘন্টা) প্রেরণ করে এটি করবেন। এখানে উল্লিখিত হিসাবে বিট 0 ডান দিকে হয় দেখুন:

পোর্ট এ পিন RA4 RA3 RA2 RA1 RA0

বিট সংখ্যা 4 3 2 1 0

বাইনারি 0 0 1 1 0

একই অবস্থা টিআরআইএসবির ক্ষেত্রেও।

পোর্টা এবং পোর্টটিবি

একটি আউটপুট পিন উচ্চতর ডাইভার করার জন্য, আমরা কেবল আমাদের পোর্টা বা পোর্টটিবি রেজিস্টারে স্বতন্ত্র বিটকে একটি '1' অফার করি। ট্রাইসা এবং ট্রিসবি রেজিস্টারের জন্যও একটি অভিন্ন প্রক্রিয়া অনুসরণ করা যেতে পারে our আমরা আমাদের প্রথম উদাহরণের কোডিংয়ের গতি বাড়ানোর আগে, কেবলমাত্র আরও রেজিস্ট্রিগুলির একটি কোপ বুঝতে পারি, যেমন: ডাব্লু এবং এফ।

ডাব্লু এবং এফ

ডাব্লু রেজিস্টার একটি সাধারণ নিবন্ধ যা আপনাকে আপনার পছন্দের কোনও মান নির্ধারণ করতে সক্ষম করে। আপনি ডাব্লুতে কোনও মাত্রা নির্ধারণ করার সাথে সাথে আপনি এটিকে অন্য কোনও মানতে যুক্ত করে বা এটিকে সরাতে পারেন। নির্ধারিত অন্য মান সহ, বিশদগুলি কেবল ডাব্লু-র উপরে ওভাররাইট করা হয় assigned

এফ রেজিস্টার তার লিখিত বিষয়টি একটি রেজিস্টারে প্রেরণ করে। আমাদের কোনও রেজিস্টারের চেয়ে একটি মান নির্ধারণের জন্য এই এফ রেজিস্টারের প্রয়োজন হবে, এটি স্ট্যাটাস বা ট্রিসা রেজিস্টারগুলির ওপরে হতে পারে, কারণ এগুলি আমাদের সরাসরি মানগুলি তাদের উপরে রাখার অনুমতি দেয় না। একটি উদাহরণ প্রোগ্রাম

আসুন নীচের উদাহরণ কোডটি যাচাই করি যা আমাদের দেখায় যে উপরের নির্দেশাবলী কীভাবে প্রয়োগ করা হয় এবং কোর্সের কয়েকটি নির্দেশাবলীর সাক্ষ্যও পেতে পারি।

উপরের আলোচনা অনুসারে পোর্ট এ ঠিক করে শুরু করা যাক।

এর জন্য আমাদের ব্যাংক 0 থেকে Bank1 এ স্থানান্তরিত করা দরকার, এটি 03h ঠিকানায় অবস্থিত STATUS রেজিস্টার স্থাপন করে সম্পন্ন করা হবে, বিট 5 থেকে 1।

বিএসএফ 03 ঘন্টা, 5

বিএসএফ মানে বিট সেট এফ। আমরা এই নির্দেশের পরে দুটি সংখ্যা ব্যবহার করছি - 03 ঘন্টা, যা স্ট্যাটাস রেজিস্ট্রারের ঠিকানা এবং বিট সংখ্যার সাথে মিলে 5 নম্বর।

সুতরাং, আমরা যা বলছি তা হ'ল '03h থেকে 1 ঠিকানায় বিট 5 সেট করুন'।

আমরা এখন ব্যাংক 1 এ আছি।

MOVLW 00110 বি

আমরা বাইনারি মান 00110 (চিঠি খ মানে সংখ্যাটি বাইনারি হয়) আমাদের সাধারণ উদ্দেশ্যে রেজিস্ট্রারে রেখে দিচ্ছি আমি অবশ্যই এটি হেক্সে করতে পারতাম, এই ক্ষেত্রে আমাদের নির্দেশটি হ'ল:

MOVLW 06 ঘন্টা

হয় কাজ করে। এমওভিএলডাব্লু এর অর্থ হচ্ছে ‘সরান আক্ষরিক মান ডাব্লু ডাব্লু’, যা ইংরেজী অর্থ হ'ল মানটি ডাব্লু রেজিস্টারে সরাসরি রেখে দেয়।

পোর্টটি স্থাপনের জন্য আমাদের এখন এই মূল্যটি আমাদের ট্রায়াসা রেজিস্টারে রেখে দেওয়া দরকার:

MOVWF 85 ঘন্টা

এই নির্দেশনাটি নির্দেশ করে যে 'W এর সূচিগুলি নিবন্ধের ঠিকানায় অনুসরণ করা হয়', এই উদাহরণটিতে ঠিকানাটি ট্রায়াসাকে বোঝায়।

আমাদের ট্রাইসা রেজিস্টার এই মুহুর্তে 00110 চিত্রটি বহন করে বা গ্রাফিকালি উপস্থাপিত হয়েছে:

পোর্ট এ পিন RA4 RA3 RA2 RA1 RA0

বাইনারি 0 0 1 1 0

ইনপুট / আউটপুট হে ও আমি আই

সুতরাং এখন আমাদের পোর্ট এ পিন রয়েছে, তথ্যের একটি সমন্বিত করতে আমাদের অবশ্যই ব্যাংক 0 এ ফিরে আসতে হবে।

বিসিএফ 03 ঘন্টা, 5

এই নির্দেশনাটি বিএসএফের বিপরীত সাধন করে। এটি 'বিট ক্লিয়ার এফ' বোঝায়। সংখ্যার একজোড়া যা সম্পর্কিত তা হ'ল নিবন্ধকের ঠিকানা, এখানে স্ট্যাটাস রেজিস্টার, পাশাপাশি বিট ফিগার, এই উদাহরণে বিট পাঁচটি। আমরা বর্তমানে ঠিক কীটি সম্পন্ন করেছি তা হ'ল আমাদের উপর নির্ধারিত পাঁচ বিট

পরিস্থিতি 0 এ রেজিস্টার

আমরা এই সময়ে ব্যাংক 0 এ ফিরে এসেছি।
নীচে একটি ব্লকের সমস্ত কোড রয়েছে:

BSF 03h, 5 ব্যাঙ্কে যান 1
MOVLW 06 ঘন্টা 00110 ডাব্লুতে রাখুন
মুভিডব্লুএফ 85 ঘন্টা 00110 ট্রিসার দিকে সরান
বিসিএফ 03 ঘন্টা, 5 ফিরে আসুন 0 ব্যাঙ্কে

শেষ নির্দেশের মধ্যে, আমরা আপনাকে পিকের আইও পোর্ট পিনগুলি সম্ভবত ইনপুট বা আউটপুট স্থাপনের উপায়টি নিশ্চিত করেছি।

এই কোর্সের মাধ্যমে, আমি আপনাকে বন্দরগুলিতে ডেটা প্রেরণে সহায়তা করি।

পোর্টগুলিতে ডেটা প্রেরণ করা হচ্ছে

পরবর্তী টিউটোরিয়ালে, আমরা একটি এলইডি ফ্ল্যাশ করে সম্পূর্ণ করতে যাচ্ছি যা একটি সম্পূর্ণ প্রোগ্রামের বিবরণ এবং একটি সোজা সার্কিট ডায়াগ্রাম সমন্বিত করে যাতে আপনি পিকটি দেখতে পাবেন যে আমরা এটি প্রত্যাশা করেছিলাম ঠিক সেভাবে সম্পাদন করছে।

নীচের ফলাফলগুলির সাথে একসাথে রাখার এবং আপনার পিআইসি প্রোগ্রাম করার চেষ্টা করবেন না, কারণ সেগুলি কেবল চিত্রণ illust প্রাথমিকভাবে, আমরা একটি আউটপুট হিসাবে পোর্ট এ বিট 2 স্থাপন করব:

এটি পূর্ববর্তী নির্দেশাবলী থেকে সনাক্তযোগ্য হতে পারে। একমাত্র পার্থক্য হতে পারে আমরা ত্রি-রাষ্ট্রীয় রেজিস্টারে 0 ঘন্টা সরবরাহ করে আউটপুট হিসাবে পিনের প্রতিটি বিট স্থির করেছি। সুতরাং এখন তাকে যা করতে হবে তা হল একটি এলইডি চালু করুন।

আমরা পিনগুলির মধ্যে একটি (এর সাথে যুক্ত এলইডিযুক্ত একটি) উচ্চ নির্ধারিত করে এটি সম্পন্ন করি। এটি অন্যভাবে বলতে, আমরা পিনে একটি ‘1’ প্রয়োগ করি। এটি ঠিক কীভাবে পরিচালিত হয় (প্রতিটি লাইনের জন্য একটি স্পষ্টতার জন্য মন্তব্যগুলি পর্যবেক্ষণ করুন):

অতএব, এখন আমরা যা অর্জন করেছি তা হ'ল এক সময় বন্ধ করার পরে LED স্যুইচ করা। আমরা যা ইচ্ছা করি তা হল পরবর্তীতে অবিচ্ছিন্নভাবে LED চালু হওয়ার জন্য।

আমরা শুরুতে ফিরে আসার জন্য প্রোগ্রামটি অর্জন করে এটি অর্জন করি। আমরা প্রথমে আমাদের প্রোগ্রামের শুরুতে একটি ট্যাগ স্থাপন করে এটি সম্পাদন করি, তারপরে প্রোগ্রামটি সেখানে ফিরে যাওয়ার জন্য অবহিত করে। আমরা বেশ সহজভাবে একটি ট্যাগ নির্দিষ্ট।

আমরা একটি টার্মে কী করি, START বলুন, পরবর্তী কোডটি টাইপ করুন:

প্রদর্শিত হিসাবে, আমরা প্রাথমিকভাবে প্রোগ্রামের শুরুতে অবিলম্বে 'শুরু' অভিব্যক্তিটি উল্লেখ করেছি।

এরপরে, প্রোগ্রামটির একেবারে শেষে আমরা স্পষ্টভাবে ‘গোটো স্টার্ট’ উল্লেখ করেছি। ‘গোটো’ নির্দেশনা যা ঘোষণা করে ঠিক তা সম্পাদন করে।

এই প্রোগ্রামটি যখনই আমরা সার্কিটটিকে শক্তি প্রদান করি, যখনই আমরা বিদ্যুৎ সরিয়ে ফেলি তখন অফ স্যুইচ অফ রাখার প্রবণতাটি ধারাবাহিকভাবে LED চালু এবং বন্ধ করে দেবে। আমাদের আবারও আমাদের প্রোগ্রামটি পরীক্ষা করা উচিত:

অবশ্যই আমরা মন্তব্যগুলি বাদ দিয়েছি, তবে আমরা এখনও নির্দেশাবলী এবং সংখ্যাগুলি পর্যবেক্ষণ করতে পারি।

আপনি প্রোগ্রামটির সমস্যা সমাধানের চেষ্টা করার পরে এবং কোডটি লেখার সময় আপনি ঠিকানার সমস্ত মুখস্ত করে রেখেছেন এটি পরে কিছুটা বিস্মিত হতে পারে।

যদিও মন্তব্যগুলি এখনও রাখা যেতে পারে এটি কিছুটা বিশৃঙ্খলা হতে পারে। এর জন্য সংখ্যার নামকরণের প্রয়োজন হবে এবং এটি একটি অতিরিক্ত নির্দেশ দ্বারা সম্পন্ন হতে পারে: 'সম' সমান 'নির্দেশ' পরামর্শ দেয় যে কিছু জিনিস অন্য জিনিসগুলির সমান হতে পারে।

এটি পিআইসি-র জন্য নির্দেশিকা নয়, বরং সমাবেশকারীর জন্য হতে পারে। এই নির্দেশিকাটি নিবন্ধের ঠিকানা অবস্থানের জন্য নাম নির্ধারণ, বা প্রোগ্রামিং শব্দটির ধ্রুবককে সহায়তা করে।

আমরা আমাদের প্রোগ্রামের জন্য কয়েকটি ধ্রুবক প্রতিষ্ঠা করব এবং এটি প্রোগ্রামটি কতটা সহজভাবে পড়ছে তাও প্রত্যক্ষ করব।

এখন থেকে আমরা আমাদের প্রোগ্রামে সেট আপ করে যে ধ্রুবক মানগুলি স্থির করতে পারি তা স্থির করেছি। ধ্রুবক মানগুলি ব্যবহার করার আগে তাদের মনোনীত করতে হবে।

সুতরাং প্রোগ্রামের শুরুতে সর্বদা তাদের অবস্থান নিশ্চিত করে নিন। পূর্বের লেবেলটিকে সর্বশেষের সাথে তুলনা করার জন্য আমরা আবার মন্তব্যগুলি বাদ দিয়ে প্রোগ্রামটি পুনরায় লিখব।

আপনি লক্ষ্য করতে সক্ষম হবেন যে ধ্রুবকরা প্রোগ্রামটি কিছুটা সহজতর বোঝার সক্ষম করছে, তবে আমরা এখনও কোনও মন্তব্য ছাড়াই আছি, কোনও উদ্বেগ নেই, যেহেতু আমরা এখনও শেষ করেছি না।

আমাদের ফ্ল্যাশিং এলইডি প্রোগ্রামের একটি ছোট্ট ডাউনসাইড হতে পারে।
প্রতিটি নির্দেশের সমাপ্তির জন্য 1 ঘড়ির ক্রম প্রয়োজন। যদি আমরা 4MHz স্ফটিক ব্যবহার করি, তবে প্রতিটি নির্দেশ সমাপ্তির জন্য 1 / 4MHz, বা 1uS কল করে।

যেহেতু আমরা মাত্র পাঁচটি নির্দেশিকা নিযুক্ত করেছি, তাই এলইডি তখন 5 ইউএস-এ সক্রিয় হবে। এটি লোকেদের খেয়াল করার জন্য খুব দ্রুত হতে পারে, তদতিরিক্ত, মনে হবে LED পুরোপুরি চালু আছে is

পরিবর্তে আমাদের যা করা উচিত তা হ'ল এলইডি স্যুইচ করা এবং এলইডি বন্ধ করার মধ্যে একটি বাধা সৃষ্টি করে। বাধাটির তত্ত্বটি হ'ল আমরা আগের পরিমাণ থেকে গুণতে থাকি, সুতরাং এটি যখন শূন্য হয় তখন আমরা গণনা ছাড়ি।

শূন্য মানটি বিলম্বের উপসংহারকে বোঝায় এবং আমরা পুরো প্রক্রিয়া জুড়ে আমাদের প্রক্রিয়াটি চালিয়ে যাচ্ছি। সুতরাং, প্রথমত আমাদের অবশ্যই হ'ল আমাদের কাউন্টার হিসাবে ব্যবহার করার জন্য একটি ধ্রুবক নির্ধারণ করা।

আসুন আমরা এই ধ্রুবক COUNT টি শব্দ করি। এর পরে, আমাদের অবশ্যই নির্ধারণ করতে হবে যে কোনও সংখ্যা থেকে গণনা শুরু করা কতটা তাৎপর্যপূর্ণ। অবশ্যই, আমরা অন্তর্ভুক্ত করতে পারি সবচেয়ে বড় চিত্র 255, বা হেক্সে এফএফএইচ। আমি আগের টিউটোরিয়ালে যেমন কথা বলেছিলাম, সমীকরণ নির্দেশিকা একটি রেজিস্টার পরিস্থিতিতে একটি অভিব্যক্তি নির্ধারণ করে।

এর থেকে বোঝা যায় যে আমরা আমাদের COUNT কী পরিমাণ পরিমাণ বরাদ্দ করি না কেন এটি কোনও নিবন্ধকের আইটেমের সাথে মিলবে। আমরা যদি FFh মান নির্ধারণ করার চেষ্টা করি তবে প্রোগ্রামটি সংকলন করার পরে আমরা একটি ভুল পেতে যাচ্ছি।

এফএফএইচ অবস্থানের কারণ হ'ল তাই আমরা এতে অ্যাক্সেস অর্জন করতে পারি না। সুতরাং, আমরা কীভাবে একটি আসল সংখ্যা নির্ধারণ করব? অবশ্যই এটির জন্য স্বল্প পরিমাণে পার্শ্বীয় চিন্তাভাবনার প্রয়োজন হবে।

উদাহরণস্বরূপ যদি আমরা আমাদের COUNT টি ঠিকানা 8h নাম্বারে নির্দিষ্ট করে থাকি তবে এটি একটি মৌলিক উদ্দেশ্য নিবন্ধের গন্তব্য নির্দেশ করে। ডিফল্টরূপে, অচ্ছুত অঞ্চলগুলি FFh এ সেট করা আছে। ফলস্বরূপ, যদি COUNT টি 08 ঘন্টা বাড়ে, আপনি প্রথম শক্তি প্রয়োগ করার সময় আপনি এফএফএটির মানটির মুখোমুখি হবেন। তবুও, আমি আপনি, আমরা কীভাবে অন্য কোনও সংখ্যায় COUNT স্থির করতে পারি? আমরা যা প্রয়োগ করি তা হ'ল প্রথমে এই গন্তব্যের মূল্যায়ন ‘

একটি উদাহরণ হিসাবে ধরা যাক, আমরা COUNT এর 85 হ'ল মান অর্জনের ইচ্ছা পোষণ করেছি, আমরা COUNT সম 85 hh উল্লেখ করতে পারি না কারণ পোর্ট এ এর ​​জন্য ট্রাই-স্টেট রেজিস্ট্রারের অবস্থান হ'ল আমরা যা অর্জন করি তা হ'ল: মুভল 85h ফার্স্ট পুট ডাব্লু রেজিস্টার মুভউফ 08 ঘন্টা 85h এর মান

এখন আমাদের 08 ঘন্টা রেজিস্টার এ সরান। এরপরে, আমরা যদি COUNT সম 08 ঘন্টা প্রকাশ করি তবে COUNT মান 85h এর সাথে মেলে। নাজুক, তাই না! অতএব, শুরুতে আমরা আমাদের ধ্রুবকটি নির্ধারণ করি: COUNT = 08 ঘন্টা অনুসরণ করে আমাদের অবশ্যই এই COUNT টি হ্রাস করতে হবে যতক্ষণ না এটি শূন্য হয়।

এটি কেবল তাই ঘটে যে আমাদের জন্য এটি সম্পাদন করার জন্য ডিজাইন করা একটি নির্দেশ রয়েছে, একটি 'গোটো' এবং একটি ট্যাগ ব্যবহার করে।

আমরা যে নির্দেশনাটি প্রয়োগ করতে যাচ্ছি তা হ'ল: ডিসেকফিজ COUNT, 1 এই নির্দেশিকায় বলা হয়েছে যে 'কমাটি ট্র্যাক করে এমন নম্বর দ্বারা নিবন্ধকে (এটি এখানে COUNT) হ্রাস করুন। যদি আমরা শূন্যতা অর্জন করি, তবে দুটি দাগ এগিয়ে রাখুন ’’ এটি আমাদের কোর্সে রাখার আগে প্রথমে এটি কার্যকরভাবে খুঁজে পাওয়া যাক।

আমরা যা সম্পাদন করেছি তা প্রথমদিকে আমাদের ধ্রুবক COUNT থেকে 255 টি প্রতিষ্ঠিত করে The পরবর্তী বিভাগটি একটি ট্যাগ রাখে, যার নাম ল্যাপেল আমাদের ডিক্সফজ নির্দেশের কাছাকাছি।

ডিক্সফিজ COUNT, 1 COUNT এর মান এক করে কমিয়ে দেয় এবং শেষ ফলাফলটি সরাসরি COUNT এ ধরে রাখে। তাছাড়া এটি COUNT টির 0 টির মান আছে কিনা তা যাচাই করে তা যাচাই করে।

যদি এটি না হয়, তবে এটি ক্ষেত্রে প্রোগ্রামটিকে পরবর্তী লাইনে স্থানান্তরিত করতে ট্রিগার করে। এখন আমাদের একটি 'গোটো' ঘোষণা আছে যা আমাদের ডিকফেস নির্দেশে ফিরিয়ে দেয়।

যদি COUNT এর মান সমান পারফর্ম করে, তবে ডিক্সফজ নির্দেশনাটি আমাদের প্রোগ্রামে 2 টি স্পট এগিয়ে নিয়ে যায় এবং যেখানে আমরা এখানে 'ক্যারি অন' দাবি করেছি সেখানে প্রেরণ করা হয়।

সুতরাং, যেহেতু আপনি পর্যবেক্ষণ করতে পারেন, আমরা এগিয়ে যাওয়ার আগে একটি পূর্বনির্ধারিত সময়ের জন্য এক জায়গায় বসে প্রোগ্রামটি নিয়ে এসেছি। এটি একটি বিলম্ব লুপ নামকরণ করা যেতে পারে।

বিলম্বের লুপগুলি বোঝা

আমাদের যদি আরও বেশি বিলম্বের প্রয়োজন হয় তবে আমরা পরবর্তী সময়ে একটি লুপ অনুসরণ করতে পারি। অতিরিক্ত লুপগুলি, বিলম্ব বাড়িয়েছে। আসুন আমরা কমপক্ষে দু'এই ধরে নিই আমরা এলইডি ফ্ল্যাশটি পর্যবেক্ষণ করতে চাই .. আমরা এই প্রোগ্রামে এই বিলম্বের লুপগুলি রাখব এবং মন্তব্যগুলি প্রবর্তন করে একটি আসল প্রোগ্রামটি উপস্থাপন করে এটি সম্পাদন করব:

কোন প্রোগ্রামের পরে পিআইসি এই প্রোগ্রামটি সংকলন করা সম্ভব। স্পষ্টতই, নিশ্চিত হয়ে নিন যে আপনি সার্কিটটি সত্যই কার্যকরভাবে কাজ করে কিনা তা পরীক্ষা করে দেখার চেষ্টা করে। নীচে একটি সার্কিট ডায়াগ্রাম যা আপনি পিআইসি প্রোগ্রাম করার সাথে সাথেই তৈরি করা উচিত।


ভাল, আপনি আসলে আপনার প্রথম পিক প্রোগ্রাম রচনা করতে পারেন, পাশাপাশি একটি এলইডি জ্বলতে বা বন্ধ করতে একটি সার্কিট তৈরি করেছিলেন। এখন অবধি, আপনি যদি এই কোর্সগুলি অনুসরণ করে থাকেন, তবে আপনি সম্ভবত 35 টির মধ্যে মোট সাতটি নির্দেশিকা শিখতে পেরেছেন, তবে সন্দেহ নেই যে আপনি এখন পর্যন্ত আই / ও বন্দরগুলি নিয়ন্ত্রণ করছেন!

আপনি কি দ্রুত এলইডি ফ্ল্যাশ রেন্ডার করতে বিলম্বের লুপগুলি পরিবর্তন করার চেষ্টা করবেন - মূলত এলইডি ফ্ল্যাশটি দেখার জন্য COUNT এর ন্যূনতম মানটি কী দেখাবে? অথবা হতে পারে, আপনি LED ডাউন স্থিতিশীল করতে প্রাথমিকের পরে 3 য় বা পরিপূরক বিলম্ব লুপগুলি অন্তর্ভুক্ত করতে চাইবেন। প্রতিটি বিলম্ব লুপ জন্য একটি অনন্য ধ্রুবক।

আপনি সম্ভবত সম্ভবত আপনার নির্দিষ্ট বিলম্বের সাথে একটি নির্দিষ্ট গতিতে এলইডি ফ্ল্যাশ রেন্ডার করতে আপনার বিলম্বের লুপগুলি নিয়ে বেড়াতে পারেন, উদাহরণস্বরূপ এক সেকেন্ডের পরে। পরবর্তী নির্দেশিকাগুলির মধ্যে আসুন আমরা দেখি কীভাবে আমরা প্রোগ্রামটি কমপ্যাক্ট এবং বুনিয়াদি বজায় রাখতে সাবরুটিন হিসাবে পরিচিত কিছুটি ব্যবহার করতে সক্ষম হলাম একটি সাব্রুটাইন কোড বা প্রোগ্রামের একটি অবিচ্ছেদ্য অঙ্গ, যা আপনাকে যখন প্রয়োজন হতে পারে এবং উল্লেখ করা যেতে পারে। আপনি ঘন ঘন অভিন্ন ফাংশনটি সম্পাদন করছেন এমন ক্ষেত্রে সাবরুটাইনগুলি নিযুক্ত করা হয়।

সাবরুটাইনস কি কি

সাবরুটিন নিয়োগের সুবিধাগুলি হ'ল আপনার প্রোগ্রামের মাধ্যমে দশবারের পরিবর্তে সাব্রুটিনের অভ্যন্তরে একবার মানটি সংশোধন করা সহজতর হবে, পাশাপাশি এটি আপনার প্রোগ্রামটির অভ্যন্তরে মেমরির মাত্রা হ্রাস করতে ব্যাপক অবদান রাখে পিক আমরা একটি সাবরুটিন পরীক্ষা করব:

প্রাথমিকভাবে, আমাদের আমাদের সাবট্রিনকে একটি উপাধি সরবরাহ করা দরকার এবং এই পরিস্থিতিতে আমরা রুটিন নির্বাচন করেছি। আমরা সেই কোডটি পরে টাইপ করি যা আমরা স্বাভাবিক হিসাবে পরিচালনা করতে চাই। সে কারণেই, আমরা আমাদের ফ্ল্যাশিং নেতৃত্বাধীন প্রোগ্রামের বিলম্বটি নির্বাচন করেছি। শেষ অবধি, আমরা রিটার্ন নির্দেশকে চাবি দিয়ে সাবট্রিনটি শেষ করি।

আমাদের প্রোগ্রামের যে কোনও জায়গা থেকে সাব্রোটিন শুরু করতে, আমরা দ্রুত নির্দেশটি CALL এবং তারপরে সাবরুটাইন উপাধি টাইপ করি।

আমরা এটিকে আরও একটু গভীরতার সাথে বিবেচনা করব। একবার আমরা আমাদের প্রোগ্রামের অংশে পৌঁছলাম যে কল xXX, যার মধ্যে xxx আমাদের সাব্রোটিনের নাম, প্রোগ্রামটি যে কোনও জায়গায় সাব্রুটিন এক্সএক্সএক্স ইনস্টল হয়ে গেছে le সাবরুটিনের ভিতরে নির্দেশাবলী সম্পন্ন করা হয়।

যখনই নির্দেশটি রিটার্ন সম্পন্ন হয়, প্রোগ্রামটি আমাদের মূল প্রোগ্রামে ফিরে আসে আমাদের কল এক্সএক্সএক্সএক্স নির্দেশের পরবর্তী নির্দেশে।

আপনার ইচ্ছামতো অনুরূপ সাবরুটিনকে কয়েকবার কল করা সম্ভব, যা ব্যাখ্যা করে যে সাব্রোটাইনগুলি কেন আমাদের প্রোগ্রামের সাধারণ সময়কালে কমিয়ে দেয়।

তবুও, আপনার কয়েকটি কারণ সম্পর্কে জানা উচিত। প্রাথমিকভাবে, আমাদের মূল প্রোগ্রাম হিসাবে, কোনও নির্দিষ্ট ধ্রুবকগুলি সেগুলি ব্যবহারের আগে আপনাকে স্বীকার করা দরকার।

এগুলি সম্ভবত সাবউটিনের মধ্যেই বা সরাসরি মূল প্রোগ্রামের শুরুতে স্বীকৃত হতে পারে। আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি আপনার মূল প্রোগ্রামের শুরুতে সমস্ত কিছু স্বীকার করেছেন, তারপরে আপনি বুঝতে পেরেছেন যে জিনিসগুলি একটি অভিন্ন অবস্থানে রয়েছে। এর পরে, একটিকে অবশ্যই নিশ্চিত করা উচিত যে মূল প্রোগ্রামটি সাব্রোটিনের উপরে চলে যায়।

আমি এর সাথে যা বোঝাতে চাই তা হ'ল আপনি আপনার প্রাথমিক প্রোগ্রামটির উপসংহারে সরাসরি সাব্রোটিন স্থাপন করা উচিত, যদি আপনি সাবোট্রিনটি যেখানে থাকুন সেখান থেকে লাফানোর জন্য 'গোটো' ঘোষণা ব্যবহার না করেন, প্রোগ্রামটি চলতে থাকবে এবং সাব্রোটিন বাস্তবায়ন করবে আপনি নির্বিশেষে আপনি এটি অন্যথায় প্রয়োজন।

পিআইসি একটি সাবরুটিন এবং প্রধান প্রোগ্রামের মধ্যে পার্থক্য করবে না। আমরা আমাদের ফ্ল্যাশিং নেতৃত্বাধীন প্রোগ্রামটি যাচাই করব, তবে এবার আমরা বিলম্বের লুপের জন্য সাবরুটিন ব্যবহার করতে যাচ্ছি। আদর্শভাবে, আপনি আবিষ্কার করবেন যে প্রোগ্রামটি কত কম জটিল দেখা যাচ্ছে, পাশাপাশি আপনি কীভাবে সাবউরটিন ব্যবহারিকভাবে প্রয়োগ করবেন তা আবিষ্কার করতে পারেন।

অবশেষে, আপনি পর্যবেক্ষণ করতে পারেন যে আমাদের বিলম্বের লুপের জন্য সাব্রোটিন ব্যবহার করে আমরা প্রোগ্রামটির মাত্রাগুলি হ্রাস করতে পারি।

যতবারই আমরা বিলম্বের ইচ্ছা করি, সম্ভবত যখন এলইডি চালু থাকে বা বন্ধ থাকে, আমরা মূলত বিলম্বটিকে সাব্রুটিন বলে থাকি। সাবরুটিনের শেষে, প্রোগ্রামটি আমাদের ‘কল’ নির্দেশের পরে লাইনে ফিরে যায়। উপরের চিত্রটিতে আমরা এলইডি ফ্লিপ করি।

আমরা তারপরে সাবরুটিনের সাথে যোগাযোগ করি। প্রোগ্রামটি আবার ফিরে আসে যাতে আমরা এলইডিটি বন্ধ করে দিতে পারি। আমরা সাবউরটিনকে আরও একবার কল করি, কেবল সাব্রোটিনটি সম্পন্ন হতে পারে, প্রোগ্রামটি ফিরে আসে এবং পরবর্তী নির্দেশগুলি এটি স্বীকৃত হয় 'গোটো স্টার্ট' ’ যে কেউ আগ্রহী হতে পারে, আমাদের প্রথম প্রোগ্রামটি ছিল 120 ​​বাইট দীর্ঘ।

সাবরুটাইন ব্যবহারের মাধ্যমে আমরা আমাদের প্রোগ্রামের আকারটি 103 বাইটে কমিয়ে আনতে পারি। এটি চমত্কার বলে মনে হচ্ছে না, তবে আমাদের কেবলমাত্র PIC এর মধ্যে 1024 বাইট রয়েছে, প্রতিটি ক্ষুদ্র পরিমাণে বেনিফিট রয়েছে।

পরবর্তী নির্দেশাবলীর মধ্যে আসুন আমরা বন্দরগুলি থেকে পঠন পরীক্ষা করি।

এখনও অবধি, আমরা পোর্ট এ-তে রচনা করছি যাতে আমরা একটি এলইডি চালু এবং বন্ধ করতে পারি। এই মুহুর্তে, আমরা দেখব কীভাবে আমরা বন্দরে I / O পিনগুলি পড়তে চলেছি।

ইনপুট / আউটপুট পোর্টগুলি পঠন

এটি হ'ল এটি নিশ্চিত করার জন্য যে আমরা কোনও বাহ্যিক সার্কিটকে লিঙ্ক করতে সক্ষম হয়েছি এবং এটি যে কোনও নির্দিষ্ট আউটপুট সরবরাহ করে influence

আপনি যদি আমাদের পূর্ববর্তী কোর্সগুলি মুখস্থ করে নিতে চান, আপনি যদি I / O বন্দরগুলি স্থাপন করতে চান তবে আমাদের ব্যাংক 0 থেকে ব্যাঙ্ক 1 এ উঠতে হবে to আমরা প্রাথমিকভাবে এটি সম্পাদন করব:

এই সময়ে আমরা ইনপুট করতে পোর্ট এ এর ​​বিট 0 স্থির করেছি। পিনটি উচ্চ বা কম কিনা তা এখন আমাদের অবশ্যই পরীক্ষা করা উচিত। এটি সম্পাদন করতে, কেউ কেবল দুটি নির্দেশের একটি ব্যবহার করতে পারে:

বিটিএফএসসি এবং বিটিএফএসএস।

বিটিএফএসসি নির্দেশনাটি বোঝায় যে ‘রেজিস্ট্রারে কিছুটা পরীক্ষা করুন পাশাপাশি বিটকে আমরা মনোনীত করি।

যদি এটি 0 হয় তবে সেক্ষেত্রে আমরা পরবর্তী নির্দেশগুলি বাদ দিই। বিটিএফএসএস সূচিত করে দেয় ‘রেজিস্টারে কিছুটা পরীক্ষা কর এবং আমরা প্রতিষ্ঠিত করলাম কিছুটা। যদি এটি 1 তে সেট করা থাকে, তবে আমরা পরবর্তী নির্দেশকে বাইপাস করি।

আমরা কোনটি ব্যবহার করি তা সঠিকভাবে নির্ধারিত হয় কীভাবে আমরা ইনপুট অধ্যয়ন করার সময় আমাদের প্রোগ্রামটির প্রতিক্রিয়া জানাতে চাই। একটি উদাহরণ হিসাবে, যদি আমরা কেবল ইনপুটটি 1 হয়ে যাওয়ার অপেক্ষায় থাকি, তবে আমরা বিটিএফএসএস নির্দেশকে নিম্নলিখিত পদ্ধতিতে ব্যবহার করতে সক্ষম হতে পারি:

কোড এখানে:

বিটিএফএসএস পোর্টএ, 0 এখানে যান শুরু করুন:
:

প্রোগ্রামটি পোর্টএ-তে যে বিট 0-এ 1 এ নির্ধারিত হয়েছে কেবলমাত্র ‘এখানে ক্যারি করুন’ তে স্থানান্তরিত হবে।

আমরা বর্তমানে এমন একটি প্রোগ্রাম লিখব যা এক হারে একটি এলইডি প্রম্পট করতে পারে, তবে যদি একটি স্যুইচ সীমাবদ্ধ থাকে তবে এটি দু'বার আস্তে এলইডি ফ্ল্যাশ করবে।

এই প্রোগ্রামটি সম্ভবত আপনার নিজেরাই প্রয়োগ করা সম্ভব, তবুও আমরা কোনওভাবে তালিকাটি অন্তর্ভুক্ত করেছি।

আপনি নীতিগুলি বুঝতে পেরেছেন কিনা তা পরীক্ষা করতে আপনি পুরো প্রোগ্রামটি চেষ্টা ও লেখার চেষ্টা করতে পারেন। আমরা আগের মতো সমমানের সার্কিটটি ব্যবহার করব, পিআইসির একটি সুইচ সংযুক্ত আরএ0 এবং আমাদের সরবরাহের ইতিবাচক রেল অন্তর্ভুক্ত করে।

আমরা এখানে যা অর্জন করেছি তা হ'ল LED চালু করা। সুইচটি বন্ধ আছে কিনা তা আমি পরবর্তীকালে নির্ধারণ করি।

যদি এটি সীমাবদ্ধ থাকে তবে এর পরে আমি আমাদের বিলম্ব সাববুটিনের সাথে সংযুক্ত করি। এটি আমাদের আগের মতো সমতুল্য বিলম্ব সরবরাহ করে, তবে আমরা এই পর্যায়ে এটির সাথে দুবার যোগাযোগ করছি।

যখনই এলইডি বন্ধ থাকে তখন একই জিনিস প্রযোজ্য। যদি স্যুইচটি বন্ধ না হয়, তবে আমাদের পিরিয়ডগুলি পিরিয়ড চালু এবং বন্ধ থাকে off

আপনি কি শুরু থেকেই এই পাঠগুলি অনুসরণ করে চলেছেন, আপনি বুঝতে সক্ষম হবেন যে আপনি বর্তমানে পিআইসি 16F84 এর 35 টি নির্দেশাবলীর মধ্যে দশটি আবিষ্কার করেছেন! এবং এর প্রতিটি বিট কেবলমাত্র একটি LED চালু এবং বন্ধ করেই শিখে নেওয়া যায়।

এখনও অবধি, আমরা পিআইসি ঝলকানো একটি LED চালু এবং বন্ধ রচনা করেছি।

পরবর্তীকালে আমরা একটি স্যুইচ অন্তর্ভুক্ত করে আমাদের পিকের সাথে সক্ষম হয়েছি, সুতরাং ফ্ল্যাশের গতি পৃথক করে।

দক্ষতার সাথে মেমরি স্পেস ব্যবহার করা

একমাত্র বিষয়টি হ'ল, প্রোগ্রামটি বেশ দীর্ঘ এবং মেমরির জায়গার তুলনায় অদক্ষ। আমি প্রথমবারের জন্য কমান্ডগুলি অন্তর্ভুক্ত করার সময় এটি ঠিক মনে হয়েছিল, তবে এটি কার্যকর করার সহজ উপায় হওয়া উচিত। ইতিবাচকভাবে রয়েছে, আমরা বিশ্লেষণ করব যে কীভাবে আমরা আক্ষরিকভাবে এলইডিটি চালু এবং বন্ধ করছিলাম।

মুভলউ 02hmovwf পোর্টটাইমোভল্ভ 00 ঘন্টা মভলউ পোর্টা

প্রথমে আমরা আমাদের ডাব্লু রেজিস্টারটি 02 ঘন্টা দিয়ে স্টাফ করেছিলাম, তারপরে এটি এলইডি চালু করতে আমাদের পোর্টএ রেজিস্টারে স্থানান্তরিত করে। এটি বন্ধ করতে, আমরা 00 ঘন্টা দিয়ে ডাব্লু প্যাক করেছি যার পরে এটি আমাদের পোর্টএ রেজিস্টারে স্থানান্তরিত করা হয়েছে।

এই সমস্ত রুটিনগুলির মধ্যে আমরা এলইডি ফ্ল্যাশিং পর্যবেক্ষণ করতে পারি তা নিশ্চিত করার জন্য একটি সাবরুটিনের সাথে যোগাযোগ করতে বাধ্য হয়েছিল।

অতএব, আমাদের দুটি সেট তথ্য কয়েকবার স্থানান্তরিত করতে হবে (একদা ডাব্লু রেজিস্টারের পরে পোর্টার কাছে) পাশাপাশি একটি সাব্রুটিনকে দু'বার কল করতে হবে (একবার একবার অফ অফ একবার হবে)। সুতরাং, আমরা কীভাবে এটি যুক্ত দক্ষতার সাথে অর্জন করতে পারি? খুব সহজ.

আমরা এক্সওআরএফ হিসাবে পরিচিত একটি আলাদা নির্দেশকে ব্যবহার করি। এক্সওআরএফ নির্দেশিকা রেজিস্টারে একটি এক্সক্লুসিভ বা ফাংশন কাজ করে যা আমরা সরবরাহ করি সেই তথ্য দিয়ে। আমি বিশ্বাস করি যে আমাদের চালিয়ে যাওয়ার আগে বিশ্বে একটি এক্সক্লুসিভ ওআর কী আছে তা আমাকে পরিষ্কার করতে হবে। যদি আমাদের দুটি ইনপুট এবং একটি আউটপুট থাকে তবে ইনপুটটি কেবল 1 টি হতে পারে তবে যতক্ষণ না দুটি ইনপুট আলাদা হয়। যখন তারা একই রকম হয়, তারপরে আউটপুটটি সম্ভবত 0 হয় The নীচে একটি সত্য টেবিল দেওয়া আছে, এই ব্যক্তিদের জন্য যাঁরা চেক করতে চান তাদের জন্য:

এ বি এফ 0 0 00 1 11 0 11 1 0

আমরা এই মুহুর্তে আমাদের পূর্ববর্তী আউটপুটটির মতো বি কে রেন্ডার করে কী কী হয় তা যাচাই করব এবং কেবল এ এর ​​মান পরিবর্তন করব:

এ বি এফ
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

যদি আমরা 1 এর সমান মান বজায় করি এবং আমরা আউটপুট সহ এক্সক্লুসিভ বা এটি করি তবে আউটপুট টগল হবে। যদি আপনি সত্য টেবিল থেকে এটি লক্ষ্য না করতে পারেন তবে নীচে এটি বাইনারি ব্যবহার করে দেখা যেতে পারে:

0 বর্তমান আউটপুট
এক্স-ওআর 1 1 নতুন আউটপুট সহ
এক্স-ওআর 1 0 নতুন আউটপুট সহ

সম্ভবত আপনি এটির সাথে আউটপুটটি 1 দিয়ে একচেটিয়া ORing করে খুঁজে পেতে পারেন, আমরা এখন 0 থেকে 1 থেকে 0 পর্যন্ত আউটপুট টগল করব।
সুতরাং, আমাদের এলইডি চালু এবং বন্ধ করতে, আমাদের কেবল কয়েকটি বাক্য প্রয়োজন:

MOVLW 02 ঘন্টা
এক্সআরডাব্লুএফ ডোর, ২

আমরা ঠিক কী অর্জন করব তা হল 02 এইচ সহ আমাদের ডাব্লু রেজিস্টার যুক্ত করা। সে ক্ষেত্রে আমরা আমাদের পোর্টএতে যা আছে তা নিয়ে এই নম্বরটি এক্সক্লুসিভ ORing করছি। বিট 1 যদি 1 এর 1 হয় তবে এটি 0 তে পরিবর্তিত হতে চলেছে বিট 1 এর 0 এর ক্ষেত্রে এটি 1 তে পরিবর্তিত হতে চলেছে 1. বাইনারিটি কীভাবে চলছে তা প্রদর্শন করার জন্য এই কোডটি একবার বা দুবার পরীক্ষা করা যাক:

দরজা
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

আমাদের প্রত্যেকবার আমাদের ডাব্লু রেজিস্টারগুলিতে অভিন্ন মূল্য লোড করতে হবে না, সুতরাং শুরুতে এটি একবারে সম্পন্ন করা সম্ভব এবং কেবল আমাদের টগল কমান্ডে ফিরে আসা সম্ভব। অতিরিক্তভাবে, আমাদের পোর্টএ রেজিস্টারে কোনও মান ঠিক করার দরকার নেই। কারন? অবশ্যই, যেহেতু পাওয়ার আপের ক্ষেত্রে এটি 1 1, আমরা সহজেই এটি টগল করতে পারি। আমি, বিকল্প হিসাবে একটি 0 পাওয়ার আপ, আমরা এখনই এটি টগল করব।

অতএব আপনি আমাদের সদ্য গঠিত কোডটি দেখতে চাইবেন। প্রথমটি আমাদের ঝলকানো এলইডি কোডটি উপস্থাপন করে, যখন দ্বিতীয়টি স্যুইচটি যুক্ত করার সাথে একটিটি দেখায়:

আসুন আমরা আশা করি যে একটি সহজ নির্দেশের সাহায্যে আপনি এটি সন্ধান করতে পারেন, আমরা এখন আমাদের প্রোগ্রামের স্কেলটি হ্রাস করেছি। সত্যটি হল, আমাদের প্রোগ্রামগুলি দ্বারা আমরা কতটা কমাতে পারব তা প্রদর্শনের জন্য, আমরা দুটি প্রোগ্রাম প্রদর্শন করেছি, ঠিক কী কী রচনা করা হয়েছিল, এবং নীচের সারণীতে তাদের মাত্রা:

প্রোগ্রাম পরিবর্তন মাত্রা (বাইট)
ফ্ল্যাশিং এলইডি মূল 120
ফ্ল্যাশিং এলইডি সাবরোটাইন যোগ করা হয়েছে 103
ফ্ল্যাশিং এলইডি এক্সওআর ফাংশন ব্যবহৃত হয়েছে 91
মূল স্যুইচ 132 সঙ্গে এলইডি
স্যুইচ এক্সওআর ফাংশনযুক্ত এলইডি 124 ব্যবহৃত হয়েছে।

অতএব, আমরা কেবল কয়েকটি অভিনব নির্দেশ আবিষ্কার করি নি, আমরা অবশ্যই আমাদের স্ক্রিপ্টিংয়ের আকার হ্রাস পেয়েছি!

নীচে, আমরা কীভাবে পৃথক বিটগুলি উইগল করতে পারি, কিছু নির্দিষ্ট সোজা পাটিগণিত, পাশাপাশি ডেটা টেবিলগুলি বিশ্লেষণ করব।

লজিকাল ম্যানেজার

শেষ টিউটোরিয়ালের মধ্যে আমি এক্সক্লুসিভ বা অপারেশন উপস্থাপন করেছি। এক্সওর ফাংশনটি লজিকাল অপারেটর হিসাবে বোঝা যায়।

এই টিউটোরিয়ালের মধ্যে আমি অতিরিক্ত লজিকাল অপারেটরগুলিকে আলোকিত করব যা পিআইসি প্রচার করে। পয়েন্ট প্রোগ্রামগুলিতে কোনও ধরণের ঘটনা ঘটবে না, তবে আমরা ছোট ছোট কোডের প্রয়োগ করে অপারেটরগুলি ব্যবহারের সহজ পদ্ধতি শিখব।

এবং অ্যান্ড ফাংশনটি মূলত দুটি বিট বিশ্লেষণ করে এবং 1 টি একই হয় কিনা এবং 0 টি স্বতন্ত্র হলে সেগুলি সরবরাহ করে। উদাহরণস্বরূপ, আমরা যদি 1 এবং 1 উল্লেখ করেছি তবে ফলাফলটি 1 হবে, তবে আমরা 1 এবং 0 ঘোষণা করলে ফলাফলটি 0 হবে।

বলা বাহুল্য, আমরা শব্দেরও মূল্যায়ন করতে সক্ষম হয়েছি এবং এর সাথে অ্যান্ড ফাংশনটি সম্পাদনকারীরা উভয় পদকে পর্যায়ক্রমে পর্যালোচনা করছে। নীচের উদাহরণটি দুটি 8-বিট শব্দ পণ্যের সাথে একসাথে অ্যান্ডেড হয়ে উঠেছে:

11001011
এবং 10110011
সমান 10000011

আমি আশা করি আপনি সম্মত হন, ফলাফলটি যখনই এক জোড়া শব্দের সাথে একে অপরের সাথে 2 1s হাতের মুঠোয় কেবল তখনই 1 থাকে। উদাহরণস্বরূপ, বন্দরগুলি যাচাই করতে আমরা অ্যান্ড ফাংশনটি ব্যবহার করতে সক্ষম হয়েছি।

যদি আমরা কয়েকটি আই / ও পিনগুলি সার্কিটের সাথে সংযুক্ত থাকে যাচাই করে দেখছি এবং আমাদের একটি নির্দিষ্ট পরিস্থিতির দিকে নজর রাখা উচিত যেখানে কেবল কয়েকটি পিনই বেশি থাকে, সে ক্ষেত্রে আমরা বেশ কিছুটা পড়তে সক্ষম হয়েছি পোর্ট, যার পরে এবং ফলাফলটি আমরা যে শর্তের জন্য পরীক্ষা করছিলাম তার উপরের উদাহরণটির মতোই।

পি আই সি আমাদের জন্য দুটি উপাদান সরবরাহ করে।
তারা হ'ল ANDLW এবং ANDWF। এ্যান্ডএলডাব্লু আমাদের ডাব্লু রেজিস্টারের বিশদ, এবং আমরা যে পরিমাণ পরিমাণ নির্ধারণ করি তার বিশদ সহ একটি অ্যান্ড ফাংশন পরিচালনা করার অনুমতি দেয়।

বাক্যবিন্যাসটি হ'ল: ANDLW এর মধ্যে আমরা যাচ্ছি এবং ডব্লু এর সামগ্রীগুলি হ'ল।

অ্যান্ড ফাংশনের ফলাফলটি সরাসরি ডাব্লু রেজিস্টারে সংরক্ষণ করা হবে।
ANDWF আমাদের ডাব্লু রেজিস্টার এবং একটি ভিন্ন রেজিস্টারে একটি অ্যান্ড ফাংশন পরিচালনা করার অনুমতি দেয়, উদাহরণস্বরূপ একটি পোর্ট। বাক্য গঠনটি হ'ল: ওআরডাব্লুএফ, ডি যার মধ্যে নিবন্ধটি আমরা উত্সাহী, উদাঃ পোর্টটা, এবং ডি পিআইসি দেখায় যেখানে ফলাফলটি আপনার অবস্থান উচিত। যদি ডি = 0 হয় তবে ফলাফলটি ডাব্লু রেজিস্টারে রাখা হয় এবং ডি = 1 এর শেষ ফলাফলটি আমরা নির্ধারিত রেজিস্টারে সংরক্ষণ করা হয়। নীচের কোডের দুটি অংশ প্রতিটি ও ফাংশনের একটি ভাল উদাহরণ প্রদর্শন করে।

প্রাথমিকটি পোর্টটির স্থিতি যাচাই করে দেখছে, যাতে ইনপুটগুলি 1100 হয় কিনা তা আমাদের খতিয়ে দেখা দরকার W

মুভল 1100
ANDWF 05 ঘন্টা, 0 দ্বিতীয় চিত্রটি এখন ডাব্লু নিবন্ধের বিষয়বস্তু যাচাই করতে পারে:
ANDLW 1100

বা

এক্সওআরটি সুনির্দিষ্ট হতে আমরা এখনই একটি বা ফাংশন আবিষ্কার করেছি। এটি 1 টি হিসাবে বিকশিত হয় যদি দুটি বিট একইরকম না হয় তবে ভিন্ন। আপনি আইওআর নামক আর একটি ফাংশন খুঁজে পেতে পারেন যা অন্তর্ভুক্ত রয়েছে OR বিটটি যদি হয় 1 বিট হয় তবে এই ফাংশনটি 1 জেনারেট করবে, তবে প্রতিটি বিট যদি 1 হয় তবে নীচে এটি চিত্রিত করার জন্য একটি পরিষ্কার-কাট সত্যের টেবিলটি দেওয়া হয়েছে:

এ বি ও / পি
0 0 0
0 1 1
1 0 1
1 1 1

অ্যারিমেটিক অপারেটর কি কি

যোগ করুন

এই ফাংশনটি সাধারণত যা দাবি করে তা সম্পাদন করে। এটি দুটি পরিসংখ্যান অবদান! যদি দুটি চিত্র যোগ করার ফলাফল 8 টি বিটকে ছাড়িয়ে যায়, সেক্ষেত্রে সম্ভবত একটি ক্যারি পতাকা সেট করা হবে। CARRY পতাকাটি 03 ঘন্টা বিট 0 ঠিকানায় অবস্থিত।

যখন এই বিটটি নির্ধারিত হয়, তখন দুটি চিত্র 8 বিটকে ছাড়িয়ে যায়। যখন এটি 0 হয়, তখন ফলাফলটি 8 টি বিটের মধ্যে অবস্থিত। পূর্বের মতো, পিআইসি আমাদের দুটি স্টাইল এডিডি সরবরাহ করে, বিশেষত এডিডিএলডাব্লু এবং এডিডিডাব্লুএফ। আপনি যেমন ধরে নিয়েছেন, এটি ঠিক উপরের ফাংশনটির মতো। ADDLW ডাব্লু নিবন্ধের বিষয়বস্তু সরবরাহ করে যা আমরা নির্ধারণ করি। বাক্য গঠনটি হ'ল ADDLW ADDWF ডাব্লু রেজিস্টার এবং আমাদের মনোনীত কিছু অন্যান্য নিবন্ধের বিষয়বস্তু যুক্ত করুন।

বাক্য গঠনটি হল: ADDWF, d কোথায়

সাব

এই মুহুর্তে, আমি অনুমান করি যে আপনি এই ফাংশনটি পরিচালনা করে তা অনুমান করতে পারবেন না! প্রকৃতপক্ষে, আপনি এটি সন্দেহ, এই কাজ
আরেকটি থেকে বিট বিয়োগ করে। আবার পিআইসি আমাদের 2 টি স্বাদ সরবরাহ করে: SUBLW এবং SUBWF। এডিডি ফাংশনের ক্ষেত্রে সিনট্যাক্সটি ঠিক একই রকম, স্পষ্টতই আপনি এডিডির জায়গায় এসইউবি টাইপ করেন!

বৃদ্ধি যদি আমরা পিআইসিতে 1 এর সাথে একটি সংখ্যার অন্তর্ভুক্ত করতে চাই, আমরা একেবারে ADD ফাংশনটি ব্যবহার করতে পারি এবং এক নম্বরটিকে ব্যবহার করতে পারি। With এর সাথে অসুবিধাটি হ'ল আমাদের প্রথমে ডাব্লু রেজিস্টারে চিত্রটি স্থাপন করতে হবে, পরবর্তীকালে এটি বৃদ্ধিতে ADDLW 1 নিয়ন্ত্রণ ব্যবহার করুন। আমরা যদি নিবন্ধে 1 টি অন্তর্ভুক্ত করতে চেয়েছিলাম তবে এটি আরও খারাপ হতে পারে। আমাদের প্রথমে ডাব্লু রেজিস্টারে 1 নম্বর রাখতে হবে, তার পরে ADDWF, 1 ব্যবহার করুন। সুতরাং, উদাহরণস্বরূপ, 1 অবস্থান 0C এর অন্তর্ভুক্ত করার জন্য, বলুন, আমাদের স্ক্রিপ্টের নিম্নলিখিত অংশটি ধারণ করতে হবে:

মুভল 01
addwf 0c, 1

এটি পরিচালনা করার একটি সহজ পদ্ধতি রয়েছে। আমরা INCF কমান্ডটি ব্যবহার করতে পারি can বাক্য গঠনটি হ'ল: INCF, d কোথায়, নিবন্ধক বা স্থান যেখানে আমরা উদ্বিগ্ন, এবং পিআইসি দেখায় যেখানে আপনার ফলাফলটি অবস্থান করা উচিত। ক্ষেত্রে d = 0, ফলাফল ডাব্লু নিবন্ধকের মধ্যে, এবং ক্ষেত্রে ক্ষেত্রে ডি = 1, ফলাফলটি আমাদের নির্ধারিত রেজিস্টারে সেট করা আছে।

এই পৃথক নির্দেশকে কাজে লাগিয়ে আমরা আসলে কোডিংয়ের পঞ্চাশ শতাংশ সক্ষম করতে পারি। যদি আমরা ফলাফলটি ডাব্লু রেজিস্টারে পুনরুদ্ধার করতে চেয়েছিলাম, সেই ক্ষেত্রে উপরের উদাহরণটি ব্যবহার করে আমাদের 0C এর আইটেমগুলি ডাব্লু রেজিস্টারে ফিরিয়ে আনতে একটি অতিরিক্ত কমান্ড অন্তর্ভুক্ত থাকতে পারে, যার পরে 0 সি রেজিস্ট্রারটি কোনও স্থানে ফিরে না রাখা উচিত এটা কি ছিল ব্যাপার।

সেখানে ইনক্রিমেন্ট কমান্ড রয়েছে। এটি INCFSZ। এই কমান্ডটি আমাদের নির্ধারিত রেজিস্টারটিকে বাড়িয়ে দিতে পারে, তবে আমরা যদি রেজিস্টারটি ইনক্রিমেন্টের পরে 0 সমান হয় (এটি ঘটবে যখন আমরা 1 থেকে 127 অন্তর্ভুক্ত করব) এর পরে সম্ভবত পিআইসি পরবর্তী নির্দেশাবলী পাস করবে। নীচের কোডের অংশটি এটি প্রতিফলিত করে:

লুপ ইনফস্জেড 0 সি
গোটো লুপ
:
:
প্রোগ্রামের বাকি।

কোডের উপরের অংশে, 0 সি 1 দ্বারা বর্ধিত হতে চলেছে আমরা পরবর্তী একটি নির্দেশের মালিক, যা পিআইসিকে লুপ নামের আমাদের ট্যাগটিতে ফিরে আসতে এবং আবার 0 দিয়ে 1c বৃদ্ধি করে inst 0C এর 127 এর সমান হওয়া অবধি এটি অব্যাহত থাকে this এই পরিস্থিতিতে যখন আমরা 0C 1 দ্বারা বৃদ্ধি করি, 0 সি এখন মিলবে 0. 0 আমাদের INCFSZ নির্দেশটি পরবর্তী নির্দেশকে বাদ দিতে পিআইসিকে খুব ভালভাবে অবহিত করতে পারে, যা এই উদাহরণে গোটো ডিক্লোরেশন, অতএব, পিসি বাকি প্রোগ্রামটি নিয়ে এগিয়ে যাবে।

হ্রাস

আমরা এখনই পূর্বের প্রশিক্ষণে হ্রাস কার্যকারিতা নিয়ে আলোচনা করেছি, অতএব আমি এটি আর সংশোধন করব না।

পরিপূরক

এই আলোচনার চূড়ান্ত নির্দেশনাটি যে রেজিস্টারটি আমরা নির্ধারণ করেছি তার প্রতিটি বিট বিপরীত হবে। বাক্য গঠনটি হল: সিওএমএফ, ডি যার মধ্যে

বিট অপারেশনগুলি বোঝা

উদাহরণস্বরূপ, আউটপুট থেকে ইনপুট পর্যন্ত কোনও পোর্টের পিনগুলি দ্রুত বদলানোর জন্য এটি ব্যবহার করা যেতে পারে। বিট ফাংশন আমাদেরকে এক্সপ্রেশনের মধ্যে একক বিট গঠনের অনুমতি দেয়। তারা আমাদের এগিয়ে যেতে, সেট করতে এবং রেজিস্টারগুলিতে বা সংখ্যা নির্ধারণ করে এমন একক বিটগুলি থেকে মুক্তি পেতে অনুমতি দেয়।

এই কোর্সের সমাপ্তিতে আমরা সামনে এগিয়ে যাওয়া সিকোয়েন্সিং লাইটগুলির একটি সেট তৈরি করার জন্য ডিজাইন করা একটি প্রোগ্রাম প্রকাশ করব, তারপরে বিপরীত পথ। আমরা এটি পূর্বে সম্পন্ন পর্যবেক্ষণ করেছিলাম যখন আমরা একচেটিয়া বা ফাংশন পরীক্ষা করেছিলাম, যেখানে আমরা এক্সপ্রোসিভালি একটি বয়ানের সাহায্যে বন্দরগুলি অর্ড করেছি। আমরা এখন পর্যন্ত কিছুটা ফাংশন লক্ষ্য করেছি যখন আমরা পিকের উপর বন্দরগুলি স্থাপন করি এবং

আমি এখানে তাদের ব্যবহার পুনরাবৃত্তি করা যাক।

বিসিএফ

এই নির্দেশনাটি আমরা নির্ধারণ করি এমন একটি নিবন্ধে নির্ধারিত কিছুটা মুছবে। বাক্য গঠন
হ'ল:
বিসিএফ,

আমরা স্ট্যাটাস রেজিস্টারে কিছুটা সরিয়ে পৃষ্ঠার 1 থেকে পৃষ্ঠা 0 তে পরিবর্তন করতে এর আগে নিয়োগ করেছি। আমরা একইভাবে কোনও ভিন্ন রেজিস্টার / লোকেশনটিতে কিছুটা 0 থেকে ঠিক করতে এটি ব্যবহার করতে সক্ষম হয়েছি। উদাহরণস্বরূপ, যদি আমরা 11001101 তে তৃতীয় বিটটি 0C থেকে 0 বিভাগে সংরক্ষিত করতে চেয়েছিলাম, আমরা সম্ভবত
প্রবেশ করান:

বিসিএফ 0 সি, 03

বিএসএফ

এই নির্দেশনাটি আমাদের নির্দেশিত যে কোনও রেজিস্টারে আমরা 1 কে নির্ধারিত কিছু বিট ঠিক করে দেবে। আমরা এর আগে পৃষ্ঠা 0 থেকে পৃষ্ঠা 1 এ এগিয়ে যাওয়ার জন্য এটি ব্যবহার করেছি সিন্ট্যাক্সটি হল: BSF ,, এবং উপরের বিসিএফের মতো ঠিক একই পদ্ধতিতে ব্যবহৃত হয়।

বিটিএফএসসিপ এখন অবধি আমরা একটি রেজিস্টারে কিছু সেট বা সাফ করতে পারি। তবে ভেবে দেখুন কি আমাদের প্রাথমিকভাবে একটি রেজিস্টারে 1 বা 0 0 কিছু আছে কিনা তা পরীক্ষা করতে হবে?

অবশ্যই, বিটিএফএসসি ব্যবহার করা সম্ভব। এতে বিট টেস্ট রেজিস্টার এফ উল্লেখ করা হয়েছে, এবং যদি এটি পরিষ্কার হয় তবে এড়িয়ে যান। এই নির্দেশনাটি নিবন্ধে আমরা যে বিটকে মনোনীত করি তা বিশ্লেষণ করতে চলেছে। যদি বিটটি 0 হয় তবে নির্দেশটি পরবর্তী নির্দেশটি পাসের মাধ্যমে পিআইসিকে অবহিত করবে।

আমরা কোনও পতাকা চেক করতে চাইলে আমরা এই নির্দেশকে কাজে লাগাতে পারি, উদাহরণস্বরূপ ক্যারি পতাকা। এটি আমাদের স্ট্যাটাস রেজিস্টারটি পড়ার প্রয়োজন এবং কোন পতাকাগুলি স্থির করা হয়েছে তা শিখতে পৃথক বিটগুলি অনুসন্ধান করার দরকার পড়ে। 29 উদাহরণস্বরূপ, আমরা 2 টি পরিসংখ্যান যুক্ত করার পরে ক্যারি পতাকাটি 1 তে সেট করা আছে কিনা তা পরীক্ষা করে দেখতে চাইলে আমরা নিম্নলিখিতটি টাইপ করতে পারি:

বিটিএফএসসি 03 ঘন্টা, 0
1 এ সেট থাকলে এখানে চালিয়ে যান
অথবা এখানে 0 তে সেট করা থাকলে

বিটের স্থিতি যদি 1 হয় তবে সেক্ষেত্রে বিটিএফএসসির পরবর্তী নির্দেশাবলী সম্পন্ন হবে। যদি এটি 0 তে সেট করা থাকে তবে সেক্ষেত্রে পরবর্তী নির্দেশগুলি এড়িয়ে যায়। কোডের নিম্নোক্ত অংশগুলি এতে প্রদর্শিত হতে পারে:

লুপ :
:
:
বিটিএফএসসি 03,0
গোটো লুপ

উপরের কোডে, পিক স্ট্যাটাস রেজিস্টারের বিট 0 ক্ষেত্রে লুপ থেকে সহজেই বেরিয়ে যাবে (বা ক্যারি পতাকা) 0 হিসাবে সংজ্ঞায়িত করা হয়েছে বা অন্যথায়, গোটো কমান্ড পরিচালিত হবে।

বিটিএফএসএস

এই নির্দেশে বিট পরীক্ষার রেজিস্ট্রেশন এফ, এবং সেট করা বাদ দিন states এটি বিটিএফএসসি নির্দেশের সাথে তুলনীয় হতে পারে, তারপরে পিআইসি পরবর্তী নির্দেশগুলি বাদ দিতে পারে যদি আমরা যে বিটটি মূল্যায়ন করে যাচ্ছি 0 এর পরিবর্তে 1 তে সেট করা থাকে।

সিএলআরএফ

এই নির্দেশনাটি নিবন্ধের সম্পূর্ণ বিবরণ 0 এ স্থির করবে সিনট্যাক্সটি হ'ল:

সিএলআরএফ
আমরা এর আগে সিএলআরএফ 85 ঘন্টা প্রয়োগ করে বন্দরগুলির আউটপুট 0 এ সেট করতে নিয়োগ করেছি। আমরা সিএলআরএফ ব্যবহার করে আউটপুটে সমস্ত পিন অন্তর্ভুক্ত করার জন্য পোর্টগুলি ঠিক করার জন্য এটি ব্যবহার করেছিলাম
05 এইচ।

সিএলআরডাব্লু

এটি ডাব্লু রেজিস্টার সাফ করা বাদে সিএলআরএফ নির্দেশের অনুরূপ হতে পারে। বাক্য গঠনটি বেশ সহজভাবে:

সিএলআরডাব্লু

আরএলএফ এবং আরআরএফ

এই দিকনির্দেশগুলি একটি রেজিস্টারে কিছুটা বামে (আরএলএফ) অথবা ডানদিকে (আরআরএফ) একটি রেজিস্টারে পরিবহন করবে। উদাহরণস্বরূপ, যদি আমাদের 00000001 প্রয়োজন হয় এবং আমরা আরএলএফ নিযুক্ত করেছি, সে ক্ষেত্রে আমরা 00000010 এর অধিকারী হতে পারি this এই মুহুর্তে, 10000000 আছে এবং আরএলএফ নির্দেশ প্রয়োগ করার ক্ষেত্রে কী হবে? অবশ্যই, 1 বহন পতাকা মধ্যে অবস্থিত হবে। যদি আমরা আরএলএফ নির্দেশটি আরও একবার প্রয়োগ করি তবে 1 টি আবার শুরুতে উপস্থিত হবে। আরআরএফ নির্দেশের জন্য বিপরীতভাবে একই রকম ঘটে। নীচের পয়েন্টের ক্ষেত্রে এটি আরএলএফ নির্দেশের জন্য এটি দেখায়, যাতে আমরা একটি রেজিস্টারের 8 টি বিট, পাশাপাশি ক্যারি পতাকা দেখতে পারি:

সি 87654321
000000001
আরএলএফ 0 00000010
আরএলএফ 0 00000100
আরএলএফ 0 00001000
আরএলএফ 0 00010000
আরএলএফ 0 00100000
আরএলএফ 0 01000000
আরএলএফ 0 10000000
আরএলএফ 1 00000000
আরএলএফ 0 00000001

উদাহরণ প্রোগ্রাম

আমরা এখন এমন একটি কোড কোড দেখতে যাচ্ছি যেটি সংকলন ও ড্রাইভ করতে পারে। এটি পোর্টএ বিট 0 এ শুরু করে একটি সিকোয়েন্সিং আলো তৈরি করবে, পোর্টবি বিট 8 এবং এ যাবে
তারপর ফিরে।
পোর্ট পিনগুলির প্রত্যেকটির জন্য এলইডি হুক আপ করুন। আমরা কিছু বিট হবে
পদ্ধতি এই টিউটোরিয়ালে নির্দেশিত।

টাইম ইকিউ 9 এফএইচ বিলম্ব লুপের জন্য পরিবর্তনশীল।
পোর্টবি ইকিউ 06 এইচ পোর্ট বি ঠিকানা।
TRISB EQU 86H পোর্ট বি ট্রাইস্টেট ঠিকানা।
পোর্টটা ইকিউ 05 এইচ পোর্ট একটি ঠিকানা।
ট্রিসা ইকিউ 85 এইচ পোর্ট এ ট্রাইস্টেট ঠিকানা।
স্ট্যাটাস ইকিউ 03 এইচ পাতা রেজিস্টার নির্বাচন করুন।
COUNT1 EQU 0CH লুপ রেজিস্টার।
COUNT2 EQU 0DH লুপ রেজিস্টার।

বিএসএফ অবস্থা, 5 পৃষ্ঠায় যান 1
MOVLW 00H এবং সেট আপ করুন
MOVWF টিআরএসবি উভয় পোর্ট এ এবং বি
আউটপুট থেকে সরানো
MOVWF ট্রিসা তারপরে ফিরে যান
বিসিএফ স্ট্যাটাস, 5 পৃষ্ঠা 0।
MOVLW 00H ক্লিয়ার পোর্ট এ।
মুভ ডোর

মূল প্রোগ্রাম শুরু

চালাও
01 এইচটি প্রথম বিটমোভডব্লুএফ সেট করুন
পোর্ট বিসিএল-তে পোর্টটিবি
বিলম্ব কিছুক্ষণ অপেক্ষা করুন
বিলম্ব
বিটটি পোর্ট বি বাম দিকে সরান, তারপরে বিরাম দিন RL আরএলএফ
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRLF
পোর্টটিবি, 1 এটি কিছুটা ক্যারি ফ্ল্যাগে নিয়ে যায়
এখন পোর্ট এ এর ​​দিকে সরান এবং কিছুটা বাম দিকে সরিয়ে নিন। আরএলএফ
পোর্টা, 1 এটি কিছুটা শূন্য পতাকা থেকে পোর্টাকল-এ স্থানান্তরিত করে
বিলম্ব করুন
ডোর, 1 কল
বিলম্ব করুন
DELAYRLF
ডোর, 1 কল
বিলম্ব করুন
DELAYRLF
ডোর, 1 কল
বিলম্ব করুন
বিলম্ব
কিছুটা পিছনে পোর্ট এআরআরএফ এ সরান
ডোর, 1 কল
বিলম্ব করুন
DELAYRRF
ডোর, 1 কল
বিলম্ব করুন
DELAYRRF
ডোর, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টা, 1 এটি কিছুটা শূন্য পতাকায় সরায় এখন কিছুটা সরান
ফিরে পোর্ট বিআরআরএফ
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টটিবি, 1 কল
বিলম্ব করুন
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টটিবি, 1 কল
বিলম্ব করুন
DELAYRRF
পোর্টটিবি, 1 কল
বিলম্ব করুন
বিলম্ব এখন আমরা ফিরে এসেছি যেখানে আমরা শুরু করেছি, গোটো
চলুন আবার যেতে দিন।

প্রশিক্ষণ সেটে একটি দুর্দান্ত বিকল্প রয়েছে যা আপনাকে ডেটা টেবিলটি ব্যবহার করার অনুমতি দেয়।

একটি ডাটা টেবিল হ'ল ডেটা কোটগুলির একটি তালিকা, যাতে কয়েকটি বিবেচনার ভিত্তিতে সমস্ত কিছু দেখা যায়।
উদাহরণস্বরূপ, আপনার কাছে এমন একটি সার্কিট থাকতে পারে যা একটি পিআইসি ব্যবহার করে যা ইনপুট পিনটি 1 সেকেন্ডে উচ্চ হয়ে যায় এমন সংখ্যার পরিমাণ গণনা করে। এর পরে আপনি 7 টি সেগমেন্ট ডিসপ্লেতে নম্বরটি প্রদর্শন করতে পারেন।

সময়টি চালু হওয়ার সাথে সাথে পিআইসি পিনটি যে পরিমাণে বেশি যায় সেগুলির পরিমাণ গণনা শুরু করে। 1 সেকেন্ডের পরে এটি টেবিলটি পরিদর্শন করে এবং উপাত্তগুলিকে এক নজরে দেখায় এটি অবশ্যই ডিসপ্লেতে নম্বরটি প্রদর্শন করবে যা পিনটি যে পরিমাণে পরিস্থিতি বাড়িয়েছে তার প্রতীক। এটি উপকারী হতে পারে, যেহেতু আমরা নির্ধারণ করি না যে পিআইসি এর অনুমান সম্পন্ন না করা পর্যন্ত চিত্রটি কী হতে পারে।

একটি সারণী ব্যবহার করে, আমরা কোন চিত্রটি চিত্রিত করতে পিআইসি তা নির্ধারণ করতে সক্ষম হয়েছি। এই মুহুর্তে, ডেটা টেবিলটি কীভাবে কাজ করে তা আপনাকে দেখাতে যাওয়ার আগে, আমি আপনাকে বলতে পারি যে পিআইসি প্রোগ্রামটি চালাচ্ছে প্রোগ্রামটি যেখানে রয়েছে সেটির অবস্থানটি পরিচালনা করে।

এটি বেসিকে যারা কিছু নির্দিষ্ট প্রোগ্রামিং করেছে তাদের জন্য সহায়তা করে। অন্যথায়, উদ্বিগ্ন হবেন না, আপনি তত্ত্ব সম্পর্কে শিখতে চাইতে পারেন। কল্পনা করুন নীচের উপস্থাপিত মত একটি বেসিক প্রোগ্রাম আছে:

10 বছর কে = 0
11 কে = কে + 1
12 যদি কে> 10 টি তখন 20 টি এল এস গোটো 11
20 প্রিন্ট কে
21 সমাপ্তি

প্রোগ্রামটি লাইন ১০ এ শুরু হবে, কে কে নির্ধারিত হওয়ার সাথে সাথেই এটি পরবর্তী লাইনে ১১ এর দিকে অগ্রসর হবে আমরা 1 কে কে অন্তর্ভুক্ত করার পরে আমরা তার পরে লাইন 12 এ এগিয়ে যাই।

এই মুহুর্তে আমরা কৌতূহলী হতে পারি যদি কে 10 এর চেয়ে বেশি হয় তবে এটি পরবর্তী ক্ষেত্রে আমরা 20 লাইনটিতে যাব, অন্যথায় আমরা লাইন 11 এ ফিরে যাব।

20 লাইন কে কে নথি করেছে এবং 21 লাইন প্রোগ্রামটি শেষ করেছে। বেসিক ল্যাবরেটিকৃত অনুমোদিত না হওয়ায় প্রোগ্রামারকে সমস্যাগুলি কোথায় রয়েছে তার একটি রেকর্ড রাখতে সহায়তা করার জন্য লাইন পরিসংখ্যান নিয়োগ করে। গন্তব্যগুলির মধ্যে পালাতে পিআইসি লেবেল নিয়োগ করে - বা এটি কি সত্যিই সম্ভব?

সমস্যাগুলি কোথায় রয়েছে সে সম্পর্কে আমরা সচেতন হওয়ার পাশাপাশি আমরা কোথায় অনুসন্ধান করব তা পিআইসিকে একটি সহজ উপায়ে জানাতে সক্ষম কিনা তা নিশ্চিত করতে আমরা লেবেলগুলি ব্যবহার করি।

পিআইসি একটি প্রোগ্রাম কাউন্টার হিসাবে পরিচিত একটি অভ্যন্তরীণ লাইন কাউন্টার সুবিধা গ্রহণ করে ঠিক কি ঘটে। প্রোগ্রামের কাউন্টার (পিসি সংক্ষেপে) বর্তমান নির্দেশ যেখানে মেমরি গন্তব্য ট্রেল।

আমরা যখনই পিককে একটি নির্বাচিত লেবেল দেখার জন্য অবহিত করি তখন এটি মেমোরি স্পটটি বুঝতে পারে এবং তাই সেই পিসিটিকে এই মুহুর্তের গন্তব্য না দেখার অবধি বাড়িয়ে তোলে। এটি উপরের বেসিক প্রোগ্রামটি যাচাই করে নিলে ঠিক একই পদ্ধতি is নীচে প্রতিটি নির্দেশের পাশাপাশি মেমরি স্পেস বা পিসির আইটেম সহ কোডের একটি বিভাগ রয়েছে:

পিসি নির্দেশ 10000 মুভ
0001 মুভিউফ 0 সি
0002 লুপ ডিসফস্কি 0 সি
0003 গোটো লুপ
0004 শেষ

উপরোক্ত বিক্ষোভে, আমরা পিসিটিকে 0000 এ স্থির করেছি this এর উপর আমাদের নির্দেশিকা চলবে 03. পিআইসি যখন এই ডেটা প্রয়োগ করেছে, তখন পরবর্তী নির্দেশটি স্ক্যান করার জন্য এটি পিসিকে বৃদ্ধি করে। এই মুহুর্তে পিআইসি মুভিউফ 0 সি দেখুন। পিসি আবার বাড়ানো হয়।

এখন পিআইসি অধ্যয়ন 0 সি। যদি 0 সি এর বিশদ 0 হয় না, সে ক্ষেত্রে পিসি 1 দ্বারা বাড়ানো হয়, পাশাপাশি নীচের নির্দেশনাটি গোটো লুপ, পিসিকে 0003 পজিশনে ফিরে যেতে অবহিত করে, সেখানে উল্লিখিত লুপ রয়েছে। যদি 0 সি এর বিশদ 0 হয় তবে পিসিকে 2 দ্বারা বৃদ্ধি করার পরামর্শ দেওয়া হয়, পরবর্তী নির্দেশাবলী কেবল বাদ দিন।

ডেটা টেবিলগুলি বোঝা

এটি পিসিটি 0004 পজিশনে রাখে, যেখানে প্রোগ্রামটি শেষ হয়। গন্তব্যগুলি সংঠক দ্বারা স্থির করা হয় এবং পিসি কী সম্পাদন করছে তা আমাদের সাধারণত উদ্বিগ্ন হওয়ার দরকার নেই। অবধি, আমরা ডাটা টেবিলগুলি ব্যবহার করার সময় যেমন করতাম ঠিক তেমনি এটি নিয়ন্ত্রণের মধ্যে আনার প্রয়োজনীয়তাও খুঁজে পাই। ডেটা টেবিল কীভাবে কাজ করে তা বর্ণনা করার সর্বাধিক সুবিধাজনক উপায় হ'ল একটি চিত্র দিয়ে শুরু করা।

পিসি সমান 02
Movlw 03
কল টেবিল
:
টেবিল addwf পিসি
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
প্রত্যাবর্তন

প্রাথমিক নির্দেশটি প্রোগ্রাম কাউন্টারের ঠিকানা (02 এইচ) সহ লেবেল পিসি বরাদ্দ করা হচ্ছে। আমরা ডাব্লু রেজিস্টারে 03h এর মান দেওয়ার পরে শীঘ্রই থাকব। আমরা তার পরে টেবিলে যোগাযোগ করি। সাবরুটাইন টেবিলের সর্বাধিক লাইনটি প্রোগ্রামের কাউন্টারে ডাব্লু রেজিস্টার (03 এইচ) এর বিবরণ বাড়িয়ে তোলে।

এটি প্রোগ্রামের কাউন্টারটিকে 3 দ্বারা বাড়াতে বা অন্যভাবে উপস্থাপন করতে ট্রিগার করে, 3 টি লাইনে এগিয়ে যাওয়ার জন্য প্রোগ্রামের কাউন্টারকে উদ্দীপিত করে। যখন কাউন্টারটি 3 টি লাইন নেমে এসেছে তখন পিআইসি নির্দেশাবলীটিকে প্রত্যুত্তরে স্বীকৃতি দেয়। এই কমান্ডটি ডাব্লু রেজিস্ট্রারে এর পরে মানটি প্রেরণ করে, যার পরে সাবরোটাইন থেকে ফিরে আসে। RETLW মূলত রিটার্ন, ডাব্লু টু ডাব্লু

দেখুন আমি রিটার্ন শব্দের পরে কমা রেখেছি। যেহেতু আমরা একটি সাবরুটিনে আছি, আমাদের এটির পৃষ্ঠায় ফিরে যাওয়ার নির্দেশ প্রয়োজন inst সুতরাং নির্দেশনায় আরইটি। আরইটিএলডাব্লু নির্দেশের পরে একটি সংখ্যা এবং ডাব্লু রেজিস্টারে ঠিক এটিই দেওয়া হয়।

এই উদাহরণে এটি চিত্রটি 3 We আমরা ডাব্লু রেজিস্ট্রারে কোনও পরিমাণ নির্ধারণ করতে পারতাম, যতক্ষণ না এই চিত্রটি সারণী সাব্রোটিনে প্রোগ্রাম কাউন্টারের সাথে একত্রিত হয়, আমরা একটি retlw নির্দেশ আবিষ্কার করতে যাচ্ছি। উপরের চিত্রটিতে এর দ্বারা বোঝা যায় যে আমরা 1 থেকে 7 পর্যন্ত যে কোনও সংখ্যা অর্জন করতে সক্ষম হয়েছি যদি আমরা সাবরোটাইনকে ছাড়িয়ে যাই তবে আমরা প্রোগ্রামের একটি অতিরিক্ত বিভাগ সম্পাদন করতে সক্ষম হতে পারি। এই কারণে, পিআইসি প্রোগ্রামের ঠিক সমাপ্তির দিকে ডেটা টেবিলটি স্থাপন করা সাধারণত একটি স্মার্ট পদক্ষেপ, অতএব আমরা যদি সেই ক্ষেত্রে ওভারশুট করি তবে আমরা কোনওভাবেই প্রোগ্রামটির উপসংহারে পৌঁছে যাব।

বাধাগুলির বিষয়টি দীর্ঘতম এবং সবচেয়ে কঠিন হতে পারে ru

বাধা বিশদ সম্পর্কিত কোনও জটিল পদ্ধতি আপনি খুঁজে পেতে পারেন না, তবে এই অংশের শেষের দিকে সামান্য ভাগ্য নিয়ে আপনি নিজের প্রোগ্রামগুলিতে বাধা প্রয়োগ করতে সক্ষম হতে পারেন।
আমরা বিভাগটি 2 পর্যায়ে আলাদা করেছি। এটি বিষয়টিকে বিভাগগুলিতে পৃথক করে সক্ষম করা, সহজ বোঝার জন্য আপনাকে একটি সহজ প্লিট আপ সরবরাহ করা।

বাধা ঠিক কী? অবশ্যই, শব্দটি ইঙ্গিত করে যে, একটি বাধা হ'ল একটি কৌশল বা একটি সংকেত যা কোনও মাইক্রোপ্রসেসর / মাইক্রোকন্ট্রোলারকে যে কোনও জিনিসই সম্পাদন করে যা কিছু ভিন্ন ঘটতে পারে তা থেকে বাধা দেয়।

আমাকে আপনাকে প্রতিদিনের চিত্রণ দেওয়ার অনুমতি দিন। ভাবেন আপনি নিজের বাড়িতে আরাম করছেন, অন্য ব্যক্তির সাথে কথোপকথন করছেন। হঠাৎ ফোনটা বেজে উঠল।

আপনি কথা বলা ছেড়ে দিয়েছেন, এবং কলারের সাথে কথা বলার জন্য টেলিফোনটি ধরেন। আপনার সাথে আপনার টেলিফোন ইন্টারঅ্যাকশন হয়ে গেলে, আপনি টেলিফোনের বেজে যাওয়ার আগে স্বতন্ত্রের সাথে কথোপকথনে ফিরে যাওয়ার সিদ্ধান্ত নেন। আপনি কারও সাথে চ্যাট করার সময় মূল রুটিনটি বিবেচনা করা সম্ভব, ফোন বেজে উঠলে আপনার কথোপকথন ব্যাহত হয় এবং রুটিনের বিরতি ফোনে কথা বলার পদ্ধতি।

ফোনের আলোচনা শেষ হওয়ার পরে, আপনি আবার চ্যাটের আপনার প্রাথমিক রুটিনে ফিরে যান। এই চিত্রণটি ঠিক কীভাবে কোনও প্রসেসরের পদক্ষেপ নিতে বাধা দেয়।

প্রাথমিক প্রোগ্রামটি সঞ্চালিত হয়, একটি সার্কিটের মধ্যে কিছু নির্দিষ্ট ক্রিয়াকলাপ পরিচালনা করে, তবে যখন কোনও বাধা ঘটে তখন একটি প্রাথমিক রুটিন সঞ্চালনের সময় প্রাথমিক প্রোগ্রামটি থামে l রুটিন শেষ হয়, প্রসেসর আগের মতো আগের প্রাথমিক রুটিনে ফিরে যায়।

বাধা বোঝা

পিআইসি বিঘ্নিত 4 টি উত্সের অধিকারী। এগুলি কয়েকটি দলে বিভক্ত হতে পারে। দুটি হ'ল বাধাগুলির উত্স যা পিআইসির বাইরে থেকে ব্যবহার করা যেতে পারে, অন্য দুটি অভ্যন্তরীণ প্রক্রিয়া রয়েছে। আমি এখানে দুটি বাহ্যিক প্রকারটি স্পষ্ট করে বলি। অন্যান্য দুটি টিউটোরিয়ালে বর্ণিত হতে চলেছে একবার আমরা টাইমারে পৌঁছে এবং ডেটা সংরক্ষণ করি।

আপনি যদি পিআইসির পিন-আউট পরীক্ষা করে দেখে থাকেন তবে আপনি দেখতে পাবেন যে পিন 6 এটি আরবি 0 / আইএনটি is এই মুহুর্তে, আরবি 0 স্পষ্টভাবে পোর্ট বি বিট 0 আইএনটি প্রতিনিধিত্ব করে যে এটি পাশাপাশি বাইরের বিঘ্নিত পিন হিসাবে কনফিগার করা যেতে পারে। তদ্ব্যতীত, পোর্ট বি পিনগুলি 4 থেকে 7 (পিন 10 থেকে 13) ব্যাঘাতের জন্যও ব্যবহার করা যেতে পারে। আমরা আইএনটি বা অন্য কোনও পোর্ট বি পিন নিয়োগ করতে সক্ষম হওয়ার আগে আমাদের অবশ্যই দুটি কাজ সম্পাদন করতে হবে। খুব আগে আমাদের পিআইসিকে অবহিত করতে হবে যে আমরা বাধা ব্যবহার করব।

এরপরে, আমাদের অবশ্যই কোন পোর্ট বি পিনটি আই / ও পিনের পরিবর্তে বাধা হিসাবে ব্যবহার করতে যাচ্ছি তা নির্ধারণ করতে হবে। পিআইসির অভ্যন্তরে আপনি আইএনটিসিএন নামে পরিচিত একটি রেজিস্টার খুঁজে পেতে পারেন এবং ঠিক 0Bh ঠিকানায় রয়েছে। এই রেজিস্টারটিতে আপনি 8 টি বিট আবিষ্কার করবেন যা সক্ষম বা অক্ষম হতে পারে। INTCON এর বিট 7 টি জিআইই হিসাবে পরিচিত। এটি হ'ল গ্লোবাল ইন্টাররঙ্গুপেট সক্ষম। এটি 1 এ স্থির করে পিআইসিকে অবহিত করে যে আমরা একটি বাধা নিয়োগ করব।

INTCON এর বিট 4 আইএনটিই, ইনটারপ্রেট সক্ষম হিসাবে পরিচিত। এই বিটটিকে 1 তে পৌঁছে দেওয়া পিআইসিকে জানিয়েছে যে আরবি 0 একটি বাধা পিন হতে চলেছে। বিট 3 কনফিগার করে, আরবিআইই নামে পরিচিত, পিআইসি-কে অবহিত করে যে আমরা পোর্ট বি বিটগুলি 4 থেকে 7 ব্যবহার করতে যাচ্ছি এই মুহূর্তে পিআইসি বুঝতে পারে কখন এই পিনটি উচ্চ বা নিম্ন হতে পারে, এটি কী সম্পাদন করছে এবং থামাতে হবে এবং একটি বাধা নিয়ে এগিয়ে যেতে হবে রুটিন এই মুহুর্তে, আমাদের অবশ্যই পিআইসিকে অবহিত করতে হবে বা বিঘ্নিত হওয়ার সম্ভাবনাটি (0V থেকে + 5V) বা ড্রপিং প্রান্তে (+ 5V থেকে 0 ভি) সিগন্যালের রূপান্তরিত হবে কিনা we

সহজ কথায় বলতে গেলে, আমরা কী সিআইসিএলটি নীচ থেকে উচ্চে, বা উচ্চ থেকে নীচে চলে যাবে প্রতিবার বাধা সৃষ্টি করুক wish অপরাধের দ্বারা, এটি উঠতি প্রান্তে স্থাপন করা যেতে পারে।

‘ট্রিগার’ প্রান্তটি একটি অতিরিক্ত রেজিস্টারে অপশন রেজিস্টার হিসাবে নির্ধারিত হয়েছে, ঠিকানায় ৮১ এ ঠিকানায়। আমরা যে বিটটি সম্পর্কে উত্সাহী তা বিট 6, প্রায়শই INTEDG হিসাবে পরিচিত।

এটির 1 সেট করা পিককে মাউন্টিং এজ (ডিফল্ট অবস্থা) এ ব্যাহত করতে ট্রিগার করে এবং 0 এ সেট করা PIC কে স্লাইডিং প্রান্তে ব্যাহত করতে উত্সাহিত করে। আপনি যদি পিআইসিকে ক্রমবর্ধমান প্রান্তে সক্রিয় করতে চান তবে অবশ্যই আপনাকে এই বিটের জন্য কিছু করতে হবে না।

এই মুহুর্তে, দুর্ভাগ্যক্রমে, অপশন রেজিস্টারটি ব্যাংক 1 এ রয়েছে, যার অর্থ আমরা ব্যাংক 0 থেকে ব্যাংক 1 এ সংশোধন করতে উপভোগ করি, অপশন রেজিস্টারে বিট সেট করি, তার পরে ব্যাঙ্কে ফিরে আসুন 0 এখানে মূল কীটি প্রতিটি বিটটি সম্পন্ন করতে হবে ব্যাংকের 1 টি একটি একক ধর্মঘটে নিবন্ধন করে, উদাহরণস্বরূপ পোর্ট পিন স্থাপন করা, তার পরে আপনার 0 হয়ে গেলে ব্যাংক 0 এ ফিরে আসুন।

সূক্ষ্ম, ফলস্বরূপ আমরা পিআইসিকে অবহিত করেছি কোন পিনটি সম্ভবত বাধা সৃষ্টি করবে এবং প্রান্তটি কখন প্রবাহিত হবে, প্রোগ্রামে আর পিআইসি কোন সময় বাধা ঘটবে তাতে কী ঘটে? বেশ কয়েকটি স্টাফ নেয়। খুব আগে, একটি ‘পতাকা’ নির্ধারিত।

এটি পিআইসির অভ্যন্তরীণ প্রসেসরকে অবহিত করে যে একটি বাধা স্থানান্তরিত হয়েছে। এরপরে, প্রোগ্রামের কাউন্টারে (যা আমি পূর্ববর্তী টিউটোরিয়ালের মধ্যেই কথা বললাম) পিআইসির মধ্যে একটি নির্দিষ্ট ঠিকানার টিপস। আসুন দ্রুত এই সমস্ত স্বতন্ত্রভাবে পরীক্ষা করা যাক। বাধা পতাকা আমাদের INTCON রেজিস্টারে, বিট 1 হ'ল বিঘ্নিত পতাকা, যা INTF নামে পরিচিত। এই সময়ে, যখনই কোনও বাধা আসে, এই পতাকাটি সম্ভবত 1-এ স্থির হবে।

যখন কোনও বাধা নেই, পতাকাটি 0 এ স্থাপন করা হয় well পাশাপাশি এটি প্রায় সমস্ত সাফল্য। এই মুহুর্তে আপনি ভাবতে পারেন ‘কোন বিষয়টি?’ নিশ্চয়ই, এই পতাকাটি 1 টি নির্ধারিত হলেও, পিআইসি সক্ষম হতে পারে না এবং করতে পারে না, অন্য কোনও বাধায় প্রতিক্রিয়া জানায়। অতএব, আসুন আমরা প্রকাশ করি যে আমরা একটি বাধা আনছি। পতাকাটি সম্ভবত 1-এ স্থির হবে এবং পিক বাধা দেওয়ার জন্য আমাদের রুটিনে যেতে পারে।

যখন এই পতাকাটি 1-এ স্থির করা হয়নি, এবং পিআইসিকে বাধা দেওয়া উত্তর দেওয়া চালিয়ে যাওয়ার অনুমতি দেওয়া হয়েছিল, তারপরে ক্রমাগত পিনটি সঞ্চার করা পিআইসি আমাদের বাধা রুটিনির শুরুতে ফিরে আসতে পারে, এবং কোনও উপায়ে এটি সম্পূর্ণ করে না। টেলিফোনের আমার দৃষ্টান্তটিতে ফিরে আসা, এটি টেলিফোনটি তোলার মতো, এবং সঙ্গে সঙ্গে একবার আলোচনা করার জন্য এটি আবার বাজে শুরু হয় যেহেতু অন্য ব্যক্তি আপনার সাথে কথা বলতে চান।

একটি কথোপকথন সম্পূর্ণ করার পরামর্শ দেওয়া হয়, তারপরে পরবর্তী ব্যক্তির সাথে কথা বলতে আবার ফোন ধরুন grab আপনি এই পতাকাটিতে একটি ছোট সমস্যা খুঁজে পেতে পারেন। যদিও পিআইসি দ্রুত এই পতাকাটি 1 এ সেট করে, এটি আবার 0 সেট করে না! এই ক্রিয়াকলাপটি অবশ্যই প্রোগ্রামার দ্বারা প্রয়োগ করা উচিত - যেমন আপনি। এটি অনায়াসেই সম্পন্ন করা যায়, যেহেতু আমি নির্দিষ্ট ধারণা করছি এবং পিআইসি বাধা রুটিন সম্পাদন করার পরে এটি অর্জন করা দরকার।

স্মৃতি অবস্থান যখনই আপনি প্রাথমিকভাবে পিক আপকে ক্ষমতা দেবেন, বা যদি কোনও পুনরায় সেট করা থাকে তবে 0000 ঘন্টা ঠিকানার জন্য প্রোগ্রামের কাউন্টার টিপস যা প্রোগ্রামের মেমোরির প্রারম্ভেই অনন্তর হতে পারে। তবে, যদি কোনও বাধা থাকে, প্রোগ্রাম কাউন্টারটি ঠিকানাটি 0004 ঘন্টা নির্দেশ করে।

সুতরাং, যখন আমরা আমাদের প্রোগ্রামটি রচনা করছি যা বাধা থাকবে, তখন আমাদের প্রথমে পিআইসিকে অবশ্যই 0004 ঘন্টা ঠিকানার উপর নজর দিতে হবে, এবং প্রোগ্রামটির বাকী অংশ থেকে 10,0004 ঘন্টার ঠিকানাতে শুরু হওয়া বাধাপ্রাপ্ত রুটিন বজায় রাখতে হবে।

এটি সম্পাদন করতে ঝামেলা-মুক্ত হতে পারে। প্রাথমিকভাবে, আমরা ওআরজি হিসাবে পরিচিত একটি কমান্ড দিয়ে আমাদের প্রোগ্রামটি শুরু করি। এই কমান্ডটি মূল বা সূচনা নির্দেশ করে। আমরা একটি ঠিকানা দিয়ে এটি আটকে। যেহেতু পিআইসি 0000 ঘন্টা ঠিকানায় শুরু হয়, আমরা ORG 0000h টাইপ করি। এর পরে আমাদের অবশ্যই 0004 ঘন্টা ঠিকানার বাইরে যেতে হবে। আমরা একটি GOTO নির্দেশনা স্থাপন করে এটি সম্পাদন করি, এটির সাথে একটি লেবেল যা আমাদের প্রাথমিক প্রোগ্রামটির পরামর্শ দেয়।

আমরা এর পরে আরও একটি ওআরজি সহ এই গোটো কমান্ডটি মেনে চলি, এই মুহুর্তটি 0004h ঠিকানার সাথে। এই আদেশের পরে আমরা আমাদের বাধা রুটিন সন্নিবেশ করব। এই মুহুর্তে, আমরা সম্ভবত দ্বিতীয় ওআরজি কমান্ড অনুসরণ করে আমাদের বিঘ্নিত রুটিনটি সম্ভবত টাইপ করতে সক্ষম হতে পারি, বা আমরা জিওটিও বিবৃতিটি অবস্থান করতে সক্ষম হয়েছি যা বাধা রুটিনকে নির্দেশ করে।

এটি সত্যই আপনার পক্ষে বিকল্পের সাথে সম্পর্কিত। পিআইসিকে অবহিত রুটিনের উপসংহারে পৌঁছে দেওয়ার বিষয়টি অবহিত করার জন্য আমাদের অবশ্যই রুটিনের শেষের দিকে আরটিএফআইই কমান্ডটি স্থাপন করতে হবে। এই কমান্ডটি বিঘ্নিত রুটিন থেকে ফিরে আসার ইঙ্গিত দেয়। পিআইসি এটি নোটিশ করার সময়, প্রোগ্রাম কাউন্টারটি বাধা দেওয়ার আগে পিআইসি যে চূড়ান্ত অবস্থানে ছিল তা নির্দেশ করে। উপরেরটি প্রদর্শন করতে আমরা কোডের একটি সংক্ষিপ্ত বিভাগের নীচে স্থাপন করেছি:

বাধা ব্যবহার করার সময় আপনাকে বেশ কয়েকটি স্টাফ অবহিত করতে হবে। প্রাথমিকভাবে প্রবণতাটি হ'ল যদি আপনি আপনার প্রাথমিক প্রোগ্রামে এবং একইভাবে বাধা রুটিনে অভিন্ন রেজিস্টারটি ব্যবহার করে থাকেন তবে মনে রাখবেন যে বাধাগ্রস্ত হওয়ার পরে নিবন্ধের বিবরণ সম্ভবত বদলে যাবে।

উদাহরণস্বরূপ, ডাব্লু রেজিস্টারটি পোর্ট এ প্রাথমিক প্রোগ্রামে ডেটা ফরোয়ার্ডের জন্য ব্যবহার করা যাক, সুতরাং আপনি অতিরিক্তভাবে বাধা নিবন্ধে ডাব্লু রেজিস্টারকে ডেটা এক গন্তব্য থেকে অন্য গন্তব্যে স্থানান্তর করতে ব্যবহার করতে পারেন।

আপনি যদি সাবধান না হন তবে ডাব্লু রেজিস্টারে অন্তর্ভুক্ত হওয়া রুটিনের সময় প্রাপ্ত সর্বশেষ মূল্য অন্তর্ভুক্ত থাকবে, সুতরাং আপনি যখন বাধা থেকে ফিরে আসেন তখন এই তথ্যটি আপনার পূর্ববর্তী মানটির পরিবর্তে পোর্ট এ-তে সরবরাহ করা হবে is বাধা ঘটেছে।

এর চারপাশের উপায়গুলি হ'ল আপনি যখন বাধা রুটিনে আবার এটি ব্যবহার করেন তার আগে ডাব্লু রেজিস্টারের বিশদটি মুহূর্তের জন্য সংরক্ষণ করা। দ্বিতীয়টি হ'ল আপনি যখন কোনও বাধা সংঘটিত হয় এবং যখন পরবর্তী কোনওটি উত্থাপিত হতে পারে তার মধ্যে আপনি বিলম্ব খুঁজে পেতে পারেন। আপনি যখন বুঝতে পেরেছেন, পিআইসির একটি বহির্মুখী ঘড়ি রয়েছে, যা সম্ভবত স্ফটিক হতে পারে বা এটি একটি প্রতিরোধক-ক্যাপাসিটার কম্বো হতে পারে।

এই ঘড়ির ফ্রিকোয়েন্সিটি যাই হোক না কেন, পিআইসি এটিকে 4 দ্বারা ভাগ করে দেয় যার পরে এটি এর অভ্যন্তরীণ সময়সীমার জন্য নিযুক্ত করে। উদাহরণস্বরূপ, আপনার পিআইসির সাথে যদি আপনার 4MHz স্ফটিক লিঙ্কযুক্ত থাকে, সেক্ষেত্রে পিআইসি 1MHz তে নির্দেশনাটি সম্পাদন করবে। এই অভ্যন্তরীণ সময়টি নির্দেশ চক্র হিসাবে পরিচিত। এই মুহুর্তে, ডেটা শীট দাবি করে (নিঃসন্দেহে স্বল্প প্রিন্টে) যে আপনাকে বিঘ্নের মধ্যে 3 থেকে 4 টি নির্দেশ রাউন্ড সক্ষম করতে হবে।

আমার 4 রাউন্ড সক্ষম করা হবে। বিলম্বের পিছনে কারণ হ'ল পিআইসি-র জন্য বাধা ঠিকানা, পতাকাটিতে ঝাঁপিয়ে পড়া এবং বিঘ্নিত রুটিন থেকে দূরে ফিরে আসতে সময় প্রয়োজন। অতএব, আপনি যদি পিকের জন্য কোনও বাধা সক্রিয় করতে বিকল্প সার্কিটের সাথে কাজ করেন তবে এটি আপনার মনে রাখবেন।

এই মুহুর্তে, একটি বিন্দুটি হ'ল সত্য যে আপনি যদি পোর্ট বি এর 4 থেকে 7 বিটকে একটি বাধা হিসাবে ব্যবহার করেন। বাধা হিসাবে কাজ করতে আপনি পোর্ট বিতে নির্দিষ্ট পিনগুলি চয়ন করতে অক্ষম।

অতএব, আপনি যদি এই পিনগুলিকে অনুমতি দেন তবে সেগুলি সম্ভবত সবগুলি পাওয়া সম্ভব। অতএব, উদাহরণস্বরূপ, আপনার কাছে সহজলভ্য 4 এবং 5 বিট থাকতে পারে না - 6 এবং 7 বিট সম্ভবত একই সময়ে ক্ষমতায়িত হবে। একটি বিঘ্নিত প্রতিনিধিত্ব করার জন্য চারটি বিট পাওয়ার উদ্দেশ্য কী? অবশ্যই, আপনি পিআইসির কাছে একটি সার্কিট জড়িয়ে থাকতে পারেন, যদি চারটি লাইনের যে কেউ উচ্চ হয়ে যায়, সেক্ষেত্রে এটি এমন সমস্যা হতে পারে যা আপনার তাত্ক্ষণিকভাবে পিআইসিকে প্রভাবিত করতে হবে।

এর একটি উদাহরণ হোম সিকিউরিটি অ্যালার্ম হতে পারে, যার মধ্যে চারটি সেন্সর পোর্ট বি পিনের সাথে 4 থেকে 7 টি সংযুক্ত রয়েছে যে কোনও নির্দিষ্ট সেন্সর পিআইসিকে একটি অ্যালার্মকে ট্রিগার করতে অনুরোধ করতে পারে, এবং অ্যালার্ম সংকেত রুটিন হ'ল বিযুক্ত রুটিন। এটি বন্দরগুলি নিয়মিত চেক করা ছাড়ায় এবং পিআইসিকে বিভিন্ন বিষয়ে চালিয়ে যাওয়ার অনুমতি দেয়। পরবর্তী টিউটোরিয়ালের মধ্যে, আমরা একটি বাধাকে পরিচালনা করার জন্য একটি প্রোগ্রাম রচনা করতে যাচ্ছি।

আমরা শেষ টিউটোরিয়ালের মধ্যে অনেকগুলি বুনিয়াদি নিয়ে কাজ করেছি, সুতরাং আমি অনুভব করি যে সময়টি এসে গেছে যে আমরা আমাদের প্রথম প্রোগ্রামটি রচনা করেছি।

আমরা যে প্রোগ্রামটি লিখব তা উপলক্ষে যে পরিমাণে আমরা একটি স্যুইচ চালু করি তার পরিমাণ গণনা করব এবং তারপরে সংখ্যাটি প্রদর্শন করব।

প্রোগ্রামটি 0 থেকে 9 পর্যন্ত গণনা করা হবে, বাইনারি আকারে 4 টি এলইডিতে দৃশ্যমান, ইনপুট বা বাধাদানের পাশাপাশি আরবি 0-তে থাকবে।

আমাদের প্রথম একটি বিষয় যা করা উচিত তা হ'ল পিআইসিকে যে ঠিকানাটিতে প্রোগ্রাম কাউন্টারটি যখনই বাধা দেয় তখন তার ঠিকানাটি লাফিয়ে উঠতে জানায়।

আপনি লক্ষ্য করবেন যে আমরা হেক্সাডেসিমাল সংখ্যা প্রদর্শন করার একটি অনন্য পদ্ধতি নিয়োগ করছি। আমি হওয়ার আগে এফ 9 এইচ প্রয়োগ করুন যাতে এইচটি হেক্সাডেসিমাল নির্দেশ করেছে। আমরা এটি 0xF9 হিসাবে লিখতে পারি, এটি এখন থেকেই আমরা কাঠামোটি নিযুক্ত করব।

এখন আমাদের পিআইসিকে জানাতে হবে যে আমরা ব্যাঘাতগুলি ব্যবহার করতে যাচ্ছি, এবং আমরা আরবি0 পিন 6 একটি ব্যাঘাতযুক্ত পিন হিসাবে ব্যবহার করছি:

বিএসএফ ইনট্যাকন, 7 জিআইই - গ্লোবাল ইন্টারপেট সক্ষম (1 = সক্ষম)
বিএসএফ ইনট্যাকন, 4 আইএনটিই - আরবি0 ইন্টারপ্রেট সক্ষম (1 = সক্ষম)
আমি কেবল বাধাগ্রস্থ পতাকা সাফ করতে যাচ্ছি (আমি কখনই বিশ্বাস করি না!)
বিসিএফ ইনট্যাকন, 1 আইএনটিএফ - ঠিক সেক্ষেত্রে ফ্ল্যাগ বিট সাফ করুন

বর্তমানে আমাদের অবশ্যই আমাদের 2 বন্দর স্থাপন করতে হবে। মনে রাখবেন যে আমরা এখন আরবি0 কে একটি বাধা পিন হিসাবে ব্যবহার করছি, এটি একটি ইনপুট হিসাবে প্রতিষ্ঠিত করা প্রয়োজন:

স্যুইচ গণনার সংখ্যা সঞ্চয় করতে আমরা COUNT নামক একটি পরিবর্তনশীল ব্যবহার করতে যাচ্ছি। আমরা কেবল পোর্ট এ-তে কেবল মূল্য বাড়িয়ে দিতে পারি, তবে আপনি দেখবেন যে আমরা যখন আমাদের বাধা রুটিন লিখি তখন কেন আমি একটি পরিবর্তনশীল ব্যবহার করছি।

অতএব, আমাদের মূল প্রোগ্রামটি রচিত, এবং এই মুহুর্তে আমাদের অবশ্যই পিআইসিকে অবহিত করতে হবে যখনই কোনও বাধা ঘটে তখন কীভাবে এগিয়ে যেতে হয়। এই উদাহরণের মধ্যে, আমাদের বাধা সম্ভবত সুইচ হবে। প্রতিবার স্যুইচটি সীমাবদ্ধ থাকাকালীন আমরা কেবল পিকটি যা করতে চাই তা হ'ল স্থায়ী COUNT এর কাছে একটি।

তবুও, আমরা কেবল 0 থেকে 9 পর্যন্ত স্যুইচটি বন্ধ হয়ে যাওয়ার কতগুলি অনুষ্ঠান দেখানোর ইচ্ছা করি উপরে উপরে, আমি বলেছি যে প্রতিবার যখন কোনও বাধা আছে তখন আমরা কেবল পোর্ট এ-তে মান বাড়িয়ে দিতে সক্ষম হতে পারি। যাইহোক, পোর্ট এ এর ​​5 টি বিট রয়েছে, যদি আমরা কেবল বন্দরটিকে বাড়িয়ে তুলি তবে আমরা সর্বোচ্চ 31 টি গণনা অর্জন করতে যাচ্ছি There এখানে 31 টিতে না যাওয়ার জন্য কেন কয়েকটি ব্যাখ্যা রয়েছে।

প্রাথমিকভাবে, আমরা একটি 7-বিভাগের স্ক্রিন নিয়োগ করব, যা সর্বাধিক কেবল 0 থেকে 15 (হেক্সে 0 থেকে এফ) যেতে পারে। পরবর্তী, আমি অতিরিক্ত কয়েকটি পাটিগণিত কমান্ডও আপনাকে প্রদর্শন করতে চাই যা আপনি বিগত কয়েকটি পাঠের ক্ষেত্রে হোঁচট খেয়েছিলেন।

তাই আমরা আমাদের বাধা রুটিন দিয়ে চালিয়ে যাব। বর্তমানে আমাদের প্রথম যেটি সম্পন্ন করতে হবে তা হ'ল সংক্ষেপে আমাদের ডাব্লু রেজিস্টারের বিবরণ সংরক্ষণ করুন, যেহেতু আমরা COUNT এর বিষয়বস্তুগুলি পোর্টে স্থানান্তর করতে এটি প্রয়োগ করে আসছি। যদি আমরা এটি সংরক্ষণ না করি, সেক্ষেত্রে আমরা আমাদের পাটিগণিতের কারণে একেবারে আলাদা সংখ্যা সরবরাহ করতে সক্ষম হতে পারি। সুতরাং আসুন প্রথমে এটি সম্পাদন করা যাক:

এই মুহুর্তে আমরা বুঝতে পারি যে COUNT এর মান 9 বা তার বেশি হয়। আমাদের এখনই যেটি অর্জন করা দরকার তা হ'ল যদি COUNT টি 9 এর বেশি হয় তবে এটি 0 এ আবার রাখুন, বা অন্যথায় মূল প্রোগ্রামে ফিরে এসে নিশ্চিত করুন যে আমরা এটি পোর্ট এ-তে পৌঁছে দিতে সক্ষম হয়েছি বিটিএফএসএস কমান্ড যেহেতু আপনি বুঝতে পেরেছেন পরবর্তীকালে
ক্যারি পতাকা নির্ধারিত হওয়ার ক্ষেত্রে নির্দেশনা অর্থাত্ COUNT = 10:

এখন যা করা বাকি রয়েছে তা হ'ল সম্মিলিতভাবে প্রবেশ করা এবং আমাদের ধ্রুবকের মান নির্ধারণ করা, যা আমরা আমাদের প্রোগ্রামের শুরুতে ঠিক পারফর্ম করতে সক্ষম হয়েছি।

প্রতিবার আপনি স্যুইচটি চালু করার সময়, এলইডিগুলি 0000 থেকে 1010 এর পরে বাইনারিতে গণনা করতে চলেছে তবে 0000 এ ফিরে আসবে।

নিম্নলিখিত চিত্রটি উপরের বর্ণিত কোডের সাথে সার্কিট ডায়াগ্রামের সাথে সামঞ্জস্যপূর্ণ দেখায়। আকর্ষণীয়ভাবে আপনি দেখতে পাবেন যে টাইমিং ক্যাপাসিটারটি নকশায় অন্তর্ভুক্ত করা হয়েছে। এটি একটি দুর্দান্ত সামান্য চালাকি যার মাধ্যমে আপনি যদি সেই সময়ের মধ্যে আপনার সাথে কিছু না পান তবে ক্যাপাসিটরের অন্তর্ভুক্তি এড়াতে স্বাধীনতা পান।

এখানে ক্যাপাসিটেন্স অসিলেটর পিন এবং গ্রাউন্ড জুড়ে বিপথগামী ক্যাপাসিট্যান্সের মাধ্যমে খেলতে আসে।
অবশ্যই এটি সম্ভবত ক্যাপাসিটর এড়ানো একটি খুব বুদ্ধিমান উপায় বলে মনে হচ্ছে না কারণ বিপথগামী মান বিভিন্ন প্রদত্ত শর্তের সাথে পৃথক হতে পারে।

অন্য একটি বিভাগ যা সার্কিটের মধ্যে প্রত্যক্ষ করা যায় তা হ'ল সুইচ জুড়ে নিন্দনকারী নেটওয়ার্ক। এটি যান্ত্রিক স্যুইচিংয়ের সময় হস্তক্ষেপ রোধ করে এবং পিআইসিকে বিভ্রান্ত হতে বাধা দেয় যদি স্যুইচিংটি একক টগল বা একাধিক টগল ছিল।




পূর্ববর্তী: প্রোগ্রামেবল দ্বি-নির্দেশমূলক মোটর টাইমার সার্কিট পরবর্তী: বাক-বুস্ট সার্কিট কীভাবে কাজ করে