помогите с циклами
- Войдите на сайт для отправки комментариев
Сб, 29/04/2017 - 16:46
Дошло до обсурда. Где ошибка?
int f=8;
int g=13;
void setup() {
pinMode( g, OUTPUT);
pinMode( f, INPUT);
}
void loop() {
if (digitalRead (f)== HIGH);
{
digitalWrite (g, HIGH);
}
else
{
digitalWrite (g,LOW);
}
}
Выдает:
sketch_apr29b:14: error: 'else' without a previous 'if'
else
Буду очень признателен за помощь.
В процессе написания программы управления самодельного станка по упаковке грибного субстрата , вылезла ошибка по циклам. Пришлось изучить работу циклов на более простом коде. Ни чего не вышло. Полный затуп.
Ну, если до Обсурда, то вставьте Ваш код как положено - посмотрим.
Благодарю за отклик.
Код немножко другой но ошибка та же.
в 11 строке: ";" - лишнее
1. Что касается синтаксической ошибки, вопрос: что делает точка с запятой в строке 11?
2. Что касается названия топика - не обнаружил в коде никаких циклов.
Циклов здесь нет. Это я упрощал программу , чтобы найти ошибку. Несколько часов ломал голову.
Не програмировал лет семь, а на ардуино так вообще в первый раз.
Приперло сделать станок.
Строка такого плана прокатит.
if
(digitalRead(2) == HIGH && digitalRead(3) == HIGH && digitalRead(4) == HIGH )
просто нужно сравнить несколько значений.
Разобрался . Строку можно писать так:
if (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);
ЕвгенийП и T.Rook. Благодарю Вас
Разобрался . Строку можно писать так:
if (digitalRead(d) == LOW && digitalRead(s) == LOW && digitalRead(a) == LOW);
Нельзя! От чего шли, к той же ; и пришли
Опечатка.
А вот цикл While работать не хочет.
Вы специально сообщения об ошибках не выкладываете, чтобы проверить, разберёмся ли без них?
while не так пишется.
Позор Виктору Перестукину !!!
Контроллер проглотил. Ура.
Из за чего такая ошибка?
строка 16
А что с ней? К паременной привязал вывод . На плате он указан как 0. Для проверки ставлю другое число - таже ошибка.
Не могу найти как в программе обозначать выводы при привязке их к переменным. Очивидно как на плате написанно.
Из за чего такая ошибка?
collect2.exe: error: ld returned 1 exit status
Из-за WinXP.
Или обнови винду хотя бы до Win7, или поставь старую версию Arduino IDE (1.0.5, 1.5.*, 1.6.*)
А что с ней? К паременной привязал вывод . На плате он указан как 0. Для проверки ставлю другое число - таже ошибка.
Не могу найти как в программе обозначать выводы при привязке их к переменным. Очивидно как на плате написанно.
Вы либо не читаете, что Вам пишут, либо специально нас троллите. Вы открывали код, который Вам человек привёл? Читали его комментарий к 16-ой строке? Уж не знаю, как можно сказать понятнее - опечатку, блин, исправьте!
Прошу прощения. Я новичок на форуме . Не обратил внимания на ссылку.
Винипуху спасибо. Все заработало. Зря снёс ARDUINO IDE 1.8.2
Из за чего такая ошибка?
collect2.exe: error: ld returned 1 exit status
Из-за WinXP.
Или обнови винду хотя бы до Win7, или поставь старую версию Arduino IDE (1.0.5, 1.5.*, 1.6.*)
кстати, и на Win7 я, так же, умудряюсь получить ошибку collect2.exe, если особый бред пробую компиллять.
На ARDUINO это первая "серьёзная" программа , бреда хоть отбавляй. С Вашей помощью программа заработала. Еще раз оромное спасибо! Теперь несколько дней железу посвящу.
Сейчас делаю наброски на счётчик "моточасов". Эта часть программы должна считать количество станочных циклов и результат записывать в энергонезависимую память.(что-то вроде общего пробега автомобиля).
Волнует следующий момент. Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор. Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно? 100000 для станка это пару месяцев работы.
Возможно кто то сталкивался или знает как оптимально составить алгоритм программы лишенного этого недостатка.
Ещё бредовая идея: При старте считывать значение с eerprom и в процессе работы крутить её в ОЗУ. Одновременно считывать напряжение питания, как только питание просядит (выходная ёмкость БП должна быть соответствующей), пишем текущее значение обратно в eerprom.
Прошу Вашего мнения.
Волнует следующий момент. Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор. Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно? 100000 для станка это пару месяцев работы.
В общем случае эта проблема решение не имеет. Но, как правило, имеет различные варианты решения для конкретных условий.
1. Самое первое - сравнивать новое значение со считанным и писать только в том случае, если они различаются.
2. Использовать внешнюю EEPROM и менять ее при проведении профилактических работ каждые 2-3 месяца.
3. Вы сами предложили в сообщении выше - одно из стандарных решений.
Волнует следующий момент. Планирую реализовать эту функцию через хранение переменной типа long в eerprom , и каждый цикл считывать значение , прибавлять 1 и записывать обратно.Далее информация выводится на LCD 1602 индикатор. Но эта память рассчитана примерно на 100000 циклов. Означает ли это, что через 100000 циклов этот модуль будет работать не корректно? 100000 для станка это пару месяцев работы.
В общем случае эта проблема решение не имеет. Но, как правило, имеет различные варианты решения для конкретных условий.
....
2. Использовать внешнюю EEPROM и менять ее при проведении профилактических работ каждые 2-3 месяца.
....
Как вариант - внешнюю SD карточку
Еще варианты:
FRAM - https://habrahabr.ru/post/319336/
NV RAM в DS1302/DS1307
Итересное наблюдение.
Необходимо считывать четаре входа и если на всех единица , то запускаем процесс (логический элемент & с четырьмя входами). Взяв во внимание (http://arduino.ru/Reference/Boolean) написал строку так :
Но у меня эта строка работает как "или" Для исключения ошибки собрал отдельную схему.
В результате строка заработала как надо в таком виде:
Может while какойто особенный оператор ?
В результате мозги с исполняющими механизмами для станка заработали. Но есть недопонимание в этом вопросе.
Еще варианты:
FRAM - https://habrahabr.ru/post/319336/
NV RAM в DS1302/DS1307
Шикарный вариант!
Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while. Стало понятнее или по-прежнему неясно что делается?
Блин Ну почему не записать так
Но нет, надо нагородить кучу букв и потом терятся.
[quote=ЕвгенийП]
Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while.
Так это мне и надо.
Я про другое . Почему "&&" не работает как логическое "и" , а пришлось написать "ll" .
Как вариант - внешнюю SD карточку
Угу, в 10 раз дороже при в 10 раз меньшем ресурсе.
Блин Ну почему не записать так
Но нет, надо нагородить кучу букв и потом терятся.
Я пока в тонкастях написания не "ботаю" , пишу как в букваре написанно .
За вариант написания благодарю . Только он мне пока не понятен. Разберусь.
Я про другое . Почему "&&" не работает как логическое "и" , а пришлось написать "ll" .
1. "&&" вполне себе работает, как и должно.
2. "ll" - это логическое "или", которое тоже работает, но совсем не так, как логическое "и".
В целом сегмент так выглядет.
Я про другое . Почему "&&" не работает как логическое "и" , а пришлось написать "ll" .
1. "&&" вполне себе работает, как и должно.
2. "ll" - это логическое "или", которое тоже работает, но совсем не так, как логическое "и".
Хоть видео снимай, как у меня на столе с кнопками и светодиодами работает.
Понимаю, что чудес не бывает. Но где косяк не знаю. В принципе программа работает как надо.
Может попробывать на старой версии компилятора. Я на 1.8.2
Ваш while так как он написан, будет крутиться в бесконечно цикле ничегонеделания до тех пор, пока хотя бы на одном входе 0. И только, когда на всех входах окажется 1, начнёт выполняться то, что в программе идёт после этого while.
Так это мне и надо.
Я про другое . Почему "&&" не работает как логическое "и" , а пришлось написать "ll" .
Перечитайте внимательно то, что а написал.
Вы блин с чем сравниваете? С 0 или с 1. Очевидно, с 0. Тогда какое И? Вам надо крутиться в цикле до тех пор, пока там есть хоть один 0 - конечно же надо ИЛИ использовать.
Т.е. у Вас написано "крутиться в цикле пока там хоть один ноль"
Если Вы хотите использовать И, так писать надо по другому: прекращать крутиться в цикле, когда там все единицы.
Хоть видео снимай, как у меня на столе с кнопками и светодиодами работает.
https://youtu.be/W8AIDvaaOVM?list=RDi9AHJkHqkpw&t=74
Вы блин с чем сравниваете? С 0 или с 1. Очевидно, с 0. Тогда какое И?-
Ключевой момент .
Потихоньку начал "догонять".
На свежую голову вернусь к этому вопросу. Надо все варианты проиграть.