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

В этот форум переносятся темы из форума "Новые" которые при рассмотрении модератором или автором признанны либо не верными, либо ошибочными.
Ответить
Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

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

#1

Сообщение AlexRyzh » 02.03.2016{, 10:36}

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

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

Аватара пользователя
Alex16
Рядовой
Сообщения: 70
Зарегистрирован: 05.01.2016{, 01:20}
Репутация: 1
Откуда: Армавир

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

#2

Сообщение Alex16 » 02.03.2016{, 11:51}

Молодец ! Сам задал вопрос, сам ответил да еще и выводы сделал, одна только проблема - не работает.
Цитата AlexRyzh6110Я понимаю должно быть так:в разделе сетап, входной переменной
У тебя входная переменная(13) объявляется выходом порта (куда послать данные - порт 13)
AlexRyzh писал(а):входной переменной присваивается указанное входное значение ???????
а значение переменной - это что посылаем (1 или 0)
Вложения
led1-CODE-.ubi
(15.14 КБ) 84 скачивания
led-CODE-.ubi
(9.66 КБ) 73 скачивания
AlexA

Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

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

#3

Сообщение AlexRyzh » 02.03.2016{, 14:49}

Особо спорить не буду, я в С не силен, но Не пойму, что изменилось?
В Вашем примере "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);              // ждем секунду}
Так как создать блок чтоб он выглядел так и соответственно работал?
Последний раз редактировалось AlexRyzh 02.03.2016{, 15:15}, всего редактировалось 1 раз.

Аватара пользователя
Alex16
Рядовой
Сообщения: 70
Зарегистрирован: 05.01.2016{, 01:20}
Репутация: 1
Откуда: Армавир

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

#4

Сообщение Alex16 » 02.03.2016{, 16:15}

AlexRyzh писал(а):Так как создать блок чтоб он выглядел так
выглядит
AlexRyzh писал(а):и соответственно работал
и работает ...... соответственно
осталось решить какой вариант нужен.
Вложения
3044997.ubi
(3.83 КБ) 74 скачивания
AlexA

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

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

#5

Сообщение Слимпер » 02.03.2016{, 16:47}

Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина? 
Или все же имелось виду, что при создании платы надо выбрать пин, тогда лучше это сделать через параметры пользователя.

Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

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

#6

Сообщение AlexRyzh » 03.03.2016{, 01:12}

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

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

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

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

#7

Сообщение Слимпер » 03.03.2016{, 15:15}

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

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 787
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#8

Сообщение support » 03.03.2016{, 20:19}

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

Аватара пользователя
AlexRyzh
Сержант
Сообщения: 107
Зарегистрирован: 22.12.2015{, 11:06}
Репутация: 1
Откуда: Мелитополь
Контактная информация:

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

#9

Сообщение AlexRyzh » 03.03.2016{, 23:01}

В принципе да, так работает. Но смущает то, что строка rty_158705149_1 = 13; записывается в секцию луп. Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
Вложения
5148480.jpg

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 787
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#10

Сообщение support » 04.03.2016{, 07:19}

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

Ответить

Вернуться в «Не принятые»