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");

}

Любая помощь очень ценится.

2 голоса | спросил Prasad De Zoysa 24 Jpm1000000pmWed, 24 Jan 2018 16:03:14 +030018 2018, 16:03:14

1 ответ


3

Время между двумя триггерными прерываниями - только 8us. Также digitalRead() - довольно большая функция, для выполнения которой требуется некоторое время (я не знаю, сколько). Таким образом, это будет коротко для команды Serial print для выполнения в оставшееся время. Сделайте следующее изменение, и вы увидите, что оно работает.

 void loop(){
  noInterrupts();
  Serial.print("Program running \n");
  interrupts();
  delay(1000);
}

Теперь прерывания отключены во время выполнения Serial.print(), чтобы он мог закончить. После этого прерывания снова включаются, и мы ожидаем 1 секунду, чтобы дать прерывания некоторое время, прежде чем мы снова отключим их.

Скорость Arduino ограничена, поэтому вы не можете много сделать, постоянно прерывая прерывания в темпе 8us. Если вы хотите только проверить этот цифровой вход, вы можете получить значение напрямую с помощью регистров PINB (см. эта сторона ), которая работает намного быстрее.

Также вы должны подумать о том, чтобы сделать переменную val volatile, так как она будет меняться каждый раз через вашу службу обслуживания прерываний.

ответил chrisl 24 Jpm1000000pmWed, 24 Jan 2018 17:39:53 +030018 2018, 17:39:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132