【发布时间】:2020-11-14 20:59:05
【问题描述】:
- 目标:
- 我正在使用 Arduino Nano 在 Arduino 环境中编写一个非常简单的程序。 (旧的)。
- 我试图让引脚 2 充当中断,然后调用蜂鸣器功能。为清楚起见,请查看代码。
- 问题:
- 当我在“loop()”中使用“buzzer_make_sound”运行以下代码时,蜂鸣器按预期工作。
- 当触发中断并调用回调函数时,它没有正确执行定时器和蜂鸣器,导致蜂鸣器根本不响,定时器做奇怪的事情。
- 代码
#include "includes.h" // this includes arduino.h
void callback_rc_receive();
void buzzer_make_sound();
void setup() {
Serial.begin(115200);
pinMode(RC_INPUT_CHANNEL1_PIN, INPUT); // pin 5
pinMode(RC_INPUT_CHANNEL2_PIN, INPUT); // pin 6
pinMode(RC_INPUT_CHANNEL3_PIN, INPUT); // pin 7
pinMode(RC_INPUT_CHANNEL4_PIN, INPUT); // pin 8
pinMode(RC_INCOMING_SIGNAL_TRIGGER_PIN, INPUT); // pin 2
pinMode(BUZZER1_PIN, OUTPUT); // pin 3
pinMode(LED_BUILTIN,OUTPUT);
attachInterrupt(digitalPinToInterrupt(RC_INCOMING_SIGNAL_TRIGGER_PIN), callback_rc_receive, RISING);
ReceiverOne.channel1State = 0; // typedef struct
ReceiverOne.channel2State = 0;
ReceiverOne.channel3State = 0;
ReceiverOne.channel4State = 0;
}
void loop() {
//buzzer_make_sound(); // this sounds the buzzer
}
void buzzer_make_sound(){
Serial.println("Buzzer entry");
int startTime = millis();
tone(BUZZER1_PIN, 2000);
delay(1000);
noTone(BUZZER1_PIN);
delay(1000);
Serial.println("Buzzer exit");
Serial.println(millis() - startTime);
}
void callback_rc_receive(){
if (digitalRead(RC_INPUT_CHANNEL1_PIN) == 1){
Serial.println("1");
buzzer_make_sound();
}else if (digitalRead(RC_INPUT_CHANNEL2_PIN) == 1){
Serial.println("2");
}else if (digitalRead(RC_INPUT_CHANNEL3_PIN) == 1){
Serial.println("3");
}else if (digitalRead(RC_INPUT_CHANNEL4_PIN) == 1){
Serial.println("4");
}else{
Serial.println("Error");
}
}
- 终端打印:
在循环中运行“buzzer_make_sound()”时:
Buzzer entry
Buzzer exit
2001
触发中断时:
1
Buzzer entry
Buzzer exit
0
1
Buzzer entry
Buzzer exit
0
1
Buzzer entry
Buzzer exit
65536
1
Buzzer entry
Buzzer exit
65536
奇怪的是,当触发中断时,它立即完成了任务。没有 2 秒延迟。
有人知道发生了什么吗?中断会停止计时器吗?如果是这样,如何处理依赖于计时器的事情?
【问题讨论】: