আরডুইনো এবং বাধা: পিন মান পেতে দ্রুত উপায়


11

আমি একজন ব্যবহার যাও Arduino Uno এবং ইতিমধ্যে একটি ব্যাখ্যা অনুযায়ী ডিজিটাল পিনের 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);

এবং এখন, আইএসআর (পিসিআইএনটি 2_ভেেক্ট) ফাংশনটি প্রতিটি বাধাবিঘ্নে ট্রিগার করা হয়। এটি একটি কবজির মতো কাজ করে। আমার প্রশ্নটি হল, সর্বাধিক / দ্রুততম উপায়টি কী, কোন পিনটি ট্রিগার করেছিল?

আমি রেতে কিছু পেয়েছি : আইএসআর (পিসিআইএনটি 2_ভেক্ট) ব্যবহার করা ভাল বা পিন 2, 3 এ সংযুক্তি ইন্টারট্রপ্ট? , তবে আমি কোডটি বুঝতে পারি না এবং এটি বাক্স থেকে কার্যকর হয় না। তবে এটি চিত্তাকর্ষক দেখাচ্ছে ...

সমাধান কি?

[২] http://arduino.cc/forum/index.php/topic,72496.15.html#last পোস্ট

সম্পাদনা:

এই মুহুর্তে, আমি ইনপুট পিন রেজিস্টার থেকে পিনের অবস্থাটি পড়ছি:

  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" );

শেষ পর্যন্ত, আমি পিনগুলিতে বাধাগুলি গণনা করতে চাই। তবে আমি কীভাবে আশ্বস্ত করতে পারি, দুবার কোনও গণনা নেই?


ইলেক্ট্রনিক্সে, আরও মানুষ সম্ভবত আরডোইনোস এবং অন্যান্য ইলেকট্রনিক জিনিসগুলির সাথে গোলমাল করেছেন।
আর্লজ

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

3
@ এয়ারলজ: এটি একটি প্রোগ্রামিং প্রশ্ন, তাই এটি অন-টপিক । এটি একটি শখের প্ল্যাটফর্মের জন্য বিষয়টি অপ্রাসঙ্গিক; দেখতে Stackoverflow অন্যান্য Arduino প্রশ্ন শত শত রেফারেন্সের জন্য।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

উত্তর:


4

আমার নিজের একটি প্রথম সমাধান রয়েছে তবে হার্ডওয়্যারটি জেট শেষ না হওয়ায় আমি নির্ভরযোগ্যতা পরীক্ষা করতে পারিনি।

প্রথমে আমি ওল্ডপিনগুলি এবং বিশ্বব্যাপী ভেরিয়েবল হিসাবে টিককাউন্ট যুক্ত করেছি:

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

এবং এই মুহুর্তে আমি কীভাবে আইএসআর সমাধান করেছি তা জানায়। স্বাগত অপেক্ষা আরও ভাল সমাধান।

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
আপনি যদি কোনও আইএসআরে টিককাউন্ট []] আপডেট করে থাকেন তবে আপনার এটি 'ভোল্টাইল' টাইপ কোয়ালিফায়ার দিয়ে ঘোষণা করা উচিত।
icarus74

আমি উত্তরের ভিতরে কোড আপডেট করেছি। আরও তথ্যের জন্য দেখুন আরডুইনো
ম্যাড্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.