एक Uno हैंडल कितने इंटरप्ट पिंस कर सकता है?


16

मैं Arduino Uno R3 के साथ 7 चैनल RC रिसीवर का उपयोग कर रहा हूं। दस्तावेज़ीकरण में, अधिकतम 2 इंटरप्ट पिन का उल्लेख है, जबकि कुछ अन्य ब्लॉगों पर मैंने 20 पिनों को इंटरप्ट के रूप में उपयोग करने का उल्लेख किया है, जिसमें PinChangeInt लाइब्रेरी है। तो, Arduino मूल रूप से कितने अवरोधों को संभाल सकता है? और यह अलग है कि कितने PinChangeInt जैसे सॉफ़्टवेयर समर्थन के साथ संभाला जा सकता है?

जवाबों:


13

"पिन चेंज" टाइप इंटरप्ट होने के दो प्रकार होते हैं। बाहरी व्यवधान, जिनमें से दो ऊनो पर हैं। उन्हें 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 पर अधिक जानकारी


9

व्यवधान दो प्रकार के होते हैं। Arduino खेल का मैदान क्या कहा:

किसी भी Arduino के दिल में प्रोसेसर के दो अलग-अलग प्रकार हैं: "बाहरी", और "पिन परिवर्तन"। ATmega168 / 328 (Arduino Uno / Nano / Duemilanove में), INT0 और INT1 पर केवल दो बाहरी रुकावट पिन हैं, और उन्हें Arduino पिन 2 और 3 से मैप किया जाता है। इन रुकावटों को RISING या ट्रिगर पर सेट किया जा सकता है सिग्नल किनारों को कम करना, या निम्न स्तर पर। ट्रिगर्स की व्याख्या हार्डवेयर द्वारा की जाती है, और इंटरप्ट बहुत तेज है। Arduino Mega में कुछ और बाहरी अवरोधक पिन उपलब्ध हैं।

दूसरी ओर पिन परिवर्तन में बाधा कई और पिनों पर सक्षम की जा सकती है। ATmega168 / 328-आधारित Arduinos के लिए, उन्हें Arduino के सिग्नल के किसी भी या सभी 20 पर सक्षम किया जा सकता है; ATmega- आधारित Arduinos पर उन्हें 24 पिन पर सक्षम किया जा सकता है। उन्हें RISING या FALLING सिग्नल किनारों पर समान रूप से ट्रिगर किया जाता है, इसलिए यह बाधित कोड प्राप्त करने के लिए इंटरप्ट कोड पर निर्भर है, यह निर्धारित करने के लिए कि क्या हुआ (कौन सा पिन? ... सिग्नल में वृद्धि, या गिरावट?)। इसे ठीक से संभालने के लिए। इसके अलावा, पिन परिवर्तन रुकावट को MCU पर 3 "पोर्ट" में वर्गीकृत किया गया है, इसलिए पिंस के पूरे शरीर के लिए केवल 3 इंटरप्ट वैक्टर (सबरूटीन्स) हैं। यह एक ही रुकावट पर कार्रवाई को हल करने का काम और भी जटिल बना देता है।

मूल रूप से, बाहरी अवरोधन बहुत तेज़ होते हैं क्योंकि वे सभी हार्डवेयर आधारित होते हैं। हालाँकि, इसमें पिन चेंज इंटरप्ट भी होता है, लेकिन वे ज्यादा धीमे लगते हैं क्योंकि वे ज्यादातर सॉफ्टवेयर आधारित होते हैं।

tl; dr: 20 इंटरप्ट पिंस एक साथ बहुत धीमे होते हैं। 2 रुकावट पिन सबसे तेज और सबसे कुशल हैं।


संपादित करें: मैंने सिर्फ डेटाशीट को देखा और यह कहता है कि किसी भी पिन के बिना चुने गए पिन के लिए पिन परिवर्तन रुकावट पैदा होती है , जिसमें पिन बदल गया है (हालांकि यह तीन बाधा वैक्टर में विभाजित है)।

  • बाहरी व्यवधानों के लिए, यह आपको बताएगा पिन 3 बस बदल गया है
  • पिन चेंज के लिए यह आपको बताएगा कि आप किस पिन को मॉनिटर कर रहे थे!

जैसा कि आप देख सकते हैं, एक पिन परिवर्तन रुकावट ISR में बहुत अधिक उपरि जोड़ता है जिसे आपको पिछले राज्यों को संग्रहीत करके संभालना होगा और यह देखना होगा कि क्या वह पिन है जिसके बारे में आप चिंतित हैं। यह एक नींद की स्थिति के लिए ठीक हो सकता है, लेकिन बाहरी व्यवधान का उपयोग करना बेहतर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.