Arduino और इंटरप्ट: पिन मान प्राप्त करने का तेज़ तरीका


11

मैं एक Arduino Uno का उपयोग करता हूं और पहले से ही डिजिटल 1, 2, 3, 4 और 5 पर इंटरप्ट के साथ काम करने के लिए इसे सेट करता हूं 1 मुझे मिले स्पष्टीकरण के अनुसार ।

void setup() इंटरप्ट को सेटअप करने के लिए निम्न कोड होता है।

  //Endable Interrupts for PCIE2 Arduino Pins (D0-7)
  PCICR |= (1<<PCIE2);

  //Setup pins 2,3,4,5
  PCMSK2 |= (1<<PCINT18);
  PCMSK2 |= (1<<PCINT19);
  PCMSK2 |= (1<<PCINT20);
  PCMSK2 |= (1<<PCINT21);

  //Trigger Interrupt on rising edge
  MCUCR = (1<<ISC01) | (1<<ISC01);

और अब, ISR (PCINT2_vect) फ़ंक्शन को हर बाधा पर चालू किया जाता है। जो आकर्षण की तरह काम करता है। मेरा सवाल है, यह पता लगाने का सबसे अच्छा / सबसे तेज़ तरीका क्या है कि किस पिन को ट्रिगर किया गया था?

मुझे पुन: कुछ मिला : ISR (PCINT2_vect) का उपयोग करना बेहतर है या पिंस 2, 3 पर संलग्न करें? , लेकिन मुझे कोड समझ में नहीं आता है और यह बॉक्स से बाहर काम नहीं करता है। लेकिन यह प्रभावशाली दिखता है ...

उपाय क्या है?

[२] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost

संपादित करें:

फिलहाल, मैं पिन स्टेट को इनपुट पिन रजिस्टर से पढ़ रहा हूं:

  if (PIND & 0b00000100)
    Serial.println( "PIN 2" );
  if (PIND & 0b00001000)
    Serial.println( "PIN 3" );
  if (PIND & 0b00010000)
    Serial.println( "PIN 4" );
  if (PIND & 0b00100000)
    Serial.println( "PIN 5" );

अंत में, मैं पिंस पर इंटरप्ट को गिनना चाहता हूं। लेकिन मैं कैसे आश्वासन दे सकता हूं, कि दो बार कोई गिनती नहीं है?


इलेक्ट्रॉनिक्स में, अधिक लोगों ने संभवतः Arduinos और अन्य इलेक्ट्रॉनिक चीजों के साथ गड़बड़ कर दी है।
अर्लज़

अगर आपको लगता है, सवाल वहाँ होना चाहिए, इसे चिह्नित करें। मैंने अपनी लॉगिन समस्याओं को हल किया।
madc

3
@ एर्लज़: यह एक प्रोग्रामिंग प्रश्न है, इसलिए यह ऑन-टॉपिक है । यह तथ्य कि यह एक शौक़ीन मंच के लिए है अप्रासंगिक है; देख stackoverflow पर अन्य arduino सवालों के सैकड़ों संदर्भ के लिए।
ब्लूराजा - डैनी पफ्लुगुफ्ट

जवाबों:


4

मेरे पास पहला समाधान खुद है, लेकिन मैं विश्वसनीयता का परीक्षण नहीं कर सका क्योंकि हार्डवेयर समाप्त जेट नहीं है।

पहले मैंने पुराने चर और टिकअन को वैश्विक चर के रूप में जोड़ा:

static byte oldPins = 0;
volatile unsigned int tickCount[4] = { 0, 0, 0, 0 };

और इस समय मैंने ISR को कैसे हल किया है। बेहतर समाधान स्वागत से अधिक हैं।

ISR( PCINT2_vect ) {
  //Read values from digital pins 2 to 7
  const byte actPins = PIND;
  //Match this values agaist the oldPins bitmask (XOR and AND for raising edge)
  const byte setPins = (oldPins ^ actPins) & actPins;

  if (setPins & 0b00000100)
    tickCount[0]++;
  if (setPins & 0b00001000)
    tickCount[1]++;
  if (setPins & 0b00010000)
    tickCount[2]++;
  if (setPins & 0b00100000)
    tickCount[3]++;

  oldPins = actPins;
}

1
यदि आप एक ISR में टिककाउंट [] को अपडेट कर रहे हैं, तो आपको इसे 'वाष्पशील' प्रकार के क्वालीफायर के साथ घोषित करना चाहिए।
icarus74

मैंने उत्तर के अंदर कोड अपडेट किया। अधिक जानकारी के लिए arduino दस्तावेज़ देखें arduino.cc/en/Reference/Volatile
एमएडीसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.