Страница 1 из 1

Некорректная работа пользовательского блока CODE

Добавлено: 02.03.2016{, 10:36}
AlexRyzh
Делал я пользовательский блок, который должен подать питание на датчик на короткое время и за это время опросить датчик и отключить питание датчика. 
Для того, чтоб кратковременно подать питание на датчик, я использую любой цифровой пин. Но какой это будет пин, я указываю на входном выводе блока ( для удобства, в любой момент поменять используемый пин). Но как выяснилось этот метод не работает должным образом.
Сейчас покажу на простом примере подачи питания на светодиод пин 13.

В разделе Сетап присваиваем переменной номер пина, поступившего со входа:
2368115.jpg
Ну и собственно сам код программы мигания диодом
2369286.jpg
Вставляем блок в плату и назначаем на вход пин 13
1913764.jpg
Открываем компилятор и видим такую картину:
9658579.jpg
Естественно программа работать не будет, т.к. сначала присваивается переменная, которая еще пустая, а уже в секции Луп присваивается значение этой переменной. 
Почему не наоборот??? Почему то что я указал сделать в разделе Сетап, делается в разделе Луп???
Я понимаю должно быть так:
в разделе сетап, входной переменной присваивается указанное входное значение, и только после этого ledPin получает из нее значение.

Некорректная работа пользовательского блока CODE

Добавлено: 02.03.2016{, 11:51}
Alex16
Молодец ! Сам задал вопрос, сам ответил да еще и выводы сделал, одна только проблема - не работает.
Цитата AlexRyzh6110Я понимаю должно быть так:в разделе сетап, входной переменной
У тебя входная переменная(13) объявляется выходом порта (куда послать данные - порт 13)
AlexRyzh писал(а):входной переменной присваивается указанное входное значение ???????
а значение переменной - это что посылаем (1 или 0)

Некорректная работа пользовательского блока CODE

Добавлено: 02.03.2016{, 14:49}
AlexRyzh
Особо спорить не буду, я в С не силен, но Не пойму, что изменилось?
В Вашем примере "Led", то что написано для Сетап, прописывается в луп, что есть не корректно.
Насколько я понимаю, выполнение программы происходит сверху вниз. Раздел Сетап выполняется только 1 раз, луп работает по кругу.
Так вот в разделе сетап пину Pin_226911677_1 назначается OUTPUT. Но самой переменной Pin_226911677_1 значение 13 еще не присвоено. Значит Pin_226911677_1 имеет значение 0. И тогда нулевой пин будет назначен выходом.
И только в луп переменная Pin_226911677_1 получает значение 13, но раздел сетап уже никогда об этом не узнает. Он отработал и "уехал домой", честно выполнив свою миссию, назначив нулевой пин выходом.
Каким образом pinMode(Pin_226911677_1, OUTPUT); понимает, что нужно именно 13-й пин назначить выходом, Если 13 ему присваивается после сетап, уже в лупе. Зачем в пин назначать в лупе, если в луп должен попасть только этот код:

digitalWrite(Pin_226911677_1, HIGH);
delay(1000);
digitalWrite(Pin_226911677_1, LOW);
delay(1000);
6513455.jpg
Добавлено (02.03.2016, 14:49)
---------------------------------------------
Вот есть код мигания светодиодом:


Код: Выделить всё

void setup() {                 // Инициализируем цифровой вход/выход в режиме выхода.  
pinMode(13, OUTPUT);

   }
void loop()
{  
digitalWrite(13, HIGH);   // зажигаем светодиод
delay(1000);              // ждем секунду
digitalWrite(13, LOW);    // выключаем светодиод  
delay(1000);              // ждем секунду}
После создания блока код должен выглядить примерно так:

Код: Выделить всё

byte Pin_226911677_1;
void setup() {                 // Инициализируем цифровой вход/выход в режиме выхода.  /

Pin_226911677_1 = 13;
pinMode(Pin_226911677_1, OUTPUT);   }
void loop()
                { 
 digitalWrite(Pin_226911677_1, HIGH);   // зажигаем светодиод
delay(1000);              // ждем секунду
digitalWrite(Pin_226911677_1, LOW);    // выключаем светодиод
delay(1000);              // ждем секунду}
Так как создать блок чтоб он выглядел так и соответственно работал?

Некорректная работа пользовательского блока CODE

Добавлено: 02.03.2016{, 16:15}
Alex16
AlexRyzh писал(а):Так как создать блок чтоб он выглядел так
выглядит
AlexRyzh писал(а):и соответственно работал
и работает ...... соответственно
осталось решить какой вариант нужен.

Некорректная работа пользовательского блока CODE

Добавлено: 02.03.2016{, 16:47}
Слимпер
Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина? 
Или все же имелось виду, что при создании платы надо выбрать пин, тогда лучше это сделать через параметры пользователя.

Некорректная работа пользовательского блока CODE

Добавлено: 03.03.2016{, 01:12}
AlexRyzh
Alex16 писал(а):Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина?
 Это не так Вы поняли. Не по ходу исполнения, а если блок будет использоваться повторно или в другой сборке. Удобно просто изменить на входе номер пина.

Добавлено (03.03.2016, 01:12)
---------------------------------------------
AlexRyzh писал(а):осталось решить какой вариант нужен.
Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.

Некорректная работа пользовательского блока CODE

Добавлено: 03.03.2016{, 15:15}
Слимпер
AlexRyzh писал(а):Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.
Как я уже писал раньше, для этих целей сейчас работает только через "параметры пользователя". Делал себе блоки и таким образом.
Добавил блок на плату, дважды на нем щёлкнул, ввёл номер пина. По мне так довольно удобно.

Некорректная работа пользовательского блока CODE

Добавлено: 03.03.2016{, 20:19}
support
Значения  соответствующим входам переменным присваиваются в момент вызова блока.  Это вполне логично и правильно (программа то выполняется и значение на входе рассчитывается в зависимости от выполнения программы).  В Вашем случае Вам не зачем использовать промежуточную переменную ledPin, а в разделе Loop вместо неё использовать имя входа. И всё будет работать так как Вам нужно.
Я кстати писал в уроке и рассказывал в видео уроке о нежелательности объявления переменных в разделах отличных от DeclareSection, поскольку если Ваш блок использовать два раза в проекте то возникнет ошибка двойного объявления переменной в секции Setup. На данном этапе уникальность объявленных переменных гарантируется только для переменных объявленных в  DeclareSection.

Некорректная работа пользовательского блока CODE

Добавлено: 03.03.2016{, 23:01}
AlexRyzh
В принципе да, так работает. Но смущает то, что строка rty_158705149_1 = 13; записывается в секцию луп. Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.

Некорректная работа пользовательского блока CODE

Добавлено: 04.03.2016{, 07:19}
support
AlexRyzh писал(а):Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
А если значение на входе меняется? Вообще то для этого входы блоков и предназначены- передавать в блок изменяющиеся значения. А для не изменяющихся (настоечных) значений предназначены параметры блоков.