Проблема чтения EEPROM при записи скетча через программатор
- Войдите на сайт для отправки комментариев
Уважаемые форумчане, добрый день.
Столкнулся с такой проблемой. Есть простая программа (код ниже) для Ардутно Нано, светодиода и кнопки. Кнопкой можнго светодиод включить/выключить, при этом состояние светодиода (включен он или выключен) сохраняется в постоянноьй памяти. То есть, при пуске программы код перваым делом считывает значения ячейки из постояннолй памяти. Если порследний раз светодилж горел, то он при пуске зажжется, если не горел - то, естественно, нет.
Суть проблемы: При записи скетча через USB Нано все работает исправно. При записи через USBASP программатор программа не работает. Светодиод загорается сразу, на кнопку нет реакции.
Перед каждой загрузкой прораммы произвожу очистку EEPROM (для чистоты эксперимента) - поэтому при первом вклюяении (до нажатия кнопки) светодиод гореть не должен.
ДОПОЛНИТЕЛЬНО ВАЖНЫЙ МОМЕНТ
Если строку 25 закомментировать
25 // EEPROM.write(100, led_state);
то программа начинает исправно работать как при записи через порт USB Нано, так и через USBASP программатор. Только не будет происходить чтения записанного состояния светодиода.
Строка чтения EEPROM при записи скетча через программатор рушит программу. В чем может быть проблема?
Буду очень признателен за пормощь.
а я вроде вам писал уже ..... после 24 строки выведете в монитор порта состояние переменной led_state - хоть один раз ноль будет?
Очистка EEPROM делается вовсе не обязательно нулями, может быть 255. Так что напишите строку 24 по-человечески
led_state = ! led_state;
И должно всё заработать.
И ещё, мужики, не бесите. Если Вам нужна помощь, то выкладывайте полный (от слова совсем полный) (не знаете что означает это слово - смотрите в словаре) код. Задолбали уже через одного - "я удалил то, что несущественно". Вот, блин, мы тут все такие умные - отлично знаем, что существенно, а что - нет, только две строчки отладить не можем :(
Евгений, большое спасибо за дельный совет.
Я выложил полную программу. Внес изменения, все заработало. Через USBASP программатор пишется исправно. Только при первом после загрузки включении светодиод начинает сразу светиться.
И ещё, мужики, не бесите. Если Вам нужна помощь, то выкладывайте полный (от слова совсем полный) (не знаете что означает это слово - смотрите в словаре) код. Задолбали уже через одного - "я удалил то, что несущественно". Вот, блин, мы тут все такие умные - отлично знаем, что существенно, а что - нет, только две строчки отладить не можем :(
Мсье знает толк...
Всетаки, кмк , best practice это когда выкладывается минимальный пример который воспроизводит проблему. Если проблема не воспроизводится на другом железе, тогда смотреть остальное.
А то читать простыню где идёт обращение к серверу, когда ошибка в при работе с EEPROM, так себе удовольствие.
Да, этот подход предполагает что код работы с сервером никак не затрагивает исправность работы с EEPROM.и вопрошающий помощи это понимает.
Евгений, большое спасибо за дельный совет.
Я выложил полную программу. Внес изменения, все заработало. Через USBASP программатор пишется исправно. Только при первом после загрузки включении светодиод начинает сразу светиться.
эх....нельзя намеками подсказывать - нужно конкретно решение всегда писать.
чтоб при старте всегда не горел светодиод - в setup в eeprom прописываете значение что светодиод не горит, и соотвественно led state 0 делаете
Поясняю свои слова . Записываем программу в предварительно очищенную память через USB порт и через USBasp программатор.
При записи программы через USB порт светодиод посе заливки программы не загорается. При записи через программатор - всегда загорается.
В остальном все работает идентично
а надо то как????? чтоб горел или чтоб не горел при старте :) ?
Не важно. Нужно, чтобы было одинаково, и понять, в чем была причина
Не важно. Нужно, чтобы было одинаково, и понять, в чем была причина
"одинаково" с чем ?
при загрузке через USBASP программатор и через USB вход
не, я тупой, нифига не понял. Какая хрен разница через что программировать - светодиод должен гореть или нет при старте? или запоминаться предыдущее состояние?
вот вам кусок из реальной программы включения реле в зависимости от последнего состояния, сделайте аналогично и будет вам счастье
Я выложил полную программу.
Да, что Вы? А теперь возьмите её из того поста, вставьте в чистый файл и попытайтесь скомпилировать. Получите сообщение, что EEPROM не определено. Это Вы называете полной?
Какая хрен разница через что программировать
Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.
Какая хрен разница через что программировать
Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.
А где это конфигурируется?
Виноват, опростоволосился. Пропустил первую строчку при копировании. Сейчас код полностью.
Прошиваю этот код через USB и через программатор. Через USB - Работает. Через программатор - нет. Совет Евгения П помогает.
Евгений, поясните пожалуйста, что Вы понимаете под настройками IDE (чистка епром)? Это настройки фьюзов? Перед прошивкой Нано через USB я сначала прошиваю загрузчик через прогррамматор (при этом он конфигурирует фьюзы).
Когда я пишу код через программатор загрузчик стирается, но конфигурация фьюзов меняться при этом не должна.
Я не очень силен в программировании, моэтому могу не совсем корпектно ставить вопросы. Прошу не судить строго.
Какая хрен разница через что программировать
Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.
Это понятно, мне не понятно что ТС хочет увидеть при старте.
Какая хрен разница через что программировать
Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.
Одинаковости поведения девайса при любом способе прошивки
Прошивка МК должна приравниваться к аварийной ситуации в которой содержание EEPROM было утеряно или искажено. При этом приводится в действие план "Б", при котором самой прошивкой в долговременную память записываются корректные дефолтные данные и, при необходимости, об этом сообщается пользователю. Теряете при замене прошивки EEPROM МК - пишите во внешнюю память, которую ни один прошивальщик не достает физически. Не надейтесь на то, что IDE никогда не будет запускать дудку без опций полной зачистки МК - это сэкономит кучу нервов и времени.
Господа, есть пример кода с корректировкой от Евгения П Возьмём его за основу и записываем 2 способами Через USB и через программатор в ардуино Нано. Эксперимент проводим одинаково. Сначала прошиваем загрузчик. Потом в примерах IDE запускаем программу ЕЕPROM clear. Чтобы в еепром были нули. Это подготовка. Далее прошиваем код. При прошивке через USB при старте светодиод не горит. Понятно почему. В ячейках еепром прописан 0
После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.
Насколько мне известно, при "стирании" в EEPROM записывается 255, а не 0. Соответственно, если хотите, чтобы работа программы не зависела от способа прошивки, минимум, надо писать 255.
Господа, есть пример кода с корректировкой от Евгения П Возьмём его за основу и записываем 2 способами Через USB и через программатор в ардуино Нано. Эксперимент проводим одинаково. Сначала прошиваем загрузчик. Потом в примерах IDE запускаем программу ЕЕPROM clear. Чтобы в еепром были нули. Это подготовка. Далее прошиваем код. При прошивке через USB при старте светодиод не горит. Понятно почему. В ячейках еепром прописан 0
После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.
Я же вам готовый пример привел, если меняется МК или обнуляется eeprom - светодиод никогда при старте не загорится - что ещё не так?
После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.
Вам умный человек сказал умную вещь в посте #3, но Вы этот совет игнорируете.
Ну, напечатайте Вы, наконец, содержимое епрома и убедитесь, что нету там нулей, потому и загорается. Просто напечатайте и посмотрите.
Ваш фраза "пишем через программатор" ни о чём без параметров avrdude
Вводная
"When the -U option with flash memory is specified, avrdude will perform a chip erase before starting any of the programming operations, since it generally is a mistake to program the flash without performing an erase first. ... This will reset the contents of the flash ROM and EEPROM to the value `0xff' , and clear all lock bits."
-D Disable auto erase for flash. When the -U option with flash memory is specified, avrdude will perform a chip erase before starting any of the programming operations, since it generally is a mistake to program the flash without performing an erase first. This option disables that. Auto erase is not used for ATxmega devices as these devices can use page erase before writing each page so no explicit chip erase is required. Note however that any page not affected by the current operation will retain its previous contents.
Так Вы ещё вчера ТС посоветовали печатать, но он предпочитает работать вслепую и мозг всем выносить.
У него в опция avrdude стоит -e (в конфигурационных файла IDE), отсюда и вся фигня.
0xFF, а не 0, Карл! Вот он и горит при запуске, а куда ему деваться?
Aleksandr1968, Вы бы делали, что Вам говорят. Напечатали бы, как Вам ещё вчера утром посоветовали, уж давно бы всё поняли.
sadman41, зря Вы так. Человек должен был, наконец, сам напечатать. Про эту FF уже писали и №25 и в №16 - не доходило. И не дойдёт, пока САМ не напечатаешь. А Вы всё сделали за ТС - завтра будет тоже самое.
Ладно... больше не буду пить с утра, а то излишне добрым становлюсь.
Очень много умных слов, дайте осмыслить и добиться просветления.
Насколько мне известно, при "стирании" в EEPROM записывается 255, а не 0. Соответственно, если хотите, чтобы работа программы не зависела от способа прошивки, минимум, надо писать 255.
Это мой встроенный в IDE EEPROM Clear. Он пишет 0
Это мой встроенный в IDE EEPROM Clear. Он пишет 0
А после этого Вы запускаете прошивание и в процессе этого прошивания туда пишется 255.
Слушайте, я пишу Вам в последний раз, просто напечатайте свой епром и посмотрите. Если Вы и на этот раз этого не сделаете, я считаю, что Вы просто нас троллите - тогда без меня.
sadman41, кстати, заметьте, таки не дошло.
Всё-таки
пока САМ не напечатаешь
Это мой встроенный в IDE EEPROM Clear. Он пишет 0
sadman41, кстати, заметьте, таки не дошло.
Всё-таки
Так выходит, что я ничего и не испортил - можно продолжать клевать его в печень ))
Главное свою печень не победить)
А ТС пусть мучается дальше.
To ТС : бесплатный совет--если что то не получается - выводите переменные в консоль после каждой строки - возможно тогда придёт понимание.
for (int i = 0; i < 1024; i++) {
Serial.println(EEPROM.read(i),HEX);
}
Вставить в setup и посмотреть в том и другом случае. Это трудно?
for (int i = 0; i < 1024; i++) {
Serial.println(EEPROM.read(i),HEX);
}
Вставить в setup и посмотреть в том и другом случае. Это трудно?
" А девкой был бы краше" )))
PS я не настоящий сталевар, поправьте, чтобы еще краше )))
Открою вам секрет - в IDE есть Examples к библиотеке EEPROM. И там уже написан скетчик eeprom_read...
Как тут жизнь кипит, оказывается!
Только до компа добрался. Сделал вывод в порт. Ваши слова подтвердились. Когда гружу программу через USB все работает. Диод горит - выводится 1, не горит - 0.
При загрузке через программатор светодиод зажигается сразу и в порт идет 255. После нагжатия кнопки диод гаснет - в порт идет 0. Повторное нажатие - диод загорается - в порт идет 1. Кроме того сносятся 2 лок фьюза, которые устанавливаются при прошивке загрузчика. Реально программатор забивает ЕЕПРОМ числом 255.
Открою вам секрет - в IDE есть Examples к библиотеке EEPROM. И там уже написан скетчик eeprom_read...
Где Вы раньше были, ну ничего размял мозги:
Теперь вопос как с avrdude бороться
Здесь очень нужна детальная помощь. С ходу разобраться не могу, пока слабое поверхностное понимание
Какие опции отключить и как это сделать?
Есть, то она есть, но не про нашу честь, почувствуйте разницу!!!

Это понятно, что не сам программатр. Как эти опции правильно сконфигурировать, что с ними делать?
Включить fuse-бит EESAVE.
Это понятно, что не сам программатр. Как эти опции правильно сконфигурировать, что с ними делать?
1. Почитать про них и знать что какой флажок означает.
2. Залезть в конфигурационный файл IDE и поставить те, какие нужны
Открою вам секрет - в IDE есть Examples к библиотеке EEPROM. И там уже написан скетчик eeprom_read...
Где Вы раньше были, ну ничего размял мозги:
Замысловатый кот. Предлагаю свой вариант:
А стоковый скетч делает ровно то, что ему положено. Формат вывода - это уже вкусовщина.