5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
1 | ||||||
Произвольное измениние переменной без нажатия кнопки29.07.2016, 19:02. Показов 1131. Ответов 20
Метки нет (Все метки)
Прошу прощения за идиотский вопрос, но у меня беда с логическим выполнением. грубо говоря на плате 2 кнопки, переменная err =1, если нажимаем кнопку "1" то вызывается функция tempmenu и ждет нажатия другой кнопки. и в принципе все так и работает, но через некоторое время (около 5 секунд) err устанавливается в 1, так как вместо надписи "ждем меню" появляется "все пучком", но эта переменная может изменится только после нажатия кнопки, почему она сама меняется если верхний if дает false не могу понять.
ATmega32a, компил. atmel studio 7
0
|
29.07.2016, 19:02 | |
Ответы с готовыми решениями:
20
Как отправить все чекбоксыы без обновления страницы и без нажатия кнопки? Действие без нажатия кнопки Посчитать без нажатия кнопки Считывание переменной без нажатия Enter Расчет без нажатия кнопки Выполнить |
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
29.07.2016, 19:23 [ТС] | 3 | |||||
Прошу прощения, в комментах завалялась ))
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||||||||||||
31.07.2016, 07:24 | 5 | |||||||||||||||
несколько пожеланий
меняется на одну строчку
i что за переменная? где определена? тогда i2 никогда не вернется к 0, точнее вернется но через 256 нажатий или это описка и должна быть i2? и какая переменная скачет? скинь полностью файл или проект Добавлено через 3 минуты замени на
1
|
Модератор
|
|||||||||||
31.07.2016, 09:38 | 6 | ||||||||||
Ещё можно применить тернарный оператор
Добавлено через 2 минуты Ещё, возможно, что i2 надо определить как volatile - чтобы оптимизатор не удалил код там, где i2 не модифицируется Добавлено через 7 минут Ещё, возможна ситуация со срабатыванием WDT. Несколько лет назад, avr-gcc не отключал его при инициализации, это требовалось сделать или вручную или установкой fuse. Добавлено через 2 минуты
Не по теме: Sorry, у меня старинный браузер "не хочет" "нажимать" на кнопки кода, а соответствующие BBCode плохо помню.
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
02.08.2016, 20:14 [ТС] | 8 | |||||
Не понял логики ? и каким образом меню будет меняться при нажатии кнопки? В таком случае оно просто все перелистнулось и все.(проверил)
По Вашим советам заменил кое что и сам поколдовал вот весь код
Оптимизировать сейчас код не имеет смысла , так как на доставшейся "кривой плате" стоит мега32а , но которой висит дисплей и считывается всего 4 ножки + 2 управляют реле Добавлено через 7 часов 53 минуты Попробовал вставить Ваш код, не помогло
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
02.08.2016, 20:32 | 9 |
меню не будет, будет меняться переменная
Это аналог конструкции с if, только более гибкий есть такое понятие "конечный автомат" ежли поставить в бесконечный цикл, то да но ведь это нужно вставить в функцию tempmenu, вместо конструкции if Добавлено через 2 минуты вот зачем здесь break? тебе нужно провалится и обнулить i2
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
|
02.08.2016, 20:53 [ТС] | 10 |
не поверите, буквально 3 минуты назад, до Вашего сообщения, убрал этот break и все заработало и только хотел написать сообщение и увидел Ваш пост. Но чего не могу понять, так это почему он мешает, ведь он должен всего лишь вывалиться из switch, а дальше по циклу в случае необходимости снова вызвать tempmenu.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||||||||||||
02.08.2016, 21:15 | 11 | |||||||||||||||
смотри что происходит
i2 равно 4
при следующем заходе в функцию выполняется это,будем считать что кнопки правильно нажимаются
далее switch поскольку для нуля нет ветки попадаем сюда
в результате "мертвый цикл" а если уберешь break то сразу обнуляешь i2
1
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
|
03.08.2016, 08:38 [ТС] | 12 |
ValeryS, Спасибо огромное теперь понял логическую ошибку.
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
05.08.2016, 17:54 [ТС] | 13 | |||||
Еще один момент не могу осилить, если в case написать
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
05.08.2016, 18:24 | 14 | |||||
ввести еше одну переменную -флаг равен 1
и в switch обнулять примерно так
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
05.08.2016, 19:02 [ТС] | 15 | |||||
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
||||||
06.08.2016, 11:38 [ТС] | 17 | |||||
Здесь пропустил, но в программе оно есть и не помогает ((
0
|
Модератор
|
|||||||||||
06.08.2016, 12:46 | 18 | ||||||||||
Не по теме: dj_oni, вы сейчас подошли к ситуации, когда перемешанные интерфейс и логика работы мешают разобраться в ситуации, почему не работает. Добавлено через 11 минут И ещё - нас на уроках учили такому приёму программирования МК "разрезания циклов" - когда процесс (например, опрос клавиатуры) не оставляет управление у себя в цикле ожидания, а сохраняя текущее состояние в переменной отдаёт управление другому процессу. К примеру, ждём нажатия кнопки вместо
0
|
5 / 5 / 2
Регистрация: 02.10.2013
Сообщений: 130
|
|||||||||||
07.08.2016, 09:18 [ТС] | 19 | ||||||||||
i2, flag - обычное условие, err - он и в африке errror, а ranf просто некая переменная для инкремента, коих у меня валом, так как case условий 12 штук, но смысл их выкладывать лишние case? в проге лишние case закоменчены и работаю только с тем куском кода в котором проблема.
насчет i2 с чего ему меняться каждые 120 мс если условие не выполняется, а конкретно кнопка не нажата? Проблема заключается в том, что опрос кнопок сидит в вечном цикле, как вынести условие case за пределы постоянного опроса этого я не могу понять. т.е. если вошли в 1 case условие, должны его выполнить один раз и выводить на дисплей одно и тоже, до тех пор пока не нажмем 1,2... и т.д . кнопку Добавлено через 8 минут Я пробовал разделить и разнести их в разные функции функция 1:
Добавлено через 20 часов 11 минут Понял свою ошибку flag нужно проверять в самом case условии и только там где необходимо. Но вот другой вопрос не совсем уже в тему, но все с той же программой связано. Пишу дальше прогу и понимаю, что придется общаться с eeprom ладно бы только чтение, но необходимо еще и записывать переменную и относительно часто (10 раз в день, может чаще). Если я правильно себе все представил, то на ножку(к примеру PA0) микрухи должна подаваться логическая 1 с питания через оптрон, а сама микруха запитывается через конденсатор большой емкости и в случае исчезновения 1 на ноге , все переменные записываются в eeprom. Собственно говоря на этой чудной плате выше описаного процесса не происходило(просто нет элементной базы для этого) и есть предположение что eeprom мог исчерпать свой ресурс по записи, по крайней мере когда записывал файл epp, программа uniprof поругалась на несколько адресов, но все вроде записала и все вроде работает. Можно как то проверить eeprom и в случае чего допустим обойти поврежденную часть памяти? Просто новую микруху покупать не хочется.
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
07.08.2016, 09:24 | 20 |
100 000 циклов тебе достаточно?
зачем такие сложности? записывай когда нужная переменная изменится А вот как записывать зависит от компилятора, в CVAVR например запись что в ОЗУ, что в EEPROM синтаксически никак не отличаются,разница в объявлении попробуй стереть перед записью
0
|
07.08.2016, 09:24 | |
07.08.2016, 09:24 | |
Помогаю со студенческими работами здесь
20
Обработка нажатия кнопки без фиксации Запуск функции без нажатия кнопки Скрипт с кнопки выполняется без её нажатия Расчет значений без нажатия кнопки Результат нажатия кнопки без обновления страницы Отправка данных из Формы без нажатия кнопки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |