подскажите по функции

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

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

bool x = 0;
bool y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

bool smartdelay (uint32_t interval) {
  static uint32_t previousMillis = millis();
  static bool sw;
  switch (sw) {
    case 0:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
      }
      break;
    case 1:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 0;
      }
      break;
  }
  return sw;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А чего Вы хотели добиться?

Собственно, набор вопросов стандартный:

1. Что хотели сделать?

2. Что в результате получилось?

3. Чем первое отличается от второго?

 

PS. Любая программа работает в точности так, как ее написал программист, но далеко не всегда так, как он хотел написать.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

у меня 8 таких извращений в скетче, хочу сделать функцию с разным интервалом

собственно вопрос, почему не создается вторая временная функция с другими параметрами?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

У вас в функции sw всегда равно 0 и

millis() - previousMillis не может быть больше чем время зав которое выполнится код в строках 18..21, потомук что вы присваиваете его в 17 строке.

Вам нужно понять что такое "Область видимости" и что переменные sw и previousMillis - не существуют вне фунции.

В текущем варианте функция всегда вернет 0 потому что интервал выполнения строк 18...21 очень мал.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

залейте и увидите проблему, специально сделал тест

а локально - это "static" :)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

А Вам залить трудно? тот 1 скетч, и воочию увидеть? он создан для видения проблемы

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

NeiroN пишет:

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

Вот как раз тут мухи отдельно - котлеты отдельно %(

Або как передаваемый в функцию параметр вообще-то нигде не используется и никому нах не нужен.

А вот переменная sw сама себе рулит.....

В общем прежде чем писАть код нужно наРИСОВАТЬ алгоритм - пусть просто на русском языке....

Нейрон - это не тебе а автору вопроса ;)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Куда залить, что залить. Если тот код(из первого поста) в микроконтролллер - то не смешите - там у вас ерунда написана, и как она работать должна я написал.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

это написанно чтобы было видно, а вот нормальная

bool x = 0;
bool y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

bool smartdelay (uint32_t interval) {
  static uint32_t previousMillis = 0;
  static bool sw;:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
else {
sw = 0
}
  return sw;
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

NeiroN пишет:

Куда залить, что залить. Если тот код(из первого поста) в микроконтролллер - то не смешите - там у вас ерунда написана, и как она работать должна я написал.

укажите на смешно

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
bool x = 0;
bool y = 0;
uint32_t previousMillis;
bool sw;
void setup() {
  Serial.begin(9600);
  previousMillis = millis();
  sw=0;
}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

bool smartdelay (uint32_t interval) {
  switch (sw) {
    case 0:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
      }
      break;
    case 1:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 0;
      }
      break;
  }
  return sw;
}

сделали хотя бы так.

Смешно то, что вы локальные переменные пытаетесь использовать как глобальные и естественно не работает.

P.S.  вы просто не правильно понимаете работу кода - в голове он у вас работает, а на практике нет. Отсюда и все прблемы.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Valera19701 пишет:

это написанно чтобы было видно, а вот нормальная

Валера 1970 - есть хорошая сказка про пастушка и волков.

Когда пастушек на третий раз встретил волков - никто не побежал.....

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

еще раз, так работает только при одном вызове функции, а при втором делает то что и при первом, а "static" заменяет вашу глобаьную переменную :)

 

keefa
Offline
Зарегистрирован: 19.06.2015

Valera19701 пишет:

это написанно чтобы было видно, а вот нормальная

bool x = 0;
bool y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

bool smartdelay (uint32_t interval) {
  static uint32_t previousMillis = 0;
  static bool sw;:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
else {
sw = 0
}
  return sw;
}

 

У вас в коде sw будет равно 1, только один цикл программы, все остальное время будет sw = 0.  в сериал принт ты единичку даже можешь и не заметить. если хочешь, поставь delay(1000); } после 21 строки и посмотри что у тебя получается

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Valera19701 пишет:

еще раз, так работает только при одном вызове функции, а при втором делает то что и при первом, а "static" заменяет вашу глобаьную переменную :)

 

Если ты знаешь лучше других зачем спрашивать?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

keefa пишет:

Valera19701 пишет:

это написанно чтобы было видно, а вот нормальная

bool x = 0;
bool y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

bool smartdelay (uint32_t interval) {
  static uint32_t previousMillis = 0;
  static bool sw;:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
else {
sw = 0
}
  return sw;
}

 

