Ардуїно і Переривання: Швидкий спосіб отримати значення значків


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

А тепер функція ISR (PCINT2_vect) спрацьовує при кожному перериванні. Це працює як шарм. Моє запитання: який найкращий / найшвидший спосіб дізнатися, який штифт був спрацьований?

Я знайшов щось у Re: Чи краще використовувати ISR (PCINT2_vect) або приєднати Interterrupt на шпилях 2, 3? , але я не розумію код і він не працює з коробки. Але це виглядає вражаюче ...

Яке рішення?

[2] 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
@Earlz: Це питання програмування, тому це на тему . Те, що це для платформи для любителів, не має значення; див. сотні інших ардуїнських питань на stackoverflow для довідки.
BlueRaja - Danny Pflughoeft

Відповіді:


4

У мене є перше рішення, але я не міг перевірити надійність, оскільки апаратне забезпечення не закінчено струменем.

Спочатку я додав oldPins і tickCount як глобальні змінні:

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
madc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.