দুটি ধরণের "পিন চেঞ্জ" টাইপ বাধা রয়েছে। বাহ্যিক বাধা, যার মধ্যে ইউনোতে দুটি রয়েছে। তাদের 0 এবং 1 বলা হয়, তবে তারা বোর্ডের 2 এবং 3 ডিজিটাল পিনগুলি উল্লেখ করে। এগুলি ক্রমবর্ধমান, পতন, পরিবর্তন (উত্থিত বা পতন) বা নিম্নগঠন সনাক্ত করতে কনফিগার করা যেতে পারে ।
এগুলি ছাড়াও "পিন পরিবর্তন" বাধা রয়েছে যা 20 টি পিনের (A0 থেকে A5, এবং D0 থেকে D13) যে কোনওটিতে পিনের অবস্থানে পরিবর্তন সনাক্ত করে। এই পিন পরিবর্তন বিঘ্নগুলিও হার্ডওয়্যার ভিত্তিক, সুতরাং এগুলি নিজের মধ্যে বাহ্যিক বাধা হিসাবে তত দ্রুত হবে।
উভয় প্রকারের রেজিস্ট্রার স্তরে ব্যবহার করার জন্য কিছুটা বেআইনীভাবে স্ট্যান্ডার্ড, তবে স্ট্যান্ডার্ড আইডিইতে সংযুক্তি অন্তর্ভুক্ত করা হয় (এন) এবং ডিটাচ ইনটারপ্রেট (এন) যা ইন্টারফেসটিকে বহিরাগত বাধাতে সহজতর করে। আপনি পিন পরিবর্তন বিঘ্ন সরল করতে পিন পরিবর্তন লাইব্রেরি ব্যবহার করতে পারেন ।
তবে, এক মিনিটের জন্য লাইব্রেরির স্টিয়ারিং ক্লিয়ার করে, আমরা প্রতিষ্ঠিত করতে পারি যে পিন পরিবর্তন বিঘ্নগুলি বাহ্যিক বাধাগুলির চেয়ে দ্রুত বা দ্রুততর হতে পারে। একটি জিনিসের জন্য, যদিও পিন পরিবর্তনগুলি পিনের ব্যাচে কাজ করে বাধা দেয়, আপনাকে পুরো ব্যাচ সক্ষম করতে হবে না। উদাহরণস্বরূপ, আপনি যদি পিন ডি 4-তে পরিবর্তনগুলি সনাক্ত করতে চান তবে এটি যথেষ্ট হবে:
উদাহরণস্বরূপ স্কেচ:
ISR (PCINT2_vect)
{
// handle pin change interrupt for D0 to D7 here
if (PIND & bit (4)) // if it was high
PORTD |= bit (5); // turn on D5
else
PORTD &= ~bit (5); // turn off D5
} // end of PCINT2_vect
void setup ()
{
// pin change interrupt (example for D4)
PCMSK2 |= bit (PCINT20); // want pin 4
PCIFR |= bit (PCIF2); // clear any outstanding interrupts
PCICR |= bit (PCIE2); // enable pin change interrupts for D0 to D7
pinMode (4, INPUT_PULLUP);
pinMode (5, OUTPUT);
} // end of setup
void loop ()
{
}
আমার পরীক্ষাটি ইঙ্গিত দেয় যে বিঘ্নিত পিন (পিন 4) এর পরিবর্তনে "টেস্ট" পিন (পিন 5) এর প্রতিক্রিয়া দেখাতে 1.6 took সময় লেগেছে।
এখন আপনি যদি সহজ (অলস?) পদ্ধতির অবলম্বন করেন এবং সংযুক্তি ইন্টারপ্রেট () ব্যবহার করেন তবে ফলাফলগুলি ধীর হয়ে যাবে, দ্রুত নয়।
উদাহরণ কোড:
void myInterrupt ()
{
if (PIND & bit (2)) // if it was high
PORTD |= bit (5); // turn on D5
else
PORTD &= ~bit (5); // turn off D5
} // end of myInterrupt
void setup ()
{
attachInterrupt (0, myInterrupt, CHANGE);
pinMode (2, INPUT_PULLUP);
pinMode (5, OUTPUT);
} // end of setup
void loop ()
{
}
এটি পরীক্ষার পিনটি পরিবর্তন করতে 3.7 takes গুলি লাগে যা উপরের 1.6 than এর চেয়ে অনেক বেশি। কেন? কারণ কম্পাইলারটি "জেনেরিক" বিঘ্নিত হ্যান্ডলারের জন্য যে কোডটি তৈরি করতে হয় তা আইএসআর-এ প্রবেশের সময় প্রতিটি কল্পনাযোগ্য রেজিস্টার (তাদের ধাক্কা দিতে হবে) সংরক্ষণ করতে হবে এবং তারপরে ফিরে আসার পূর্বে তাদের (পপগুলি) পুনরুদ্ধার করতে হবে। এছাড়াও অন্য ফাংশন কলের ওভারহেড রয়েছে।
এখন আমরা সংযুক্তি আন্তঃবিঘ্ন () এড়ানো এবং এটি নিজে করে এটিকে ঘিরে কাজ করতে পারি:
ISR (INT0_vect)
{
if (PIND & bit (2)) // if it was high
PORTD |= bit (5); // turn on D5
else
PORTD &= ~bit (5); // turn off D5
} // end of INT0_vect
void setup ()
{
// activate external interrupt 0
EICRA &= ~(bit(ISC00) | bit (ISC01)); // clear existing flags
EICRA |= bit (ISC00); // set wanted flags (any change interrupt)
EIFR = bit (INTF0); // clear flag for interrupt 0
EIMSK |= bit (INT0); // enable it
pinMode (2, INPUT_PULLUP);
pinMode (5, OUTPUT);
} // end of setup
void loop ()
{
}
এটি তাদের মধ্যে 1.52 at দ্রুততম - এটি দেখে মনে হচ্ছে একটি ঘড়ির চক্র কোথাও সংরক্ষণ করা হয়েছে।
পিন-পরিবর্তন বিঘ্নগুলির জন্য যদিও একটি সতর্কতা রয়েছে। এগুলি ব্যাচ করা হয়েছে, সুতরাং আপনি যদি প্রচুর পিনে বাধা রাখতে চান তবে আপনাকে বাধাদির ভিতরে পরীক্ষা করতে হবে যা পরিবর্তন হয়েছে। আপনি আগের পিনের স্থিতি সংরক্ষণ করে এবং এটি নতুন পিনের সাথে তুলনা করে করতে পারেন। এটি অগত্যা বিশেষত ধীর নয়, তবে আপনার যত বেশি পিন পরীক্ষা করতে হবে, এটি ধীর হবে।
ব্যাচগুলি হ'ল:
- এ 0 থেকে এ 5
- ডি 0 থেকে ডি 7
- ডি 8 থেকে ডি 13
আপনি যদি আরও কিছু বিঘ্নিত পিন চান তবে আপনি বিভিন্ন ব্যাচ (যেমন, ডি 4 এবং ডি 8) থেকে পিন ব্যবহার করে কোনও পরীক্ষা এড়াতে পারবেন।
Http://www.gammon.com.au/interrupts এ আরও বিশদ