У вас в коде sw будет равно 1, только один цикл программы, все остальное время будет sw = 0.  в сериал принт ты единичку даже можешь и не заметить. если хочешь, поставь delay(1000); } после 21 строки и посмотри что у тебя получается

я в курсе, поэтому и создал самый первый скетч :)

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

at0mix пишет:

Valera19701 пишет:

еще раз, так работает только при одном вызове функции, а при втором делает то что и при первом, а "static" заменяет вашу глобаьную переменную :)

 

Если ты знаешь лучше других зачем спрашивать?

вот и спрашиваю, почему не создается вторая временная функция с другими параметрами!!!!!!!

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

at0mix пишет:

Valera19701 пишет:

еще раз, так работает только при одном вызове функции, а при втором делает то что и при первом, а "static" заменяет вашу глобаьную переменную :)

 

Если ты знаешь лучше других зачем спрашивать?

не пашет, вот и спрашиваю, я всего полгода занимаюсь этой херней, может кто-то направит на нужный путь :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Хмм , частный вопрос, ( конечно это не относится к тем крутым парням, которые сидят в этом баре) , а зачем переменная sw ? В функции же может быть несколько return. 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

inspiritus пишет:

Хмм , частный вопрос, ( конечно это не относится к тем крутым парням, которые сидят в этом баре) , а зачем переменная sw ? В функции же может быть несколько return. 

ну и как возвртить значени 2 , 3 или 8 функциие?

inspiritus
Offline
Зарегистрирован: 17.12.2012

В нужном месте return 2;

В другом - return 8...

И все это внутри одной функции.

типа 21 строка - return 1;

23 - return 2;

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

inspiritus пишет:

В нужном месте return 2;

В другом - return 8...

И все это внутри одной функции.

не пойдет, я не хочу вылавливать другие значения :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Тогда запостите алгоритм того, что желаете.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

inspiritus пишет:

Тогда запостите алгоритм того, что желаете.

а есть варианты решения без костылей?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Valera19701 пишет:

не пашет, вот и спрашиваю, я всего полгода занимаюсь этой херней, может кто-то направит на нужный путь :)

Во первых - если это херня то нафиг вообще занимаешься?

Во вторых - если хочешь получить результат - то РАЗБИРАЙСЯ! Или плати тем кто разбирается.

Я например три вечера - после работы сидел не мог понять почему у меня функция не работает.

Пришлось в скетче написать туеву хучу серал-принтов на точках, включить монитор и смотреть данные с контрольных точек. Потом просто сделал бэкап скетча, стер все что непонятно и сел писАть по новой.

В результате сегодня закрыл очередной проект (не денежный - мне з/п платят, а это для души %)

А на обозрение вынес уже РЕЗУЛЬТАТ - на критику кода.....

Не знаешь как поставить контрольные точки? Гугль подскажет, не поможет - закажи проект спецам.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

at0mix пишет:

Valera19701 пишет:

не пашет, вот и спрашиваю, я всего полгода занимаюсь этой херней, может кто-то направит на нужный путь :)

Во первых - если это херня то нафиг вообще занимаешься?

Во вторых - если хочешь получить результат - то РАЗБИРАЙСЯ! Или плати тем кто разбирается.

Я например три вечера - после работы сидел не мог понять почему у меня функция не работает.

Пришлось в скетче написать туеву хучу серал-принтов на точках, включить монитор и смотреть данные с контрольных точек. Потом просто сделал бэкап скетча, стер все что непонятно и сел писАть по новой.

В результате сегодня закрыл очередной проект (не денежный - мне з/п платят, а это для души %)

А на обозрение вынес уже РЕЗУЛЬТАТ - на критику кода.....

Не знаешь как поставить контрольные точки? Гугль подскажет, не поможет - закажи проект спецам.

 ужо гугл погнулся  , плати,  - чудо Вы странное :) нет вариантов ответа, лучше не отвечайте

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Valera19701 пишет:

 ужо гугл погнулся  , плати,  - чудо Вы странное :)

Да нет - это ты чудо странное.....

Причем совершенно не желающее УЧИТЬСЯ!

В СССР высшее образование давало не столько знания (хотя и их давало немало) сколько УМЕНИЕ учиться САМОСТОЯТЕЛЬНО!

Сейчас я например не прикрутил rfid-считку - и поставил ТМ-ключ - исключительно потому что на ТМ-ключ есть внятная библа и даташит. А на даренный рфид нет ничего - даже марки-модели.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

at0mix пишет:

Valera19701 пишет:

 ужо гугл погнулся  , плати,  - чудо Вы странное :)

Да нет - это ты чудо странное.....

