繁体   English   中英

Arduino Mega2560设置中断

[英]Arduino Mega2560 Set interrupts

嘿即时通讯使用arduino Mega2560。 我想对中断设置触发。 到销53、52、51、50和12,13。

void setup(){

 PCICR |= (1 << PCIE0); 

  PCMSK0 |= (1 << PCINT0);
  PCMSK0 |= (1 << PCINT1); 
  PCMSK0 |= (1 << PCINT2); 
  PCMSK0 |= (1 << PCINT3); 
  PCMSK0 |= (1 << PCINT6); 
  PCMSK0 |= (1 << PCINT7); 
}

ISR(PCINT0_vect){
// Code when one of the pins was changed
}

这对我不起作用,有人可以帮忙吗?

经过测试,可以正常工作:

/*
 * Connections:
 * A0 (PF0) -> PCINT0 (PB0 / 53)
 * A1 (PF1) -> PCINT1 (PB1 / 52)
 * A2 (PF2) -> PCINT2 (PB2 / 51)
 * A3 (PF3) -> PCINT3 (PB3 / 50)
 * A4 (PF4) -> PCINT6 (PB6 / 12)
 * A5 (PF5) -> PCINT7 (PB7 / 13)
 */

uint8_t pins[] = {A0,A1,A2,A3,A4,A5};

void setup() {
  Serial.begin(115200);

  // Make PF0-5 outputs:
  DDRF   = _BV(PF0) | _BV(PF1) | _BV(PF2) | _BV(PF3) | _BV(PF4) | _BV(PF5);

  PCICR  = _BV(PCIE0);
  PCMSK0 = _BV(PCINT0) | _BV(PCINT1) | _BV(PCINT2) | _BV(PCINT3) | _BV(PCINT6) | _BV(PCINT7);

  // Arduino sets global interrupts, so we don't have to do it here:
  // sei();
}

volatile uint8_t data = 0;
uint8_t          last = 0;

uint32_t    change_ts = 1000;
uint8_t       out_val = 0;

void loop() {

  if (data != last) {
    Serial.print("Got: "); Serial.println(data, BIN);
    last = data;
  }

  if (change_ts <= millis()) {
    change_ts += 1000;
    Serial.print(F("Changed to: ")); Serial.println(++out_val, BIN);
    PORTF = out_val;
  }
}

ISR(PCINT0_vect) {
  data = PINB & PCMSK0; // read data and clear unused pins
}

如果您不使用Arduino框架,则必须通过sei()启用全局中断。 如果您无法从外部看到ISR内部设置的某些变量,则必须使其volatile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM