Arduino TimerOne прерывает программу при вызове функции "digitalRead"
Я пытаюсь сделать этот проект.
Но у меня проблема с запуском этого кода. Кажется, что val = digitalRead(inPin);
разбивает всю программу. просто потому, что я вызываю это из функции callback
, которая прикрепляется как функция прерывания Timer1.attachInterrupt(callback);
Вот более упрощенная программа моделирования проблем,
#include "TimerOne.h"
int inPin = 7; // sensing digital pin 7
int val;
void setup() {
pinMode(inPin, INPUT); // sets the digital pin 7 as input to sense receiver input signal
Serial.begin(9600);
Timer1.initialize(8); // initialize timer1, and set the frequency; this drives both the LC tank as well as the pulse timing clock
// note: modify this as needed to achieve resonance and good match with the desired tags
// the argument value is in microseconds per RF cycle, so 8us will yield RF of 125kHz, 7us --> 143kHz, etc.
Timer1.pwm(9, 512);
Timer1.attachInterrupt(callback);
}
void callback()
{
val = digitalRead(inPin);//once you comment this line, it works fine
}
void loop() {
Serial.print("Program running \n");
}
Любая помощь очень ценится.
1 ответ
Время между двумя триггерными прерываниями - только 8us. Также digitalRead()
- довольно большая функция, для выполнения которой требуется некоторое время (я не знаю, сколько). Таким образом, это будет коротко для команды Serial print для выполнения в оставшееся время. Сделайте следующее изменение, и вы увидите, что оно работает.
void loop(){
noInterrupts();
Serial.print("Program running \n");
interrupts();
delay(1000);
}
Теперь прерывания отключены во время выполнения Serial.print()
, чтобы он мог закончить. После этого прерывания снова включаются, и мы ожидаем 1 секунду, чтобы дать прерывания некоторое время, прежде чем мы снова отключим их.
Скорость Arduino ограничена, поэтому вы не можете много сделать, постоянно прерывая прерывания в темпе 8us. Если вы хотите только проверить этот цифровой вход, вы можете получить значение напрямую с помощью регистров PINB (см. эта сторона ), которая работает намного быстрее.
Также вы должны подумать о том, чтобы сделать переменную val
volatile, так как она будет меняться каждый раз через вашу службу обслуживания прерываний.