Как вычесть микро()?

Я пытаюсь рассчитать время между импульсами, сравнивая отметку времени micros(). Я понимаю, что вы не можете просто вычесть unsigned long, но я не могу понять, какова для него альтернатива.

Ниже представлена упрощенная версия кода. На контакте 6 я получаю импульсы длиной 2 мс каждые 2 мс, сравнивая время возврата «-19728». Я планирую сделать импульсы намного короче, как только решу эту математическую задачу.

Примечание к сайту: я использую импульсы, чтобы заставить два Arduino отправлять простые данные через цифровые выводы.

Спасибо.

int pinReceiver = 6;
int val = 0;
int isReceiving = 0;
int pauseLength = 0;
unsigned long timeStart = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pinReceiver,INPUT);  
}

void loop() {
  noInterrupts();
  val = digitalRead(pinReceiver);

  if(val==HIGH){
    if(isReceiving==0){ //Импульс начинается
      isReceiving = 1;
      pauseLength = micros() - timeStart;
      Serial.println(pauseLength);
    }

  } else {
    if(isReceiving==1){ //Импульс заканчивается
      isReceiving = 0;
      timeStart = micros();
    }
  }
  interrupts();
}

, 👍0

Обсуждение

Расчет вроде правильный. Пожалуйста, попробуйте также использовать unsigned long для pauseLength. Это может быть ваша проблема, @chrisl

Это определенно решило проблему. Я предположил, что, поскольку разница будет такой короткой, она может быть int. Спасибо. Я не знаю, как пометить это как решающий ответ., @Andi Stancu

Я думаю, это больше о том, что вы смешали неподписанные и подписанные типы. Завтра я напишу ответ, который вы можете принять, @chrisl

что произойдет, если вы приведете long к int ? ... pauseLength = (int)(micros() - timeStart);, @jsotola


1 ответ


Лучший ответ:

1

Преобразование длинного числа в целое приведет к переполнению значения, и вы получите значения в отрицательных числах.

Определите pauseLength как unsigned long, чтобы он работал.

,