Страница 105 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт янв 06, 2011 22:05:40
Sounds
Если я правильно понял то в переменной data хранится число, а в переменной size количество символов?
Как вывести четырехзначное или пятизначное число?
Как вывести число с пласирующей точкой, и тремя знаками после точки?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 07, 2011 14:50:05
Apparatchik
Вот такой вопрос:
Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.

Так вот может есть какие настройки компилятора, может точность повысить или еще что?

P.S. контроллер mega8 пробовал и на v1.25.9 и на v2.05.0 кстати на последней код выходит чуть больше. Результаты смотрю в Proteuse.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 07, 2011 20:04:26
Волосатый
Люди, подскажите плиз :roll:
Как в CVAVR создать и наполнить файл eeprom? Писать туда уже научился а чтоб там изначально чтото было недогоняю как :(

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт янв 07, 2011 22:04:27
Coolish
Ну либо инициализируешь переменную EEPROM


eeprom unsigned int xxx=36;

и при компиляции это пишется в eep файл по нужному адресу

либо даже можно указать абсолютный адрес переменной внутри eeprom

eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 07:49:28
dm211
Ну он же пишет-"Писать туда уже научился"
На мой вопрос про еепром так и никто не ответил.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 10:10:23
avreal
Apparatchik писал(а):Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа. А на PC уж double так double, все 64 бита. Соответственно, точность представления разная (тут в соседней теме кто-то меня убеждал, что «уже опровергли», что число 12.075 во float или там double нельзя представить точно), а при рассчётах ошибки накапливаются. Я сам нарывался на такое, что при рассчётах во float-32бит не то, что точность теряется, а вообще в NAN уходит, а в double-64бит всё нормально.
Проверьте, какой вообще float в Вашем компиляторе.
Более того, для микроконтроллеров float могу вообще нестандартным сделать с целью упрощения. Тогда точность может быть ещё немного меньше.
Скопилируйте кусок кода

Код: Выделить всё

int i = sizeof(double);
double d = 12.075;
и по ассемблерному листингу или по дизасму гляньте размер double и двичное представление того же 12.075.
Или просто на вывод эти же величины, но d тоже выводить как целое для того, чтобы двоичный вид показать.

Код: Выделить всё

printf("%lu", *(unsigned long*)&d);
или что-то в таком духе, в зависимости от размера double.
Сравните представление с компьютерным. Если sizeof(double) == 4 и двоичное представление совпадает с тем, что в билдере для float — моделируйте на компьютере во float. Иначе — всё только на реальном железе.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 11:13:04
Волосатый
Coolish писал(а):Ну либо инициализируешь переменную EEPROM


eeprom unsigned int xxx=36;

и при компиляции это пишется в eep файл по нужному адресу

либо даже можно указать абсолютный адрес переменной внутри eeprom

eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;
Вставил в самое начало.

Код: Выделить всё

Error: mega8535.c(77): illegal symbol
Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 11:23:57
Amstron
Волосатый писал(а):
Coolish писал(а):Ну либо инициализируешь переменную EEPROM


eeprom unsigned int xxx=36;

и при компиляции это пишется в eep файл по нужному адресу

либо даже можно указать абсолютный адрес переменной внутри eeprom

eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;
Вставил в самое начало.

Код: Выделить всё

Error: mega8535.c(77): illegal symbol
Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?
Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.

Я сейчас сам это прохожу в своем проекте))

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 12:23:39
Сериг
не кто не пробывал работать с adc на mega8535 ?дайте пожалуйста исходничок ато не хочет работать не чего...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 12:42:14
Волосатый
Amstron писал(а):
Волосатый писал(а): Вставил в самое начало.

Код: Выделить всё

Error: mega8535.c(77): illegal symbol
Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?
Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.

Я сейчас сам это прохожу в своем проекте))
Значит меня не так поняли...
Мне не ужна переменная в eeprom :) У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять :roll: как-то так...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 13:11:30
Coolish
Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eeprom :) У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять :roll: как-то так...

