Сохранени в EEPROM при помощи джампера
- Войдите на сайт для отправки комментариев
Возникла у меня идея сохранения в EEPROM параметров при помощи установки джампера. Суть такова: в разделе setup() подаем на один из свободных пинов логическую единицу (HIGH) и проверяем на соседнем пине уровень сигнала. Если там HIGH (установлена перемычка-джампер), то попадаем в меню настройки. Где энкодером выставляем нужное значение параметра. После того как значение установлено - вытаскиваем "джампер" и значение сохраняется в EEPROM. Кнопка энкодера никуда не подключена, и подключать ее я не хочу, т.к. это два дополнительных провода. То есть управляем только джампером. При этом не хотелось бы при каждом старте делать запись в EEPROM, т.к. ресурс у него ограничен.
Никак не могу придумать как это проще реализовать. Первое что приходит в голову: сначала считываем значение из EEPROM. Затем, если джампер установлен - попадаем в цикл while в условии у которого - высокий уровень напряжения на пине, замкнутом джампером. Как только while перестал выполняться (разомкнули джампер) - сравниваем исходное значение из EEPROM с текущим значением этой величины (установленной
Блин, случайно нажал Enter и не могу отредактировать заглавный пост. Админы помогите пожалуйста, дописываю продолжение:
Как только while перестал выполняться (разомкнули джампер) - сравниваем исходное значение из EEPROM с текущим значением этой величины (установленной энкодером) и если величины разные - сохраняем новое значение в EEPROM.
Может есть способ лучше, чтобы отловить размыкание джампера и сохранить значение в EEPROM только при выходе из цикла while? Или может еще как-то по другому это сделать? Подскажите пожалуйста.
Проще кнопкой. Если в момен включения нажата, то входим в настройку параметров с последующим сохранением в EEPROM. Не нажата - считываем из EEPROM. Проверку кнопки сделать в setup
Проще кнопкой. Если в момен включения нажата, то входим в настройку параметров с последующим сохранением в EEPROM. Не нажата - считываем из EEPROM. Проверку кнопки сделать в setup
когда не хватает пинов можно и джампером, у меня так и написана программа, если джампер замкнут, был только аналоговый пин A7, далее он используется в датчике тока, то в процедуру настройки, как только сняли, сохраняемся в епром и выходим
Опять кому то мало циклов перезаписи EEPROM
При правильной организации подсчёта циклов и смены ячеек, если менять значение раз в секунду , если нужно скажем сохранять два байта, то понадобится 578дней, для того, что бы убить весь ресурс EEPROM.
Это для какой версии IDE?
Это для какой версии IDE?
А при чем тут версия IDE ?
Два байта оставляем для идентификации номера рабочей ячейки, ещё 4 для подсчёта количества перезеписей.
Остаётся 1018 байт. Если писать 16-битную переменную, то можно менять ячейку 509 раз.
Производитель гарантирует минимум 100 000 циклов.
509*100000=50 900 000 перезеписей.
Если писать раз в секунду, то
50 900 000 /60/60/24= 589 дней.
Если что на эту тему у атмел(микрочип), есть и апноут и исходные коды функций.
https://www.microchip.com//wwwAppNotes/AppNotes.aspx?appnote=en592140
не далее как вчера у кубинца читал, что с версии 1.8 этот алгоритм уже реализован в библиотеке EEPROM.h
Проще кнопкой. Если в момен включения нажата, то входим в настройку параметров с последующим сохранением в EEPROM. Не нажата - считываем из EEPROM. Проверку кнопки сделать в setup
Нет, давайте представим, что кнопки нельзя подключать. Для этого есть две причины:
1. у конечного устройства не предусмотрены другие кнопки управления, кроме кнопки reset. Внутри корпуса крепить кнопку некуда, места маловато.
2. Настройка этих параметров нужна один раз за всю жизнь устройства. Ну максимум будет корректировка при смене механики. Поэтому я оставляю три штырька прямо на плате ардуино-нано и при необходимости настройки просто ставлю на два из них джампер. Всего мне надо настроить два параметра (поэтому три штырька). Один раз настроить - и забыть. Это даст возможность не заливать в каждое конкретное устройство свою прошивку, а использовать общую, просто подогнав эти два параметра.
Опять кому то мало циклов перезаписи EEPROM
Нет, мне их предостаточно. Просто зачем каждый раз при старте делать эту запись, когда параметры меняются раз в столетие. Большую часть жизни устройства они постоянны.
Основной вопрос: как сделать однократное сохранение в EEPROM при размыкании джампера. Наверно надо было это в раздел "Программирование" запостить.
Меня вдруг осенило: можно же использовать флаг для обеспечения "бесконечного" цикла while. А затем читать каждый раз состояние пина для выхода из цикла и однократного сохранения в EEPROM:
Меня вдруг осенило: можно же использовать флаг для обеспечения "бесконечного" цикла while. А затем читать каждый раз состояние пина для выхода из цикла и однократного сохранения в EEPROM:
Хернёй вас осенило.
Не нужны там никакие флаги и тем более while
Примерно так:
На момент выполнения setup() у меня нечего еще сохранять. Где мне брать величины, которые в EEPROM писать?
Именно для этого мне и нужен бесконечный цикл, в котором идет опрос энкодера.
Нет, давайте представим, что кнопки нельзя подключать. Для этого есть две причины:
1. у конечного устройства не предусмотрены другие кнопки управления, кроме кнопки reset. Внутри корпуса крепить кнопку некуда, места маловато.
2. Настройка этих параметров нужна один раз за всю жизнь устройства.
Ну кнопка, джампер - какая разница. Просто проверяем в момено включения (те в сетап).
На момент выполнения setup() у меня нечего еще сохранять. Где мне брать величины, которые в EEPROM писать?
Именно для этого мне и нужен бесконечный цикл, в котором идет опрос энкодера.
А что изменится на момено Loop()? А энкодер не обязательно в loop вызывать. Можно и на таймер посадить, а можно и по внешним прерываниям обрабатывать.
Хернёй вас осенило.
Не нужны там никакие флаги и тем более while
Примерно так:
Кстати, зачем вы сравниваете булеву величину digitalRead(pin) с единицей во второй строке?
Хернёй вас осенило.
Не нужны там никакие флаги и тем более while
Примерно так:
Кстати, зачем вы сравниваете булеву величину digitalRead(pin) с единицей во второй строке?
А с чем ее сравнивать ?
С задницей кенгуру ?
Проще кнопкой. Если в момен включения нажата, то входим в настройку параметров с последующим сохранением в EEPROM. Не нажата - считываем из EEPROM. Проверку кнопки сделать в setup
когда не хватает пинов можно и джампером,
Причем здесь нехватка пинов? Потом эту кнопку можно для чего угодно другого использовать. Тут главное проверить была ли она нажата в момент включения
Ну кнопка, джампер - какая разница. Просто проверяем в момено включения (те в сетап).
В том то и дело, что важна логика: 1. Если джампер замкнут - слушаем энкодер. 2. Когда джампер разомкнули - сохраняем значения в EEPROM. 3. Если джампер изначально не замкнут - пропускаем все это и берем ранее сохраненные значения из EEPROM
А что изменится на момено Loop()? А энкодер не обязательно в loop вызывать. Можно и на таймер посадить, а можно и по внешним прерываниям обрабатывать.
В loop() энкодер используется по другому, основному назначению. Я просто хочу использовать его еще и для установки этих параметров, чтобы не городить дополнительных кнопок.
Чтоб таких вопросов у вас больше не возникало предлагаю залить и испытать следующий код:
А с чем ее сравнивать ? С задницей кенгуру ?
Ни с чем ее не надо сравнивать, она уже булева. Можно так писать:
В том то и дело, что важна логика: 1. Если джампер замкнут - слушаем энкодер. 2. Когда джампер разомкнули - сохраняем значения в EEPROM. 3. Если джампер изначально не замкнут - пропускаем все это и берем ранее сохраненные значения из EEPROM
Ну хоти так, делайте так. Просто поскольку это одноразовое действие, то логичнее это делать в setup
В loop() энкодер используется по другому, основному назначению. Я просто хочу использовать его еще и для установки этих параметров, чтобы не городить дополнительных кнопок.
Ну и используйте на здоровье. И не городите кнопок. В чем проблема-то использовать энкодер в сетапе?
Так я и хочу это делать в сетапе, но для опроса энкодера нужен цикл, чтоб не выходить из сетапа
Так я и хочу это делать в сетапе, но для опроса энкодера нужен цикл, чтоб не выходить из сетапа
Еще раз -
1 Для обработки энкодера не обязателен цикл. Это можно делать и по внешним прерываниям.
2 Если вы очень хотите обрабатывать энкодер в цикле, то этот цикл не обязан совпадать с loop
А с чем ее сравнивать ? С задницей кенгуру ?
Ни с чем ее не надо сравнивать, она уже булева. Можно так писать:
Обычно те, кто об этом знает , таких идиотских решений как у вас не ищут.
А дуракам и начинающим надо на пальцах объяснять
Еще раз -
1 Для обработки энкодера не обязателен цикл. Это можно делать и по внешним прерываниям.
2 Если вы очень хотите обрабатывать энкодер в цикле, то этот цикл не обязан совпадать с loop
Еще раз: есть устройство у которого основная функция - обрабатывать повороты энкодера в цикле loop. К энкодеру присоединен ролик, через который протягивается кабель. Зная длину окружности ролика и количество щелчков энкодера на оборот - вычисляем длину кабеля. Это все делается в loop().
Но ролики бывают разные (желтые, белые, красные :-) ) и энкодеры тоже разные (18, 20, 24 клика/на оборот). Мне нужно при помощи уже существующего энкодера записать в EEPROM два параметра: длину окружности ролика и количество кликов энкодера на один оборот. Я хочу это делать один раз в setup() и потом забыть про эту настройку до тех пор пока что-нибудь не изменится. Например пока не изменится диаметр кабеля, т.к. от этого, как выяснилось, зависит длина на один оборот (чем толще кабель - тем длиннее кусок обернутый вокруг ролика).
setup() выполняется однократно и очень быстро, мне нужно его "зациклить", чтобы обрабатывать повороты энкодера во время настройки параметров.
setup() выполняется однократно и очень быстро, мне нужно его "зациклить", чтобы обрабатывать повороты энкодера во время настройки параметров.
Да сетап выполняется однократно, поэтому однократные действия туда лучше и помещать. А вот насчет быстроты - это уж как захотите. Можно хоть сколько угодно долго. Кто мешает вам получить данные от энкодера в сетапе?
Ни с чем ее не надо сравнивать, она уже булева. Можно так писать:
Можно, но авнакод detected. Функция digitalRead() отдает не bool а самый что ни на есть int пархатый. Пора менять сишные привычки, писать правильно
if ( digitalRead(...) == HIGH) ...
Срач waiting... :)
Обычно те, кто об этом знает , таких идиотских решений как у вас не ищут. А дуракам и начинающим надо на пальцах объяснять
Расскажите мне в чем идиотизм моего решения и как нужно делать правильно? Я собственно за этим сюда и написал.
А дуракам и начинающим надо сразу правильно писать. Они же всю жизнь так и будут это делать.
Пипец на пустом месте так забуксовать.
Лови:
Как-то заморочено слишком. Никто не заставляет обрабатывать кнопку энкодера в лупе. Достаточно в сетапе проверить - если она нажата в момент включения, вызвать настройки. И не нужны никакие джамперы (для установки которых еще и корпус вскрывать нужно и два пина предполагаются вместо одного)
Пипец на пустом месте так забуксовать.
Лови:
А действительно, что-то я туплю. EEPROM.put же ничего не будет писать, если значение не поменялось. И волки сыты и циклы EEPROM целы. Спасибо.
Как-то заморочено слишком. Никто не заставляет обрабатывать кнопку энкодера в лупе. Достаточно в сетапе проверить - если она нажата в момент включения, вызвать настройки. И не нужны никакие джамперы (для установки которых еще и корпус вскрывать нужно и два пина предполагаются вместо одного)
У энкодера кнопка не подключена. Считаем, что ее прото нет.
Ну и мне несложно вскрыть корпус (открутить два шурупа), поставить там джампер, настроить параметры и забыть. Это проще, чем отклеивать ардуину от корпуса (она посажена на термоклей), изменять скетч, заливать его в ардуину, вклеивать все на место.
Ни с чем ее не надо сравнивать, она уже булева. Можно так писать:
Можно, но авнакод detected. Функция digitalRead() отдает не bool а самый что ни на есть int пархатый. Пора менять сишные привычки, писать правильно
if ( digitalRead(...) == HIGH) ...
Срач waiting... :)
Поддержу, ведь пятница жеж )))
в этой конструкции ==HIGH явно лишнее if ( digitalRead(...) ) более чем достаточно
в этой конструкции ==HIGH явно лишнее if ( digitalRead(...) ) более чем достаточно
Для махрового Сишника - да. Или, если бы digitalRead() настоящий bool отдавал, то и для плюсника тоже было бы всё норм. А так, как я уже сказал - авнакод detected. :)
В качестве затраффки.
в этой конструкции ==HIGH явно лишнее if ( digitalRead(...) ) более чем достаточно
Для махрового Сишника - да.
ты же знаешь, я вообще не сталевар...отдаёт то она отдаёт, да кто бы это взял, я так понимаю конструкция IF читает регистр флагов... ждёмс в мышиных кодах, может кто выложит
У энкодера кнопка не подключена. Считаем, что ее прото нет.
Ну не подключена и бог с ней. В чем проблема то?
У энкодера кнопка не подключена. Считаем, что ее прото нет.
Ну не подключена и бог с ней. В чем проблема то?
видимо надо подсказать, как подключить
я так понимаю конструкция IF читает регистр флагов
Нахрена? PINx она читает, в порту PORTx
я вапще пишу, возможно, избыточный, но понятный мне даже через год код. Например, кнопка может быть подтянута к земле или к питанию, я не буду потом помнить чо да как, мне проще написать
и пусь ActiveLevel описана в самом начале, но в 100500 строчке кода
я буду знать, что здесь кнопка именно нажимается.
Ну не подключена и бог с ней. В чем проблема то?
В том, что мне ее настойчиво предлагают подключить, а я сопротивляюсь :-)
Ну и мне несложно вскрыть корпус (открутить два шурупа), поставить там джампер, настроить параметры и забыть. Это проще, чем отклеивать ардуину от корпуса (она посажена на термоклей), изменять скетч, заливать его в ардуину, вклеивать все на место.
Ну, т.е. куда джампер воткнуть есть, а догадаться туда же кнопку подключить - сложно? (подсказка - замкнутые контакты кнопки абсолютно идентичны установленному джамперу) Ну ладно, не обращайте внимания. Не надо - так не надо ))
Ну не подключена и бог с ней. В чем проблема то?
В том, что мне ее настойчиво предлагают подключить, а я сопротивляюсь :-)
И зачем? С точки зрения программы, что джампер, что кнопка выглядят абсолютно одинаково.
Ну, т.е. куда джампер воткнуть есть, а догадаться туда же кнопку подключить - сложно? (подсказка - замкнутые контакты кнопки абсолютно идентичны установленному джамперу) Ну ладно, не обращайте внимания. Не надо - так не надо ))
Свободных пинов у меня предостаточно. Дело не в их нехватке. Энкодер вынесен из устройства, и соединяется с ним кабелем, длиной 0.5 метра. Об этом я писал уже. При этом кабель трехжильный, разъем трехконтактный. Как думаете, стоит тянуть четвертую жилу (0.5 м) и менять разъем на четырехконтактый, ради одноразовой настройки устройства? Я считаю, что оно того не стоит.
Энкодер вынесен из устройства, и соединяется с ним кабелем, длиной 0.5 метра. Об этом я писал в заглавном посте. При этом кабель трехжильный, разъем трехконтактный. Как думаете, стоит тянуть четвертую жилу (0.5 м) и менять разъем на четырехконтактый, ради одноразовой настройки устройства? Я считаю, что оно того не стоит.
А кто мешает установить кнопку внутри устройства? Ну да не важно. Что кнопка, что джаммпер дают один и тот же сигнал. Какой смысл на этом зацикливаться?
Свободных пинов у меня предостаточно. Дело не в их нехватке. Энкодер вынесен из устройства, и соединяется с ним кабелем, длиной 0.5 метра. Об этом я писал в заглавном посте. При этом кабель трехжильный, разъем трехконтактный. Как думаете, стоит тянуть четвертую жилу (0.5 м) и менять разъем на четырехконтактый, ради одноразовой настройки устройства? Я считаю, что оно того не стоит.
Во-первых - заглавном посте об этом не написано. Во-вторых - имхо, странная реализация. Разобрать коробку, поставить джампер (который в нужный момент еще и завалится в какую-нибудь щелку), перейти к энкодеру, настроить значения, вернуться к коробке, снять джампер, собрать коробку. Вместо того, чтобы сделать все непосредственно на энкодере.
При чем здесь свободные пины - кнопку энкодера можно подключить к тем же пинам, на которые вы сейчас сажаете джампер. Протянуть два провода и подключить их напрямую. Про разъемы Дюпон никогда не слышали? ))
Впрочем, действительно, это надо было делать сразу ))
Во-первых - заглавном посте об этом не написано. Во-вторых - имхо, странная реализация. Разобрать коробку, поставить джампер (который в нужный момент еще и завалится в какую-нибудь щелку), перейти к энкодеру, настроить значения, вернуться к коробке, снять джампер, собрать коробку. Вместо того, чтобы сделать все непосредственно на энкодере.
Да, извиняюсь, это было не в заглавном посте.
Никуда не надо идти. 0.5 метра - это даже меньше расстояния вытянутой руки. Решение вполне нормальное ИМХО, если понимать что делать это нужно только один раз при настройке устройства. Возможно второго раза и не будет никогда. Джампер никуда не завалится, в общем случае это может быть тот-же Дюпонт-проводок мама-мама. После настройки выдергиваем перемычку, закрываем коробку и отдаем устройство конечному пользователю. Он туда никогда не полезет.
Джампер удобен тем, что сохраняет свое положение. Установил перемычку - и крути себе энкодер. Не нужно обрабатывать дребезг. Не нужны никакие флаги/условия. В коде джампер обрабатывать немного проще ИМХО. Логика очень простая: поставил джампер в одно положение, нажал ресет - и вот ты уже в "меню" сохранения первого параметра. Крутишь энкодер, смотришь на его значения на экране. Выдернул джампер - значения сохранились. Поставил во второе положение, нажал ресет - вот ты уже во втором "меню". Выдернул джампер, и все готово. Закрывай коробку и пользуйся.
Какой может быть дребезг, если кнопка уже нажата при запуске? В коде что джампер, что предварительно нажатая кнопка обрабатываются абсолютно одинаково. Единственное - если вам нужно настраивать два параметра, то кнопки экнодера будет мало
Поставил во второе положение, нажал ресет - вот ты уже во втором "меню". Выдернул джампер, и все готово. Закрывай коробку и пользуйся.
Ну джампер так джампер. Вопрос же вроде по программированию был. Все с этим стало понятно?
Да, вопрос решен. Спасибо всем участникам!
пипец... развели 50 сообщений на пустом месте :))
пипец... развели 50 сообщений на пустом месте :))
так пятница жеж...
У меня приятель попросил джампер, так как нельзя утяжелять конструкцию ни на грамм