我正在制作一台基本的计算机,把所有东西同步在一起的芯片是一个Attiny85。这个芯片告诉其他人什么时候可以在数据总线上做事情。
其工作原理是,每当将引脚PB0(在IDE中标记为11或代码中标记为intPin )设置为高时,ATtiny85将所有引脚设置在较低的位置,然后设置下一个芯片的相应引脚。
问题在attachPinToInterrupt()
语句中。
当我试图编译代码时会收到以下错误消息: Arduino: 1.8.9 (Mac ),板:“ATtiny25 25/45/85,ATtiny85,内部8 MHz”
/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.
这是我的密码:
//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:
}
我任何人都可以帮我,我会非常感激的。
因为芯片只是这样做的,能做这样的事情吗?
bool clock = true;
void loop() {
if (digitalRead(intPin)==LOW) {
if (clock==true) {
procDone();
}
}
}
发布于 2019-08-27 17:28:49
对给定的板不支持此功能。
您可以通过将PCMSK寄存器中的正确位设置为1来启用每个引脚的外部中断,还必须在GIMSK寄存器(位5和/或6)中启用这种中断。我找到了一个很好的例子,这里。
守则:
#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
}
发布于 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,然后再次运行代码:
//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代码没有其他功能,而且处理时间不长,为什么不检查一下信号的上升边缘呢?
//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;
}
}
https://stackoverflow.com/questions/57676615
复制相似问题