Ну, по порядку.
Если переменная не нужна, можно её не использовать в коде программы. Просто начальная инициализация как раз и забъёт в сгенерированный при компиляции eep файл нужные значения по нужным адресам.

то есть, если нужно чтоб в eep файле по адресу 0x22 было двухбайтное значение (unsigned int) 36, то и надо написать в глобальных переменных ("до всего"):

eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;

где xxx- неиспользуемый в дальнейшем идентификатор переменной.

Можно пойти дальше, если этот eep файл нужно сгенерировать один раз, то сделать пустой проект, в котором лишь будут эти инициализированные переменные - заглушки, однажды его скомпилировать, и сохранить полученный eep файл для дальнейшего использования.

К другим способам относится, чтение содержимого EEPROM контроллера, если в нём уже лежат нужные значения., а также редактирование eep файла непосредственно встроенным шестнадцатеричным редактором. Это всё делается через встроенный Chip Programmer. Обратите внимание на меню: File-Load EEPROM, Edit-EEPROM, File-Save EEPROM.

Более того, если есть нужный BIN-файл (требуемые значения eeprom в сыром виде), этим же способом можно переконвертировать его в Intel HEX (.eep) файл. Содержимое не поменяется, а примет новый формат.

Для выбора одного из способов, уточните, откуда у вас берутся изначальные значения EEPROM (двоичный файл, набор значений по заданным адресам ещё что-то)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 15:31:29
Apparatchik
avreal писал(а):У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа
Зачем тогда нужны два одинаковых типа данных только название разное? Или оно где-то настраивается?
avreal писал(а):Проверьте, какой вообще float в Вашем компиляторе
Может кто знает какой float в CodeVision AVR? Мне вообще double нужен я думал раз такой тип есть, значит он "полноценный".
avreal писал(а):Иначе — всё только на реальном железе
Этот пункт я непонял :(

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 15:45:33
ValBag
dm211 писал(а):Как сделать,чтобы работало?
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 15:54:31
Apparatchik
avreal писал(а): Скопилируйте кусок кода

Код: Выделить всё

int i = sizeof(double);
double d = 12.075;
Проверил - размер double=4 :( . Можно его как-то сделать 8?
А в WinAVR какой размер double?

P.S. Попробовал только что в билдере заменить все double на float

Код: Выделить всё

#define double float
результат не изменился. Значит дело в другом?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 17:04:06
Волосатый
Coolish писал(а):
Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eeprom :) У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять :roll: как-то так...
Если переменная не нужна, можно её не использовать в коде программы.

...
К другим способам относится, чтение содержимого EEPROM контроллера, если в нём уже лежат нужные значения., а также редактирование eep файла непосредственно встроенным шестнадцатеричным редактором. Это всё делается через встроенный Chip Programmer. Обратите внимание на меню: File-Load EEPROM, Edit-EEPROM, File-Save EEPROM.

Более того, если есть нужный BIN-файл (требуемые значения eeprom в сыром виде), этим же способом можно переконвертировать его в Intel HEX (.eep) файл. Содержимое не поменяется, а примет новый формат.

Для выбора одного из способов, уточните, откуда у вас берутся изначальные значения EEPROM (двоичный файл, набор значений по заданным адресам ещё что-то)
Вставил я эти две строчки, файл .ееп так и не появился и использование еепром 0 byte :(

Переменная не только не нужна, выделять под нее драгоценную память программ... ну хм... должны же быть другие пути :)
...

Это я вкурсе что можно так сделать, но мне надо для симулятора ееп сгенерить, вот поэтому я и спрашиваю :))

