Eeprom + avrdude
- Войдите на сайт для отправки комментариев
Здравствуйте! Ох давно я не писал на этом форуме. Но время пришло!!!!
Возникла проблема которую я не могу решить.
Предыстория. Написал я скетч который выполняет определённые действия НО перед стартом (запуском устройства) считываются данные из eeprom памяти.
Тут мне понадобилось записать чисто скетч в контроллер НО без бута!. Выяснил где лежит скомпилированный hex файл. Залил при помощи avrdude. НО необходимо также прописать eeprom.
Вот тут и есть загвоздка.
1)как написать файл для eeprom? (в интернете мало чего вообще есть про eeprom)
2) как залить его в контроллер?
Дело в том что я пробовал прочитать eeprom контроллера при помощи Дутки. Но файл который должен был содержать в себе eeprom память всё время пустой.
Также пробовал писать программу которая заполняет eeprom. Залил hex этой программы (бус бута). Но всё тоже. Файл пуст.
Также вопрос. я хочу научиться писать программы для МК на языке С. Подскажите какой компилятор лучше использовать. Также было бы здорово если бы он имел модуль загрузки скетча (как в IDE arduino).
А вы уже разобрались со следующими вопросами?
- как прочитать данные из EEPROM в RAM
- как записать данные из RAM в EEPROM
- как объявить переменную, размещенную в EEPROM
Если нет - начните с них. Если да, то присвоить начальное значение переменной при ее объявлении является самой что ни на есть тривиальной задачей.
Как читать и записывать я разобрался. Про переменные я не смотрел. Я просто объявляю переменную. Потом присваиваю значение из ячейки памяти.
Конечно можно и присваивать. Но тогда меняется суть всей задачи.
В процессе выполнения программы в eeprom записываются и изменяются важные переменные. И если пропадает питания а потом снова подаётся то я бы хотел чтобы программа продолжала выполнять свои действия с момента отключения питания.
GCC- в первый раз слышу про это. Как я понял из википедии : это набор компиляторов. Только не очень понятно. Как он будет компилировать код для МК. Нужен плагин?
Как читать и записывать я разобрался. Про переменные я не смотрел. Я просто объявляю переменную. Потом присваиваю значение из ячейки памяти.
Конечно можно и присваивать. Но тогда меняется суть всей задачи.
Так вы "присваиваете" или "не присваиваете"?
И что вы подразумеваете под переменной и под ячейкой памяти? Ведь в общепринятом смысле переменная - это всего лишь юолее удобный (для программиста) способ обращения (чтение/запись) к определенной ячейке памяти. Кроме того, в микроконтроллерах AVR (да и во многих других типах тоже) три типа памяти: память программ (Flash), RAM и EEPROM. В теме, где речь идет о работе как минимум с двумя типами памяти, писать просто "память" - неаккуратненько как-то.
В процессе выполнения программы в eeprom записываются и изменяются важные переменные. И если пропадает питания а потом снова подаётся то я бы хотел чтобы программа продолжала выполнять свои действия с момента отключения питания.
Уточните: программа должна продолжать выполняться именно с того шага, где произошел сбой? Или все же - с самого начала, но с использованием накопленной ранее информации? Это - как ни крути - две большие разницы.
GCC- в первый раз слышу про это. Как я понял из википедии : это набор компиляторов. Только не очень понятно. Как он будет компилировать код для МК. Нужен плагин?
Нужно умение работать с командной строкой (а для этого необходимо изучить хотя бы основы публикуемой в мануалах информации. Например, здесь почитать). Ну или не париться и предоставить это оболочкам типа Arduino IDE.
Вообще, зачем вам "компилятор Си" конкретно? Чего не хватает из возможностей, доступных через оболочку Arduino IDE? Чего вы надеетесь достигнуть, напрямую работая с компилятором, сборщиком, загрузчиком?
Мне кажется или кто то хочет просто порассуждать на тему…..
именно так.
Я хочу понимать более конкретно все процессы написания кода.
Мне кажется или кто то хочет просто порассуждать на тему…..
Мне кажется, или кто-то хочет получить четкие инструкции в ответ на весьма расплывчатый вопрос...
именно так.
Для этого необходимо уметь
а) записывать данные в EEPROM
б) считывать данные из EEPROM
Как вы упомянули постом ранее, и то и другое вы уже умеете делать. В таком случае непонятно, в чем же состоит ваша проблема.
Я хочу понимать более конкретно все процессы написания кода.
Имеется в виду "написание кода" на Си? Так практически все возможности чистого компилятора GCC доступны и из оболочки Arduino. А по поводу использования компонент GCC напрямую в нете информации тоже более, чем достаточно.
Я хочу чтобы прошивка на МК была без бута! Программа так устроена что если при чтении в памяти окажутся 0. То программа просто зависнет. Даже при первом старте в памяти должны быть исходные данные. Будем считать так. В памяти хранятся данные для калибровки датчиков. Чтобы каждый раз их не калибровать в ручную. Я использую eeprom.
Да и ещё. Когда я пишу дуткой то сначала очищается весь контроллер а потом записывается прошивка. Возможно ли очищать только флэш память, a eeprom не трогать?
Я хочу чтобы прошивка на МК была без бута! Программа так устроена что если при чтении в памяти окажутся 0. То программа просто зависнет.
А программист на что в таком случае? Что же он так устраивает программу, что та не может справиться с известной - а стало быть и отлавливаемой - опасной ситуацией?
Это зависит не от бута. От него смысл избавляться появляется только при разрастании объема программы до неприличных размеров - когда приходится скрести по сусекам и избавляться от не самых нужных частей прошивки.
Чтобы при самом первом запуске программы в памяти не было нулей, достаточно проинициализировать переменные какими либо осмысленными значениями. Т.е. такими, которые в лучшем случае достаточно близки к данным калибровки (ну есть же у вас какая-то минимальная статистика на этот счет!), в худшем - по крайней мере не приводит к зависанию программы (деление на нуль, я полагаю?).
В результате сразу же после после прошивки вы начнете работу с калибровочными данными по умолчанию, а при последующих запусках - с данными, записанными в EEPROM при предыдущем прогоне программы (конечно, если она успела выполнить соответствующие операции). Как проинициализировать EEPROM-переменные? Примерно так же, как и обычные (в RAM). (смотрим шпаргалку по EEPROM)
Да и ещё. Когда я пишу дуткой то сначала очищается весь контроллер а потом записывается прошивка. Возможно ли очищать только флэш память, a eeprom не трогать?
Ну, за это вроде бы не компилятор отвечает, а сборщик (linker) - именно он генерирует HEX-файл, в котором расписано, какие области памяти какими данными заполняются
За это отвечает фьюз-бит EESAVE.
Если отказываться от загрузчика - то да.
За это отвечает фьюз-бит EESAVE.
Спасибо большое!!! Самый адекватный ответ! Всё проверил. Действительно eeprom не стирается. Я очень доволен хоть этим результатом.
Как я понял.
1)Написать вручную и зашить eeprom нельзя.
2)avrdude не может работать eeprom. У меня так и не получилось и в интернете не нашел решение как прочесть и записать в файлик eeprom.
Как я понял.
1)Написать вручную и зашить eeprom нельзя.
Ну почему же нельзя. Делаем вот так:
И наслаждаемся EEPROM-переменной CntrE0, значение в которой остается неизменным при перепрошивке микроконтроллера - изменяется исключительно из скетча.
В то же время EEPROM-переменная CntrE1 будет сбрасываться в 0 (точнее, инициализироваться заданным значением) при каждой перепрошивке.
2)avrdude не может работать eeprom. У меня так и не получилось и в интернете не нашел решение как прочесть и записать в файлик eeprom.