Причем совершенно не желающее УЧИТЬСЯ!

В СССР высшее образование давало не столько знания (хотя и их давало немало) сколько УМЕНИЕ учиться САМОСТОЯТЕЛЬНО!

Сейчас я например не прикрутил rfid-считку - и поставил ТМ-ключ - исключительно потому что на ТМ-ключ есть внятная библа и даташит. А на даренный рфид нет ничего - даже марки-модели.

 я уже давнно pn532 и atmega8a прикрутил, и ?, я не собираюсь мериться, мне нужен результат

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Valera19701 пишет:

 я уже давнно pn532 и atmega8a прикрутил, и ?, я не собираюсь мериться, мне нужен результат

ну тогда вообще непонятно зачем писать сюда если результат есть?

Типа кровь разогнать дурацкими вопросами?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Valera19701 пишет:

inspiritus пишет:

Тогда запостите алгоритм того, что желаете.

а есть варианты решения без костылей?

Вы о чем ?

 

keefa
Offline
Зарегистрирован: 19.06.2015
boolean x = 0;
boolean y = 0;
unsigned long lastMillis_x = 0;
unsigned long lastMillis_y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000, lastMillis_x, 0); //нормально
  y = smartdelay(2000, lastMillis_y, 1); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
  delay(100);
}

boolean smartdelay (uint32_t interval, unsigned long lastMillis, boolean i) {
  boolean sw = 0;
  if (millis() - lastMillis >= interval) {
    if (i == 0) {
      lastMillis_x = millis();
      sw = 1;
    }
    if (i == 1) {
      lastMillis_y = millis();
      sw = 1;
    }
  }
  return sw;
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

keefa пишет:

boolean x = 0;
boolean y = 0;
unsigned long lastMillis_x = 0;
unsigned long lastMillis_y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000, lastMillis_x, 0); //нормально
  y = smartdelay(2000, lastMillis_y, 1); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
  delay(100);
}

boolean smartdelay (uint32_t interval, unsigned long lastMillis, boolean i) {
  boolean sw = 0;
  if (millis() - lastMillis >= interval) {
    if (i == 0) {
      lastMillis_x = millis();
      sw = 1;
    }
    if (i == 1) {
      lastMillis_y = millis();
      sw = 1;
    }
  }
  return sw;
}

 

спасибо, но я создавал функцию , чтобы избавиться от глобальных переменных:)-

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
С другой стороны, необходимо избегать использования static для локальных переменных, декларированных в теле функции. Значение локальных "static" переменных должно быть сохранено между отдельными вызовами функции, и значение переменной сохраняется в течение всего времени работы программы. Это требует постоянной выделенной области данных (SRAM), а также дополнительного кода для доступа к таким переменным. Переменная static в теле функции ведет себя для аспектов оптимизации так же, как и глобальная переменная, и отличается от глобальной переменной только областью видимости (переменная static видна только в теле функции, где была определена).

http://microsin.net/programming/avr-troubleshooting-faq/tips-and-tricks-...

даже тут не рекомендуют их ...

Вполне возможно что в новых AVR-GCC отключили этот функционал для переменных.

Вобщем используйте глобальные переменные и не выпендривайтесь.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

millis что возвращает? А previousMillis какой тип имеет?

Почему sw bool, если сравнение с 0 и 1? Плюс sw не проинициализирована.

Остальное в упор не понял. Вы хотите использовать одни и те же статические переменные в разных функциях? Только не надо отвечать вопросом на вопрос.

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

залейте себе самый первый скетч и :)

keefa
Offline
Зарегистрирован: 19.06.2015

Valera19701 пишет:

залейте себе самый первый скетч и :)

Залил, и чЁ? 

Мой код корректно работает твой нет.

keefa
Offline
Зарегистрирован: 19.06.2015

Valera19701 пишет:

keefa пишет:

boolean x = 0;
boolean y = 0;
unsigned long lastMillis_x = 0;
unsigned long lastMillis_y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000, lastMillis_x, 0); //нормально
  y = smartdelay(2000, lastMillis_y, 1); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
  delay(100);
}

boolean smartdelay (uint32_t interval, unsigned long lastMillis, boolean i) {
  boolean sw = 0;
  if (millis() - lastMillis >= interval) {
    if (i == 0) {
      lastMillis_x = millis();
      sw = 1;
    }
    if (i == 1) {
      lastMillis_y = millis();
      sw = 1;
    }
  }
  return sw;
}

 

спасибо, но я создавал функцию , чтобы избавиться от глобальных переменных:)-

