Некорректная работа пользовательского блока CODE
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Некорректная работа пользовательского блока CODE
Делал я пользовательский блок, который должен подать питание на датчик на короткое время и за это время опросить датчик и отключить питание датчика.
Для того, чтоб кратковременно подать питание на датчик, я использую любой цифровой пин. Но какой это будет пин, я указываю на входном выводе блока ( для удобства, в любой момент поменять используемый пин). Но как выяснилось этот метод не работает должным образом.
Сейчас покажу на простом примере подачи питания на светодиод пин 13.
В разделе Сетап присваиваем переменной номер пина, поступившего со входа:
Ну и собственно сам код программы мигания диодом Вставляем блок в плату и назначаем на вход пин 13 Открываем компилятор и видим такую картину: Естественно программа работать не будет, т.к. сначала присваивается переменная, которая еще пустая, а уже в секции Луп присваивается значение этой переменной.
Почему не наоборот??? Почему то что я указал сделать в разделе Сетап, делается в разделе Луп???
Я понимаю должно быть так:
в разделе сетап, входной переменной присваивается указанное входное значение, и только после этого ledPin получает из нее значение.
Для того, чтоб кратковременно подать питание на датчик, я использую любой цифровой пин. Но какой это будет пин, я указываю на входном выводе блока ( для удобства, в любой момент поменять используемый пин). Но как выяснилось этот метод не работает должным образом.
Сейчас покажу на простом примере подачи питания на светодиод пин 13.
В разделе Сетап присваиваем переменной номер пина, поступившего со входа:
Ну и собственно сам код программы мигания диодом Вставляем блок в плату и назначаем на вход пин 13 Открываем компилятор и видим такую картину: Естественно программа работать не будет, т.к. сначала присваивается переменная, которая еще пустая, а уже в секции Луп присваивается значение этой переменной.
Почему не наоборот??? Почему то что я указал сделать в разделе Сетап, делается в разделе Луп???
Я понимаю должно быть так:
в разделе сетап, входной переменной присваивается указанное входное значение, и только после этого ledPin получает из нее значение.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Некорректная работа пользовательского блока CODE
Молодец ! Сам задал вопрос, сам ответил да еще и выводы сделал, одна только проблема - не работает.
Цитата AlexRyzh6110Я понимаю должно быть так:в разделе сетап, входной переменной
У тебя входная переменная(13) объявляется выходом порта (куда послать данные - порт 13)
Цитата AlexRyzh6110Я понимаю должно быть так:в разделе сетап, входной переменной
У тебя входная переменная(13) объявляется выходом порта (куда послать данные - порт 13)
а значение переменной - это что посылаем (1 или 0)AlexRyzh писал(а):входной переменной присваивается указанное входное значение ???????
У вас нет необходимых прав для просмотра вложений в этом сообщении.
AlexA
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Некорректная работа пользовательского блока CODE
Особо спорить не буду, я в С не силен, но Не пойму, что изменилось?
В Вашем примере "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);
Добавлено (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);
Добавлено (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 мар 2016, 15:15, всего редактировалось 1 раз.
Некорректная работа пользовательского блока CODE
выглядитAlexRyzh писал(а):Так как создать блок чтоб он выглядел так
и работает ...... соответственноAlexRyzh писал(а):и соответственно работал
осталось решить какой вариант нужен.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
AlexA
Некорректная работа пользовательского блока CODE
Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина?
Или все же имелось виду, что при создании платы надо выбрать пин, тогда лучше это сделать через параметры пользователя.
Или все же имелось виду, что при создании платы надо выбрать пин, тогда лучше это сделать через параметры пользователя.
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Некорректная работа пользовательского блока CODE
Это не так Вы поняли. Не по ходу исполнения, а если блок будет использоваться повторно или в другой сборке. Удобно просто изменить на входе номер пина.Alex16 писал(а):Ну вообще то я не понял за чем вам по ходу исполнения программы менять номер пина?
Добавлено (03.03.2016, 01:12)
---------------------------------------------
Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.AlexRyzh писал(а):осталось решить какой вариант нужен.
Некорректная работа пользовательского блока CODE
Как я уже писал раньше, для этих целей сейчас работает только через "параметры пользователя". Делал себе блоки и таким образом.AlexRyzh писал(а):Я так и сделал, и все работает как я хотел, но было бы удобно на входе указывать константу (или переменную) номер пина. Но такой метод не хочет работать.
Добавил блок на плату, дважды на нем щёлкнул, ввёл номер пина. По мне так довольно удобно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Слимпер 03 мар 2016, 15:16, всего редактировалось 1 раз.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Некорректная работа пользовательского блока CODE
Значения соответствующим входам переменным присваиваются в момент вызова блока. Это вполне логично и правильно (программа то выполняется и значение на входе рассчитывается в зависимости от выполнения программы). В Вашем случае Вам не зачем использовать промежуточную переменную ledPin, а в разделе Loop вместо неё использовать имя входа. И всё будет работать так как Вам нужно.
Я кстати писал в уроке и рассказывал в видео уроке о нежелательности объявления переменных в разделах отличных от DeclareSection, поскольку если Ваш блок использовать два раза в проекте то возникнет ошибка двойного объявления переменной в секции Setup. На данном этапе уникальность объявленных переменных гарантируется только для переменных объявленных в DeclareSection.
Я кстати писал в уроке и рассказывал в видео уроке о нежелательности объявления переменных в разделах отличных от DeclareSection, поскольку если Ваш блок использовать два раза в проекте то возникнет ошибка двойного объявления переменной в секции Setup. На данном этапе уникальность объявленных переменных гарантируется только для переменных объявленных в DeclareSection.
Автор программы FLProg.
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Некорректная работа пользовательского блока CODE
В принципе да, так работает. Но смущает то, что строка rty_158705149_1 = 13; записывается в секцию луп. Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Некорректная работа пользовательского блока CODE
А если значение на входе меняется? Вообще то для этого входы блоков и предназначены- передавать в блок изменяющиеся значения. А для не изменяющихся (настоечных) значений предназначены параметры блоков.AlexRyzh писал(а):Зачем в каждом цикле выполнять эту строку? Если ее можно выполнить 1 раз в секции Сетап.
Автор программы FLProg.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость