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


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.