boolean x = 0;
boolean y = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = smartdelay(1000, 0); //нормально
  y = smartdelay(2000, 1); // выдает первый
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
  delay(100);
}

boolean smartdelay (uint32_t interval, boolean i) {
  static unsigned long lastMillis_x = 0;
  static unsigned long lastMillis_y = 0;
  boolean sw = 0;

  if (i == 0) {
    if (millis() - lastMillis_x >= interval) {
      lastMillis_x = millis();
      sw = 1;
    }
  }
  if (i == 1) {
    if (millis() - lastMillis_y >= interval) {
      lastMillis_y = millis();
      sw = 1;
    }
  }
  return sw;
}

здесь вывел переменные из глобальных

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Valera19701 пишет:

залейте себе самый первый скетч и :)

Не даром просил не отвечать вопросом на вопрос. Валяюсь с гриппом и не имею возможности включить комп и что нибудь залить. Как угодно. Придётся завести себе бумажный чёрный список, что бы на хамство не нарываться. Удачи

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

kisoft пишет:

Как угодно. Придётся завести себе бумажный чёрный список, что бы на хамство не нарываться. Удачи

Полностью согласен. Колхоз дело добровольное - если хочешь получить внятный ответ задай внятный и понятный вопрос. А рассчитывать на то что все тут кому-то что-то обязаны - излишне.....

bwn
Offline
Зарегистрирован: 25.08.2014

prevMillis после каждого прохода равна millis() и никогда не достигнет  разницы в  две секунды.(((((

если между вызовами x и y добавишь delay(2000), то все взлетит.

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

bwn пишет:

если между вызовами x и y добавишь delay(2000), то все взлетит.

delay(2000) на каждый квадратный метр кода.

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

Valera19701, опиши словами алгоритм работы балалайки и не заёпуй просьбами залить свой код в куда-то - лично у меня нет сериала.

давай - алгоритм работы словами.

bwn
Offline
Зарегистрирован: 25.08.2014

Клапауций 322 пишет:

Valera19701, опиши словами алгоритм работы балалайки и не заёпуй просьбами залить свой код в куда-то - лично у меня нет сериала.

давай - алгоритм работы словами.

А без слов неясно? Попытка вызвать два раза одну функцию с разными интервалами, которые идут без задержки. Срабатывает только первый. Укажи примером эту ошибку ТС с использованием минимума кода.

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

bwn пишет:

А без слов неясно? Попытка вызвать два раза одну функцию с разными интервалами, которые идут без задержки. Срабатывает только первый. Укажи примером эту ошибку ТС с использованием минимума кода.

ты сейчас перечислил ошибки в коде, свои догадки и о чём-то меня попросил - что должен делать код, мне не известно, а заниматься вангованием вероятностей - лениво.

bwn
Offline
Зарегистрирован: 25.08.2014

Так я за него писать и не собирался. Обычно достаточно знать ошибку, а куда это знание девать, дело личное.

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

bwn пишет:

Так я за него писать и не собирался. Обычно достаточно знать ошибку, а куда это знание девать, дело личное.

ок. а, что ты собирался сделать, отвечая мне на заданный вопрос ТСу?

bwn
Offline
Зарегистрирован: 25.08.2014

Чтобы ты вангованием не утруждался, есть конкретный код и конкретный вопрос по нему. Вангование излишне.

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

bwn пишет:

Чтобы ты вангованием не утруждался, есть конкретный код и конкретный вопрос по нему. Вангование излишне.

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

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Коллеги, сто раз уже говорилось - чтобы получить ПРАВИЛЬНЫЙ ответ нужно задать ПРАВИЛЬНЫЙ вопрос!

И чего тут бои устраивать из-за того что кто-то не может внятно поставить задачу и расписать алгоритм?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

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

bool x = 0;
bool y = 0;
void setup() {
  Serial.begin(9600);
pinmode(13, OUTPUT);
pinmode(12, OUTPUT);

}

void loop() {
  x = smartdelay(1000); //нормально
  y = smartdelay(2000); // выдает первый
digitalWrite(13, x);
digitalWrite(12, y);
  Serial.print("Timer1 ");
  Serial.print(x);
  Serial.print(" Timer2 ");
  Serial.println(y);
}

boolean smartdelay (uint32_t interval) {
  static uint32_t previousMillis;
  static boolean sw;
  switch (sw) {
    case 0:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 1;
      }
      break;
    case 1:
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        sw = 0;
      }
      break;
  }
  return sw;
}