Включение пина на определенное время

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

"Мой классический код" он не подразумевает ни начала ни интервала. Он просто ставит точку-будильник future и все . Нет у меня знаков для безнакового времени.

//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint8_t PC_1 = 1 ;
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1)   {
    switch (PC_1)   {
      case 1: PC_1 = 2;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
      case 2: PC_1 = 3;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
      case 3: PC_1 = 1;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
    }
    MILLIS = millis() ;
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2)   {
    future2 = MILLIS + 200 ;
    // сам код
    MILLIS = millis() ;
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 100 ;
    // сам код
  }
}

И жевать одно и тоже мне нет причины.

GarryC
Offline
Зарегистрирован: 08.08.2016

Попросите ЕвгенияП лично для Вас восстановить его код, внесите необходимые правки и убедитесь в наличии ошибки в его реализации. Она не смертельна, она не обязательно сработает, но она есть. Видимо, он убедился в ее наличии и для того, чтобы не признавать такой факт, посты с исходниками удалил. Ваше объяснение по своему интересно, но, боюсь, мое ближе к истине.

В вашем классическом коде я не увидел собственно операции сравнения.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Меня не интересует "ваша истина" или еще чья-то. У меня есть код, он работает и слава богу. Программирование наука для практики а не пережевывание не понятно чего и за чем.

GarryC
Offline
Зарегистрирован: 08.08.2016

Так все таки, как Ваш код определяет наступления ожидаемого момента времени?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

qwone пишет:

"Мой классический код" он не подразумевает ни начала ни интервала. Он просто ставит точку-будильник future и все . Нет у меня знаков для безнакового времени.

//#1
//#2
//#3
void setup() {
  //#1
  //#2
  //#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint8_t PC_1 = 1 ;
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1)   {
    switch (PC_1)   {
      case 1: PC_1 = 2;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
      case 2: PC_1 = 3;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
      case 3: PC_1 = 1;
        future1 = MILLIS + 1000 ;
        // сам код
        break;
    }
    MILLIS = millis() ;
  }
  //#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2)   {
    future2 = MILLIS + 200 ;
    // сам код
    MILLIS = millis() ;
  }
  //#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 100 ;
    // сам код
  }
}

И жевать одно и тоже мне нет причины.

ну, как так - не подразумевает начала и интервала, но использует начало future, а интервал у тебя явно прописан + 1000

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

GarryC пишет:

Надеюсь, Вы спросили именно для того, чтобы получить ответ.

Объясняю еще раз. Да, Вы совершенно правы, millis() возвращет тип unsigned long. Используя этот факт, мы можем ждать окончание задержки так, как это принять в Ардуино, то есть запомнить начало отсчета и ждать выполнения условия
(millis()-Начало)>=Задержка
При этом все работает из коробки, никаких других типов не надо, все переменные типа unsigned long, не нужно учитывать переполнение, все хорошо.

Но для вычислений по этой формуле Вам надо знать 2 переменные - Начало и Задержка. Если у вас каждый модуль работает только за себя, то он их знает по умолчанию. Но в Unix системах приняты очереди таймеров (так они называют задержки), когда Вы заказываете задержку и назначаете функцию обработки, которая будет вызвана в свое время. Кстати, такой способ можно реализовать и в Ардуино, и иногда он может быть удобным. При указанном способе ожидания задержки Вам придется хранить 2 переменные в очереди задержек - это и есть недостаток данного способа. Поэтому здесь принят другой способ хранения информации о требуемом моменте времени, а именно при запуске задержки вычисляется unsigned long Окончание=millis()+Задержка и условие изменяется
(millis()-Окончание)>0, но для беззнакового типа данное выражение бессмысленно, поскольку любое беззнековое число больше нуля,  и мы вынуждены сделать приведение
((long)millis()-(long)Окончание)>0. Здесь тоже все работает и можно не беспокоиться о переполнениях, но, если внимательно проанализировать, мы не можем заказать интервал более половины диапазона, потому что он отработается мгновенно. При этом, как Вы видите, мы по прежнему используем millis() с его возвращаемым типом, но для нашего удобства явно его приводим.

Достоинство этого метода, что нам нужно хранить только одно значение для каждого таймера в очереди, проще сортировать их по возрастанию, и сама проверка становится проще и быстрее, поскольку приведение типов в данном случае на стоит ничего на этапе исполнения.

слушай, когда тебя спрашивают, какого цвета небо, ты начинаешь про фиалки рассказывать или отвечаешь на заданный вопрос?

перефразирую вопрос: нахрена ты пишешь эти простыни про Юникс время?

GarryC
Offline
Зарегистрирован: 08.08.2016

Я думал, Вы хотите что то узнать. Ошибался.

Если до Вас до сих пор не дошло, то все, что я написал, никакого отношения к Unix времени не имеет, этот термин проффесионалы используют во вполне конкретном смысле, но к Вам это не относится, можете продолжать писать по своему.

Спасибо за изумительные по всоей красоте и осмысленности вопросыю Можете последовать примеру коллеги по сайту и удалить все посты, правда, в отличие от Вас, но хоть сколько то в теме.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

GarryC пишет:

Я думал, Вы хотите что то узнать. Ошибался.

верно - ты ошибался.

я тебе об этом сказал с самого начала - проблема тобой выдумана.

GarryC
Offline
Зарегистрирован: 08.08.2016

Интересно, существует ли отрасль знания, в которой Вы не разбираетесь в совершенстве?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

GarryC пишет:

Интересно, существует ли отрасль знания, в которой Вы не разбираетесь в совершенстве?

существует - я не умею программировать.