ইনপুট দেবার পদ্ধতিটা আউটপুট নেয়ার চেয়ে একটু জটিল। জিনিসটি একটি এনালজি দিয়ে বুঝার চেষ্টা করি। আমরা বাসার গেট লাগানো। এখন কেউ যদি আমার বাসার গেটের বাইরে দাঁড়িয়ে থাকে তাহলে আমার জানার কথা নয়। এখন যদি আমি একজন দারোয়ান রাখি কেউ কি এলো কিনা তা দেখার জন্য তাহলে কি হবে? কেউ আসলে সে আমাকে জানাবে এবং সে অনুযায়ী কাজ করবে। ঠিক এভাবেই মাইক্রোকন্ট্রোলারে ইনপুট নেয়ার কাজ করা হয়। প্রথমে আমাকে চেক করতে হবে যে পিনকে আমি ইনপুট হিসেবে রেখেছি তাতে কোন সাড়া এলো কিনা। যদি এসে থাকে তাহলে কি করতে হবে তারপর তা বলে দিতে হবে। অনেকে এই কাজটি অনেক ভাবেই করে থাকে। তবে সবচে সহজ হল bit_is_set() অথবা bit_is_clear() ফাংশন দুটি ব্যবহার করা। ধরি, আমদের মাইক্রোকন্ট্রোলারের Port B এর তৃতীয় পিনে একটি বাটন লাগানো। বাটনটির অপর প্রান্ত গ্রাউন্ড করা। তার মানে হল যখন আমরা বাটনটি চাপবো তখন সার্কিটটি ক্লোজ হবে এবং মাইক্রোকন্ট্রোলারের Port B এর তৃতীয় পিন গ্রাউন্ড হবে। অর্থাৎ পিনটি Clear হয়ে যাবে। এখন আমরা চেক করবো বিটটি clear করা নাকি আমাদের লিখতে হবে bit_is_clear(PINB, 3)। এখন যদি বিট ক্লিয়ার হয় তবে আমরা Port B এর চতুর্থ পিনে লাগানো একটি LED জ্বালাতে চাই। তাহলে লিখতে হবে
1
2
3
if(bit_is_clear(PINB, 3)){
PORTB| = (1<<4);
}
তবে কিছু সমস্যা আছে। এভাবে ইনপুট দিলে মাইক্রোকন্ট্রোলারের প্রসেস হয় খুবই Slow এবং Accuracy থাকে খুবই কম। না না Code এ কোন সমস্যা নেই তবে সমস্যা আছে অন্য জায়গায়। আমরা বললাম যে বাটন প্রেস করলে পিনটি গ্রাউন্ড হয়ে যাবে। কিন্তু প্রেস করার আগ মুহূর্তে কি অবস্থায় থাকবে? একটিভ না ইনএকটিভ? সোজা বাংলায় কোনটিই না। এই অবস্থাকে বলা হয় Floating অবস্থা। এই অবস্থায় মাইক্রোকন্ট্রোলার ঠিক বুঝে উঠতে পারে না যে পিনটি কোন state এ আছে। তাই প্রসেস করতে মাইক্রোকন্ট্রোলারের সমস্যা হয়। এই সমস্যা থেকে পরিত্রাণ পেতে পিনটিকে একটি Default অবস্থায় নিয়ে আসতে হয়। কোন ইনপুট পিনকে দুই পদ্ধতিতে Default অবস্থায় আনা যায়। প্রথম পদ্ধতিতে পিনটিকে একটি উচ্চ রোধের (সাধারণত 10k) Resistorমাধ্যমে Ground করে Default ভাবে Inactive অথবা VCC তে লাগিয়ে Default ভাবে Active করা হয়ে থাকে। এই পদ্ধতিকে বলা External Pull-Up পদ্ধতি। এক্ষেত্রে ব্যবহৃত Resistor কে বলা হয় Pull-Up Resistor।
দ্বিতীয় পদ্ধতিকে বলা হয় Internal Pull-Up পদ্ধতি। এই পদ্ধতিতে মাইক্রোকন্ট্রোলারের Internal Pull-Up Resistor কে High অথবা Low করে পিনটিকে Default ভাবে High অথবা Low করা হয়। এই পদ্ধতিতে কোন External Resistor এর দরকার হয় না। ধরি, আমরা Port B এর তৃতীয় পিনকে Default ভাবে High করতে চাই। এজন্য যা করতে হবে টা হল প্রোগ্রামের DDR Declare করার পর PORTB | = 1«3; লিখতে হবে। অর্থাৎ জিনিসটি হবে এরকম। |
1
2
DDRB& = ~(1<<3); // DDR সেট করা হল।
PORTB | = (1<<3); // Internal Pull-Up Resistor কে High করা হল।
তবে যদি কারো খুবই Fast Response দরকার হয় তবে দ্বিতীয় পদ্ধতি ব্যবহার না করাই ভালো। যদিও ৯০% ক্ষেত্রে দ্বিতীয় পদ্ধতিতে কোন সমস্যা হবার কথা নয়। তবে এখানেই শেষ নয়। তোমাদের জন্য অপেক্ষা করছে আরেক বিভীষিকা যার না হল ‘ডিবাউন্স’।