Проблемы с millis() в Due

Тема в разделе "Arduino & Shields", создана пользователем Serg55, 24 июн 2014.

  1. Serg55

    Serg55 Нуб

    День добрый.
    Приобрел Arduino Due в Амперке.

    Попробовал залить тестовый скетч, среда Arduino IDE 1.5.6-r2.
    Пример взял из стандартной IDE, Blink without Delay.

    Питается от USB.

    Код на всякий случай.
    Код (Text):

    /* Blink without Delay

    Turns on and off a light emitting diode(LED) connected to a digital
    pin, without using the delay() function.  This means that other code
    can run at the same time without being interrupted by the LED code.

    The circuit:
    * LED attached from pin 13 to ground.
    * Note: on most Arduinos, there is already an LED on the board
    that's attached to pin 13, so no hardware is needed for this example.

    created 2005
    by David A. Mellis
    modified 8 Feb 2010
    by Paul Stoffregen
    modified 11 Nov 2013
    by Scott Fitzgerald


    This example code is in the public domain.

    http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
    */

    // constants won't change. Used here to set a pin number :
    const int ledPin =  13;      // the number of the LED pin

    // Variables will change :
    int ledState = LOW;            // ledState used to set the LED

    // Generally, you shuould use "unsigned long" for variables that hold time
    // The value will quickly become too large for an int to store
    unsigned long previousMillis = 0;        // will store last time LED was updated

    // constants won't change :
    const long interval = 1000;          // interval at which to blink (milliseconds)

    void setup() {
      // set the digital pin as output:
      pinMode(ledPin, OUTPUT);
    }

    void loop()
    {
      // here is where you'd put code that needs to be running all the time.

      // check to see if it's time to blink the LED; that is, if the
      // difference between the current time and last time you blinked
      // the LED is bigger than the interval at which you want to
      // blink the LED.
      unsigned long currentMillis = millis();

      if(currentMillis - previousMillis >= interval) {
        // save the last time you blinked the LED
        previousMillis = currentMillis;

        // if the LED is off turn it on and vice-versa:
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;

        // set the LED with the ledState of the variable:
        digitalWrite(ledPin, ledState);
      }
    }
     
    Работает не стабильно, после каждого 16-го загорания гаснет и тут же вспыхивает. Далее опять 15 раз нормально и все повторяется.
    Смена порта USB и смена порта ардуины, в том числе и на 13 (используется светодиод на плате ардуины) , ничего не меняет.
     
  2. acos

    acos Официальный гик Администратор

    А если так попробовать?
    Код (Text):

    const int ledPin =  13;      // the number of the LED pin
    int ledState = LOW;            // ledState used to set the LED

    unsigned long previousMillis = 0;        // will store last time LED was updated

    const long interval = 1000;          // interval at which to blink (milliseconds)

    void setup() {
      // set the digital pin as output:
      pinMode(ledPin, OUTPUT);
    }

    void loop()
    {
        if(millis() - previousMillis >= interval) {
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;
        digitalWrite(ledPin, ledState);
        previousMillis = millis();  // А если вот так?
      }
    }
     
     
  3. Serg55

    Serg55 Нуб

    Спасибо за помощь, но не помогло.
    Результат точно такой же, как и из примера, взятого из IDE.
    На другой плате удалось проверить?
     
  4. acos

    acos Официальный гик Администратор

    Пока нет.
    @nailxx расказывал, что у него были непонятки с due из-за бага в gcc в какой-то версии Linux.
    Но тут пока не понятно что. Завтра надеюсь вопроизвести. Упс, уже сегодня)
     
  5. Serg55

    Serg55 Нуб

    У меня W7 64
    Техподдержка обещала проверить на другой плате.
    Возможно, новая IDE генерит для DUE некорректный код.
    Либо плата кривая.