পোর্টকন্ট্রলঃ ইনপুট-আউটপুটঃ (মাইক্রোকন্ট্রলারের সহজ পাঠঃ ৫ম কিস্তি)

7
398

io_ports_input_real

এই কিস্তিতে আমরা মাইক্রোকন্ট্রলারের ইনপুট কন্ট্রলের সাথে পরিচিত হব। ইনপুট হিসাবে সবচেয়ে সহজ ডিভাইস দুটি পুশ বাটন নির্বাচন করি এবং নিচের মতো সার্কিট সাজাইঃ

io_ports_intro_input

 

পুশবাটন দুটি ২৩ ও ২৪ নাম্বার পিন (PC0 , PC1) কে গ্রাউন্ডে যুক্ত করে। এখন নিচের কমান্ড দেইঃ

///////////////////////
#include <avr/io.h>
int main (void)
{
	DDRD  = 0b11111111;   // All outputs
	DDRC  = 0b11111100;   // set PC0 & PC1 to input
	PORTC = 0b00000011;   // set PC0 & PC1 to high
	while(1)
	{
		PORTD = PINC;
	}
}

# DDRD  = 0b11111111;  পোর্ট D এর সব পিনকে আউটপুট হিসাবে সেট করে

# DDRC  = 0b11111100; কমান্ড C পোর্টের ডানের দুই বিট (, PC1) কে ইনপুট হিসাবে সেট করে।

# PORTC = 0b00000011;   কমান্ড PC0 , PC1 =1 বা হাই হিসাবে সেট করে।

while(1){PORTD = PINC;} কমান্ড পোর্ট D এর আউটপুটের দশা pinC এর অনুরূপ করে। যেমন যতক্ষন পুশবাটন চাপা না হয় PC0 =1 বা হাই থাকে ততক্ষন PD0=1 বা হাই থাকে। মানে PD0 এর লেড জ্বলতে থাকে। PC0 এর যুক্ত পুশবাটন চাপার সাথে সাথে তা গ্রাউন্ডে যুক্ত হলে PC0=0 হয়ে যায় আবার যেহেতু PC0=PD0 তাই PD0 এর সাথে যুক্ত লেড (LED) বন্ধ হয়ে যায়।

while(1){PORTD = !PINC;} এটিতে কি হতে পারে তা সহজেই অনুমেয় (!=উলটা)।

 

PINx & _BV(y)) ম্যাক্রোটি দিয়ে আমরা ইনপুটপিনের অবস্থা চেক করা যায়। যেমন নিচের কোড দিয়ে PINC এর 0 পিনে যুক্ত (PC0) পুশবাটন চেপে আমরা যে কোন ফাংশন এক্সিকিউট করতে পারিঃ

////////////////////
if ((PINC & _BV(0))==0) //if button on PC0 is pressed
{
	any_function();
}

 

অথবা নিচের bit_is_set (মানে, হাইনাকি?) বা bit_is_clear (লো নাকি?) ম্যাক্রো দিয়ে বিট চেক করা যায়। যেমন নিচে PINC এর 0 পিনটিকি বন্ধ তা চেক করা হচ্ছে।

/////////////////////
if (bit_is_clear(PINC,0)) //if button on PC0 is pressed
{
	any_function ();
}

 

এখন ম্যাক্রো দিয়ে কিভাবে ফাংশন এক্সিকিউট করি তা দেখি

//////////////////////////
#include <avr/io.h>
#include <util/delay.h>
void blink_3_times(void)
{
	for (int i=0;i<3;i++)
	{
		PORTD = 0b11111111;
		_delay_ms(250);
		PORTD = 0b00000000;
		_delay_ms(250);
	}
}

void sweep()
{
	PORTD = 0b10000000;
	for (int i=0;i<8;i++)
	{
		_delay_ms(100);
		PORTD >>= 1;
	}
}

int main (void)
{
	DDRD  = 0b11111111;   // All outputs
	DDRC  = 0b11111100;   // set PC0 & PC1 to input
	PORTC = 0b00000011;   // set PC0 & PC1 to high
	while(1)
	{
		if (bit_is_clear(PINC,0)) //if button on PC0 is pressed
		{
			blink_3_times();
		}
		if (bit_is_clear(PINC,1)) //if button on PC1 is pressed
		{
			sweep();
		}

	}
}

এখানে   blink_3_times() , sweep() নামে দুটি ফাংশন তৈরী করা হয়েছে। প্রথম ফাংশনটি দ্বারা PORTD এর প্রতিটি লেড কে ৩ বার ফ্লাশিং করা হয়। পরের ফাংশনটি দ্বারা লেডগুলাকে সুইপ (একপাশ থেকে ক্রমান্বয়ে জ্বলে নিভে যাওয়া) করা হয়। blink_3_times() ফাংশনটি প্রথম পুশ বাটনের সাথে আর দ্বিতীয় বাটনটিকে sweep() ফাংশনের সাথে প্রোগ্রামিটিক্যালি যুক্ত করা হয়েছে।

<< ৪র্থ কিস্তি এখানে                          ৬ষ্ঠ কিস্তি এখানে >>

7 মন্তব্য

  1. স্যার,
    অামি প্রোগ্রামিং শিখতে চাই,

    কোথাই কম খরচে ভাল মােনর প্রোগ্রাম শিখানু হয়, দয়া করে জানালে উপকৃত হয়তাম।

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

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

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

      মুভিং ডিসপ্লে সম্পর্কে কমেন্টে বলা সম্ভব নয়। নেটে প্রচুর উদাহরন, ভিডিও পাবেন।

  2. AVR এ PortD তে Output হিসেবে এক ধরনের ডিজাইন চলতে থাকবে এবং একই সাথে PortC তে Output হিসেবে অন্য ধরনের ডিজাইন চলবে। এই Program লিখতে হলে কি ধরনের কমান্ড লিখতে হবে?

কমেন্ট করুন-