【问题标题】:Arduino creating delay functionArduino创建延迟功能
【发布时间】:2016-11-10 17:19:36
【问题描述】:

我正在尝试制作自己的延迟功能。简而言之,mydelay 函数每secs 秒调用一次toggled 函数。代码写得不好,我知道(这是第一个版本)。但我只是想让它正常工作。然后我会重构它。但我有一些意想不到的错误。 x 函数中的循环第一次正常工作。它打印“I am in while” 1 秒钟,然后打印“我正在结束 mydelay”,这是我想要的行为。但是在完成x 中的循环之后。第二次循环的时候。它进入mydelay 函数(没关系)。但是它根本没有打印“我在一段时间”。它只是打印“我正在结束 mydelay”,这不好。

代码如下:

#include <Arduino.h>
int led = 7;
void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  x();
  Serial.println("Im ending main loop");
}

void x() {
  for (int i = 0; i <= 10; i++) {
    mydelay(led, 0, 1);
    mydelay(led, 1, 1);
  }
}

void mydelay(int pin, int hol, int secs) {
  int starttime = millis();
  while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
  toggled(pin, hol);
  Serial.println("Im ending mydelay");
}

void toggled(int pin, int hol) {
  digitalWrite(led, hol);
}

【问题讨论】:

  • 我认为问题可能出在 millis 上,自 arduino 开始程序以来,它会一直返回毫秒,我认为最终 millis-starttime 将大于 secs * 1000

标签: c time arduino


【解决方案1】:

将int starttime = millis(); 更改为unsigned long starttime = millis();。这可能是个问题,因为如果您使用int,您的程序将在 32 秒后发疯。这是一个问题,因为 int 只能容纳从 -32,768 到 32,767 的数字。

另外,你不妨试试这个:

while ((millis() - starttime) <= (secs * 1000))
{
  Serial.println("I am in while");
}

【讨论】:

  • 是的...我实际上打印了(millis() - starttime),最后一次(当它开始发疯时)最后一个值为65536,即2^16。我认为这与它有什么关系2^16(我忘了 arduino 是 16 位的)。无论如何,谢谢!
【解决方案2】:

也许你可以尝试使用类似这样的东西来重置millis,我没有arduino,所以它没有经过测试,但希望它可以提供帮助。

extern volatile unsigned long timer0_millis;
unsigned long reset = 0;

#include <Arduino.h>
int led = 7;
void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop(){
  x();
  Serial.println("Im ending main loop");

  setMillis(reset);
}

void setMillis(unsigned long new_millis){
  uint8_t oldSREG = SREG;
  cli();
  timer0_millis = new_millis;
  SREG = oldSREG;
}

void x() {
  for (int i = 0; i <= 10; i++) {
    mydelay(led, 0, 1);
    mydelay(led, 1, 1);
  }
}

void mydelay(int pin, int hol, int secs) {
  int starttime = millis();
  while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
  toggled(pin, hol);
  Serial.println("Im ending mydelay");
}

void toggled(int pin, int hol) {
  digitalWrite(led, hol);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多