首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用中断时的错误消息

使用中断时的错误消息
EN

Stack Overflow用户
提问于 2019-08-27 14:13:12
回答 2查看 2.6K关注 0票数 0

我正在制作一台基本的计算机,把所有东西同步在一起的芯片是一个Attiny85。这个芯片告诉其他人什么时候可以在数据总线上做事情。

其工作原理是,每当将引脚PB0(在IDE中标记为11或代码中标记为intPin )设置为高时,ATtiny85将所有引脚设置在较低的位置,然后设置下一个芯片的相应引脚。

问题在attachPinToInterrupt()语句中。

当我试图编译代码时会收到以下错误消息: Arduino: 1.8.9 (Mac ),板:“ATtiny25 25/45/85,ATtiny85,内部8 MHz”

代码语言:javascript
运行
复制
/Users/alexandrebergeron/Documents/Arduino/computer/computerClock/computerClock.ino: In function 'void setup()':
computerClock:11:47: error: 'digitalPinToInterrupt' was not declared in this scope
   attachInterrupt(digitalPinToInterrupt(intPin), procDone(), RISING);
                                           ^
exit status 1
'digitalPinToInterrupt' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

这是我的密码:

代码语言:javascript
运行
复制
//common vars
volatile int priority = 0;

//pin numbers
const int intPin = 11;
const int cpuPin = 6;
const int videoPin = 13;

void setup() {
  pinMode(intPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(intPin), procDone(), RISING);
  pinMode(cpuPin, OUTPUT);
  pinMode(videoPin, OUTPUT);
}

void procDone() {
    digitalWrite(cpuPin, LOW);
    digitalWrite(videoPin, LOW);
    switch(priority) {
        case 0:
            digitalWrite(cpuPin, HIGH);
            break;
        case 1:
            digitalWrite(videoPin, HIGH);
            break;
    }
}

void loop() {
  // put your main code here, to run repeatedly:

}

我任何人都可以帮我,我会非常感激的。

因为芯片只是这样做的,能做这样的事情吗?

代码语言:javascript
运行
复制
bool clock = true;

void loop() {
  if (digitalRead(intPin)==LOW) {
    if (clock==true) {
      procDone();
    }
  }
}
EN

回答 2

Stack Overflow用户

发布于 2019-08-27 17:28:49

对给定的板不支持此功能。

您可以通过将PCMSK寄存器中的正确位设置为1来启用每个引脚的外部中断,还必须在GIMSK寄存器(位5和/或6)中启用这种中断。我找到了一个很好的例子,这里

守则:

代码语言:javascript
运行
复制
#include "avr/interrupt.h" 
volatile int value=0;

void setup() {
    GIMSK = 0b00100000;    // turns on pin change interrupts
    PCMSK = 0b00010011;    // turn on interrupts on pins PB0, PB1, & PB4
    sei();                 // enables interrupts
}

void loop() {
}

ISR(PCINT0_vect) {
    value = 1;             // Increment volatile variable
}
票数 0
EN

Stack Overflow用户

发布于 2019-08-27 18:56:30

斯皮罗!

您的代码是最正确的,但不幸的是,并非所有引脚都可用于外部中断功能。数字引脚11不是外部中断引脚。

对于arduino引脚,您需要检查以下链接:https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

对于ATTiny,在名为PB2:1的引脚上只有外部中断选项

例如,在arduino Uno中,尝试将intPin的物理连接从11更改为2,然后再次运行代码:

代码语言:javascript
运行
复制
//common vars
volatile int priority = 0;

//pin numbers
const int intPin = 2;
const int cpuPin = 6;
const int videoPin = 13;

void setup() {
  pinMode(intPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(intPin), procDone(), RISING);
  pinMode(cpuPin, OUTPUT);
  pinMode(videoPin, OUTPUT);
}

void procDone() {
    digitalWrite(cpuPin, LOW);
    digitalWrite(videoPin, LOW);
    switch(priority) {
        case 0:
            digitalWrite(cpuPin, HIGH);
            break;
        case 1:
            digitalWrite(videoPin, HIGH);
            break;
    }
}

void loop() {
  // put your main code here, to run repeatedly:

}

或者将ATTiny连接从pin PB0更改为PB2,并使用JSC提供的片段,我相信它会同样工作。

让我知道,如果这有帮助,我认为它将解决你面临的问题。

**编辑:如果您的arduino代码没有其他功能,而且处理时间不长,为什么不检查一下信号的上升边缘呢?

代码语言:javascript
运行
复制
//common vars
volatile int priority = 0;
uint8_t btn_prev = HIGH;

//pin numbers
const int intPin = 2;
const int cpuPin = 6;
const int videoPin = 13;

void setup() {
  pinMode(intPin, INPUT_PULLUP);
  pinMode(cpuPin, OUTPUT);
  pinMode(videoPin, OUTPUT);
}

void loop() {
  uint8_t btn_state = digitalRead(intPin);

  if ( (btn_state == LOW) && (btn_prev == HIGH) {
     procDone();
  }
  btn_prev = btn_state;

}

void procDone() {
    if(priority == 0) {
       priority = 1;}
    else {
       priority = 0;}  
    digitalWrite(cpuPin, LOW);
    digitalWrite(videoPin, LOW);
    switch(priority) {
        case 0:
            digitalWrite(cpuPin, HIGH);
            break;
        case 1:
            digitalWrite(videoPin, HIGH);
            break;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57676615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档