Такого файла нет :(

Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа.
А если там пусто то программа работает неправильно...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 17:57:13
Coolish
Волосатый писал(а):Такого файла нет :(

Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа.
А если там пусто то программа работает неправильно...
Да, оказалось немного не так.
То, что пишет 0,0% usage EEPROM это наверно глюк CV.

А вот при отсутствии использования этой переменной, действительно оптимизатор её выкидывает :-(

А остаётся поступить немного через одно место.
Сделать отдельный проект, забить эти константы и их адреса (т.е. по две строчки), но при этом в коде хоть раз в этом проекте использовать переменную. Хоть даже xxx=0; (для каждой переменной). Скомпилировать Shift+F9 и взять из папки EXE проекта получившийся файл *.eep.

Проект будет пустым, и шить его в контроллер не нужно. Если конечная цель это eep файл, я думаю, такой вариант будет оптимальным, да и основной проект трогать не надо.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 18:18:41
avreal
Apparatchik писал(а):Проверил - размер double=4 :( . Можно его как-то сделать 8?
А в WinAVR какой размер double?
Чтобы это сделать, надо доработать сам компилятор (чтобы он генерировал нужный код) плюс библиотеку поддержки написать (необходимые операции выписать, чтобы компилятору было что вызывать).
У WinAVR double тоже 32-битный.
64 бита double натужно для мелкого мелкоконтроллера, мало кому нужно, вот не очень и стремяться реализовать.
Apparatchik писал(а):P.S. Попробовал только что в билдере заменить все double на float

Код: Выделить всё

#define double float
результат не изменился. Значит дело в другом?
Варианта два с половиной.
  • 1) у билдера float 8-байтовый :-)
  • 1.5) билдер хранит-то всё во float, но промежуточные вычисления (в пределах одного С-шного выражения) делаются на 80-битных регистрах математического сопроцессора с повышенной точностью и только перед записью в переменную округляютя до float, на этом может набежать разница.
  • 2) у коде-вижна что-то нестандартно в библиотеке, либо двоичное представление не то, либо в реализации подпрограмм +-*/ что-то наэкономили.
Вариант 1 маловероятен, а вот 1.5 и 2 достаточно вероятны.

Более того, не могу гарантировать, что avr-gcc (WinAVR) даёт 1:1 двоичное представление float с компиляторами на PC и что рассчёты будт 1:1 совпадать.

Если можете выделить короткий кусок кода, я прогоню на avr-gcc и на плате с RS232 и в терминалке гляну результаты прогона. Заодно время по таймеру засеку, результат в тактах процессора будет :-)
Т.е. дайте функцию, которая получает на входе несколько float-аргументов, возвращает float, внутри пусть страница каких-то вычислений с входными переменными и float-константами. И с десяток наборов входных данных.
Что-то такое, что даёт разницу у билдера и коде-вижна.

"моделировать на реальном железе" — это и имелось ввиду все отладки алгоритма делать прямо в AVR. Но на специальной отладочной программе, которая данные берёт из подготовленных массивов, чтобы ориентироваться, что алгоритм должен насчитать.

«А кому сейчас легко?»™

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 18:45:14
ValBag
Волосатый писал(а):Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (строковые, по умолчанию) значения, которые я в программе буду читать и изменять. Такого файла нет
Попробовал. Создаем глобальный массив:

Код: Выделить всё

eeprom char mass[]="abc";
Смотрим *.eep.

Код: Выделить всё

:0400000061626300D6
:00000001FF
Символы 'a', 'b', 'c' - 61, 62, 63 присутствуют. Другое дело, что попытка использования их далее в программе
не удается. Члены массива читаются как 0xFF. Но, видимо, это издержки AVR Studio, а может CVAVR. Данные есть в файле *.eep. Но если они не присоединены к cof , то AVR Studio может не знать о них. Надо проверить на железе.
А если сделать так:

Код: Выделить всё

eeprom char mass[3];
....
mass[0]='a';
mass[1]='b';
mass[2]='c';
, то в AVR Studio все далее работает, но в *.eep нули (т. к. объявляем массив без инициализации), которые (может быть?) заменятся реальными значениями после программирования железа. А вообще - не уверен - навряд-ли.
При использовании первого варианта, как уже подмечали, у вас в eeprom будут нужные значения, и после программирования, переменные можно выкинуть из исходного кода, а затем запрограммировать только flash, не трогая eeprom

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб янв 08, 2011 20:17:42
dm211
ValBag писал(а):
dm211 писал(а):Как сделать,чтобы работало?
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.
Так работает, спасибо, теперь будем знать.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс янв 09, 2011 14:33:45
ARV
чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.