Eeprom + avrdude

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Здравствуйте! Ох давно я не писал на этом форуме. Но время пришло!!!!

Возникла проблема которую я не могу решить.

Предыстория. Написал я скетч который выполняет определённые действия НО перед стартом (запуском устройства) считываются данные из eeprom памяти.

Тут мне понадобилось записать чисто скетч в контроллер НО без бута!. Выяснил где лежит скомпилированный hex файл. Залил при помощи avrdude. НО необходимо также прописать eeprom.

Вот тут и есть загвоздка.

1)как написать файл для eeprom? (в интернете мало чего вообще есть про eeprom)

2) как залить его в контроллер?

Дело в том что я пробовал прочитать eeprom контроллера при помощи Дутки. Но файл который должен был содержать в себе eeprom память всё время пустой.

Также пробовал писать программу которая заполняет eeprom. Залил hex этой программы (бус бута). Но всё тоже. Файл пуст.

 

Также вопрос. я хочу научиться писать программы для МК на языке С. Подскажите какой компилятор лучше использовать. Также было бы здорово если бы он имел модуль загрузки скетча (как в IDE arduino). 

step962
Offline
Зарегистрирован: 23.05.2011

А вы уже разобрались со следующими вопросами?

- как прочитать данные из EEPROM в RAM

- как записать данные из RAM в EEPROM

- как объявить переменную, размещенную в EEPROM

Если нет - начните с них. Если да, то присвоить начальное значение переменной при ее объявлении является самой что ни на есть тривиальной задачей.

Цитата:
Также вопрос. я хочу научиться писать программы для МК на языке С. Подскажите какой компилятор лучше использовать. Также было бы здорово если бы он имел модуль загрузки скетча (как в IDE arduino).
Ну, вообще-то, GCC наше все. Даже Arduino IDE, по своей сути, всего лишь его обертка.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Как читать и записывать я разобрался. Про переменные я не смотрел. Я просто объявляю переменную. Потом присваиваю значение из ячейки памяти.

Конечно можно и присваивать. Но тогда меняется суть всей задачи.

В процессе выполнения программы в eeprom записываются и изменяются важные переменные. И если пропадает питания а потом снова подаётся то я бы хотел чтобы программа продолжала выполнять свои действия с момента отключения питания.

GCC- в первый раз слышу про это. Как я понял из википедии : это набор компиляторов. Только не очень понятно. Как он будет компилировать код для МК. Нужен плагин?

step962
Offline
Зарегистрирован: 23.05.2011

LEVV2006 пишет:

Как читать и записывать я разобрался. Про переменные я не смотрел. Я просто объявляю переменную. Потом присваиваю значение из ячейки памяти.

Конечно можно и присваивать. Но тогда меняется суть всей задачи.

Так вы "присваиваете" или "не присваиваете"?

И что вы подразумеваете под переменной и под ячейкой памяти? Ведь в общепринятом смысле переменная - это всего лишь юолее удобный (для программиста) способ обращения (чтение/запись) к определенной ячейке памяти. Кроме того, в микроконтроллерах AVR (да и во многих других типах тоже) три типа памяти: память программ (Flash), RAM и EEPROM. В теме, где речь идет о работе как минимум с двумя типами памяти, писать просто "память" - неаккуратненько как-то.

Цитата:

В процессе выполнения программы в eeprom записываются и изменяются важные переменные. И если пропадает питания а потом снова подаётся то я бы хотел чтобы программа продолжала выполнять свои действия с момента отключения питания.

Уточните: программа должна продолжать выполняться именно с того шага, где произошел сбой? Или все же - с самого начала, но с использованием накопленной ранее информации? Это - как ни крути - две большие разницы.

Цитата:

GCC- в первый раз слышу про это. Как я понял из википедии : это набор компиляторов. Только не очень понятно. Как он будет компилировать код для МК. Нужен плагин?

Нужно умение работать с командной строкой (а для этого необходимо изучить хотя бы основы публикуемой в мануалах информации. Например, здесь почитать). Ну или не париться и предоставить это оболочкам типа  Arduino IDE.

Вообще, зачем вам "компилятор Си" конкретно? Чего не хватает из возможностей, доступных через оболочку Arduino IDE? Чего вы надеетесь достигнуть, напрямую работая с компилятором, сборщиком, загрузчиком? 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Мне кажется или кто то хочет просто порассуждать на тему…..

  • с самого начала, но с использованием накопленной ранее информации

именно так.

  • Вообще, зачем вам "компилятор Си" конкретно? Чего не хватает из возможностей, доступных через оболочку Arduino IDE?

Я хочу понимать более конкретно все процессы написания кода.

step962
Offline
Зарегистрирован: 23.05.2011

LEVV2006 пишет:

Мне кажется или кто то хочет просто порассуждать на тему…..

Мне кажется, или кто-то хочет получить четкие инструкции в ответ на весьма расплывчатый вопрос...

Цитата:

  • с самого начала, но с использованием накопленной ранее информации

именно так.

Для этого необходимо уметь

а) записывать данные в EEPROM

б) считывать данные из EEPROM

Как вы упомянули постом ранее, и то и другое вы уже умеете делать. В таком случае непонятно, в чем же состоит ваша проблема.

Цитата:

  • Вообще, зачем вам "компилятор Си" конкретно? Чего не хватает из возможностей, доступных через оболочку Arduino IDE?

