Arduino和中断:获取引脚值的快速方法


11

我使用的是Arduino Uno,并且已经根据我发现的说明1对其进行了设置,使其可以处理数字引脚2、3、4和5上的中断。

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中找到了一些东西:最好在引脚2、3上使用ISR(PCINT2_vect)或attachInterrupt?,但我不了解代码,因此无法立即使用。但这看起来令人印象深刻...

解决办法是什么?

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

最后,我要计算引脚上的中断。但是,我怎么能保证没有两次计数呢?


在电子领域,更多的人可能已经把Arduino和其他电子产品弄得一团糟。
Earlz 2011年

如果您认为,问题应该在那儿,将其标记出来。我解决了我的登录问题。
madc 2011年

3
@Earlz:这是一个编程问题,所以是话题性的。它是针对爱好者平台的事实是无关紧要的;请参阅关于stackoverflow的其他数百个arduino问题以供参考。
BlueRaja-Danny Pflughoeft

Answers:


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中更新tickCount [],则应使用“ volatile”类型限定符进行声明。
icarus74

我更新了答案中的代码。有关更多信息,请参见arduino文档:arduino.cc/en/Reference/Volatile
madc 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.