"पिन चेंज" टाइप इंटरप्ट होने के दो प्रकार होते हैं। बाहरी व्यवधान, जिनमें से दो ऊनो पर हैं। उन्हें 0 और 1 कहा जाता है, हालांकि वे बोर्ड पर डिजिटल पिंस 2 और 3 का उल्लेख करते हैं। इन्हें बढ़ते, गिरते, बदलते (बढ़ते या गिरते) या LOW का पता लगाने के लिए कॉन्फ़िगर किया जा सकता है ।
इसके अलावा "पिन चेंज" इंटरप्ट हैं, जो 20 पिंस (A0 से A5, और D0 से D13) में से किसी में पिन स्टेट में बदलाव का पता लगाता है। ये पिन चेंज इंटरप्ट भी हार्डवेयर आधारित हैं, इसलिए, अपने आप में बाहरी इंटरप्ट के रूप में तेजी से होगा।
दोनों प्रकार रजिस्टर स्तर पर उपयोग करने के लिए थोड़े से काल्पनिक हैं, लेकिन मानक IDE में संलग्नक (n) और detachInterrupt (n) शामिल हैं जो इंटरफ़ेस को बाहरी व्यवधान को सरल बनाता है। पिन चेंज इंटरप्ट को आसान बनाने के लिए आप पिन चेंज लाइब्रेरी का भी इस्तेमाल कर सकते हैं ।
हालाँकि, एक मिनट के लिए लाइब्रेरी की स्पष्टता को देखते हुए, हम यह स्थापित कर सकते हैं कि बाहरी बदलावों की तुलना में पिन चेंज इंटरप्ट्स तेज़ या तेज़ हो सकते हैं। एक बात के लिए, हालांकि पिन चेंज पिन के बैचों पर काम में बाधा डालती है, आपको पूरे बैच को सक्षम करने की आवश्यकता नहीं है। उदाहरण के लिए, यदि आप पिन D4 पर परिवर्तनों का पता लगाना चाहते हैं, तो यह पर्याप्त होगा:
उदाहरण स्केच:
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 ()
{
}
मेरा परीक्षण इंगित करता है कि "टेस्ट" पिन (पिन 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 takess लेता है, ऊपर 1.6 µ से बहुत अधिक। क्यों? क्योंकि कोड को "जेनेरिक" बाधित हैंडलर के लिए जेनरेट करना पड़ता है, ISR में प्रवेश करने पर प्रत्येक बोधगम्य रजिस्टर (उन्हें धक्का दें) को बचाने के लिए, और फिर लौटने से पहले उन्हें (उन्हें पॉप) बहाल करना होगा। इसके अलावा एक और फ़ंक्शन कॉल का ओवरहेड है।
अब हम चारों ओर काम कर सकते हैं संलग्नक से बचने के द्वारा () और इसे स्वयं कर रहे हैं:
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 µ है - ऐसा लगता है कि एक घड़ी चक्र कहीं बच गया।
पिन-चेंज इंटरप्ट के लिए हालांकि, एक कैविएट है। उन्हें बैच दिया जाता है, इसलिए यदि आप बहुत सारे पिनों पर हस्तक्षेप करना चाहते हैं, तो आपको उस अवरोध के अंदर परीक्षण करने की आवश्यकता है जो एक बदल गया है। आप ऐसा कर सकते हैं कि पिछली पिन स्थिति को सहेज कर, और उसकी तुलना नए पिन स्थिति से करें। यह विशेष रूप से धीमी गति से आवश्यक नहीं है, लेकिन आपको जितने अधिक पिन की जांच करने की आवश्यकता है, यह उतना ही धीमा होगा।
बैच हैं:
- A0 से A5
- D0 से D7
- D8 से D13
यदि आप सिर्फ एक जोड़े को और अधिक रुकावट पिन चाहते हैं, तो आप अलग-अलग बैचों (जैसे D4 और D8) से पिन का उपयोग करके किसी भी परीक्षण से बच सकते हैं।
Http://www.gammon.com.au/interrupts पर अधिक जानकारी