Я хочу понимать более конкретно все процессы написания кода.

Имеется в виду "написание кода" на Си? Так практически все возможности чистого компилятора GCC доступны и из оболочки Arduino. А по поводу использования компонент GCC напрямую в нете информации тоже более, чем достаточно.

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Я хочу чтобы прошивка на МК была без бута! Программа так устроена что если при чтении в памяти окажутся 0. То программа просто зависнет. Даже при первом старте в памяти должны быть исходные данные. Будем считать так. В памяти хранятся данные для калибровки датчиков. Чтобы каждый раз их не калибровать в ручную. Я использую eeprom.

Да и ещё. Когда я пишу дуткой то сначала очищается весь контроллер а потом записывается прошивка. Возможно ли очищать только флэш память, a eeprom не трогать?

step962
Offline
Зарегистрирован: 23.05.2011

LEVV2006 пишет:

Я хочу чтобы прошивка на МК была без бута! Программа так устроена что если при чтении в памяти окажутся 0. То программа просто зависнет.

А программист на что в таком случае? Что же он так устраивает программу, что та не может справиться с известной - а стало быть и отлавливаемой - опасной ситуацией?

Цитата:
Даже при первом старте в памяти должны быть исходные данные. Будем считать так. В памяти хранятся данные для калибровки датчиков. Чтобы каждый раз их не калибровать в ручную. Я использую eeprom.

Это зависит не от бута. От него смысл избавляться появляется только при разрастании объема программы до неприличных размеров - когда приходится скрести по сусекам и избавляться от не самых нужных частей прошивки.

Чтобы при самом первом запуске программы в памяти не было нулей, достаточно проинициализировать переменные какими либо осмысленными значениями. Т.е. такими, которые в лучшем случае достаточно близки к данным калибровки (ну есть же у вас какая-то минимальная статистика на этот счет!), в худшем - по крайней мере не приводит к зависанию программы (деление на нуль, я полагаю?).

В результате сразу же после после прошивки вы начнете работу с калибровочными данными по умолчанию, а при последующих запусках - с данными, записанными в EEPROM при предыдущем прогоне программы (конечно, если она успела выполнить соответствующие операции). Как проинициализировать EEPROM-переменные? Примерно так же, как и обычные (в RAM). (смотрим шпаргалку по EEPROM)

Цитата:

Да и ещё. Когда я пишу дуткой то сначала очищается весь контроллер а потом записывается прошивка. Возможно ли очищать только флэш память, a eeprom не трогать?

Ну, за это вроде бы не компилятор отвечает, а сборщик (linker) - именно он генерирует HEX-файл, в котором расписано, какие области памяти какими данными заполняются

maksim
Offline
Зарегистрирован: 12.02.2012

step962 пишет:
LEVV2006 пишет:
Да и ещё. Когда я пишу дуткой то сначала очищается весь контроллер а потом записывается прошивка. Возможно ли очищать только флэш память, a eeprom не трогать?
Ну, за это вроде бы не компилятор отвечает, а сборщик (linker) - именно он генерирует HEX-файл, в котором расписано, какие области памяти какими данными заполняются

За это отвечает фьюз-бит EESAVE

step962
Offline
Зарегистрирован: 23.05.2011

Если отказываться от загрузчика - то да.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

maksim пишет:

За это отвечает фьюз-бит EESAVE

 

Спасибо большое!!! Самый адекватный ответ! Всё проверил. Действительно eeprom не стирается. Я очень доволен хоть этим результатом.

Как я понял.

1)Написать вручную и зашить eeprom нельзя.

2)avrdude не может работать eeprom. У меня так и не получилось и в интернете не нашел решение как прочесть и записать в файлик eeprom.

step962
Offline
Зарегистрирован: 23.05.2011

LEVV2006 пишет:

Как я понял.

1)Написать вручную и зашить eeprom нельзя.

Ну почему же нельзя. Делаем вот так:

#include <avr/eeprom.h>
uint8_t EEMEM CntrE0;
uint8_t EEMEM CntrE1=0;
uint8_t Cntr;

void setup() {
  Serial.begin(9600);
  Cntr = eeprom_read_byte(&CntrE0);
  Serial.print("Cntr 0: ");
  Serial.print(Cntr,DEC);
  Cntr++;
  Serial.print(" - ");
  Serial.println(Cntr,DEC);
  eeprom_write_byte(&CntrE0,Cntr);
  Cntr = eeprom_read_byte(&CntrE1);
  Serial.print("Cntr 1: ");
  Serial.print(Cntr,DEC);
  Cntr++;
  Serial.print(" - ");
  Serial.println(Cntr,DEC);
  eeprom_write_byte(&CntrE1,Cntr);
}

void loop() {
}

И наслаждаемся EEPROM-переменной CntrE0, значение в которой остается неизменным при перепрошивке микроконтроллера - изменяется исключительно из скетча.

В то же время EEPROM-переменная CntrE1 будет сбрасываться в 0 (точнее, инициализироваться заданным значением) при каждой перепрошивке.

Цитата:

2)avrdude не может работать eeprom. У меня так и не получилось и в интернете не нашел решение как прочесть и записать в файлик eeprom.

avrdude "может работать eeprom" - параметр командной строки -U вам в помощь.
 
UPD: c CntrE1 фокус не прошел - значение тоже выдерживает перепрошивку...