Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 06, 2011 22:05:40
Прорезались зубы
Зарегистрирован: Вт май 27, 2008 23:23:24 Сообщений: 238
Рейтинг сообщения:0
Если я правильно понял то в переменной data хранится число, а в переменной size количество символов? Как вывести четырехзначное или пятизначное число? Как вывести число с пласирующей точкой, и тремя знаками после точки?
Вот такой вопрос: Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
Так вот может есть какие настройки компилятора, может точность повысить или еще что?
P.S. контроллер mega8 пробовал и на v1.25.9 и на v2.05.0 кстати на последней код выходит чуть больше. Результаты смотрю в Proteuse.
Есть написаная программа на С и откомпилирована в С++ 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 12:42:14
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1288 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
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.
Я сейчас сам это прохожу в своем проекте))
Значит меня не так поняли... Мне не ужна переменная в eeprom У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять как-то так...
_________________ Опыт приходит сразу после того, как он был нужен...
Значит меня не так поняли... Мне не ужна переменная в eeprom У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять как-то так...
Ну, по порядку. Если переменная не нужна, можно её не использовать в коде программы. Просто начальная инициализация как раз и забъёт в сгенерированный при компиляции 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 17:04:06
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1288 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
Coolish писал(а):
Волосатый писал(а):
Значит меня не так поняли... Мне не ужна переменная в eeprom У меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять как-то так...
Если переменная не нужна, можно её не использовать в коде программы.
... К другим способам относится, чтение содержимого EEPROM контроллера, если в нём уже лежат нужные значения., а также редактирование eep файла непосредственно встроенным шестнадцатеричным редактором. Это всё делается через встроенный Chip Programmer. Обратите внимание на меню: File-Load EEPROM, Edit-EEPROM, File-Save EEPROM.
Более того, если есть нужный BIN-файл (требуемые значения eeprom в сыром виде), этим же способом можно переконвертировать его в Intel HEX (.eep) файл. Содержимое не поменяется, а примет новый формат.
Для выбора одного из способов, уточните, откуда у вас берутся изначальные значения EEPROM (двоичный файл, набор значений по заданным адресам ещё что-то)
Вставил я эти две строчки, файл .ееп так и не появился и использование еепром 0 byte
Переменная не только не нужна, выделять под нее драгоценную память программ... ну хм... должны же быть другие пути ...
Это я вкурсе что можно так сделать, но мне надо для симулятора ееп сгенерить, вот поэтому я и спрашиваю
Такого файла нет
Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа. А если там пусто то программа работает неправильно...
_________________ Опыт приходит сразу после того, как он был нужен...
Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа. А если там пусто то программа работает неправильно...
Да, оказалось немного не так. То, что пишет 0,0% usage EEPROM это наверно глюк CV.
А вот при отсутствии использования этой переменной, действительно оптимизатор её выкидывает
А остаётся поступить немного через одно место. Сделать отдельный проект, забить эти константы и их адреса (т.е. по две строчки), но при этом в коде хоть раз в этом проекте использовать переменную. Хоть даже xxx=0; (для каждой переменной). Скомпилировать Shift+F9 и взять из папки EXE проекта получившийся файл *.eep.
Проект будет пустым, и шить его в контроллер не нужно. Если конечная цель это eep файл, я думаю, такой вариант будет оптимальным, да и основной проект трогать не надо.
_________________ Сделать хотел грозу, а получил КоЗу
Проверил - размер 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
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
Волосатый писал(а):
Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (строковые, по умолчанию) значения, которые я в программе буду читать и изменять. Такого файла нет
Попробовал. Создаем глобальный массив:
Код:
eeprom char mass[]="abc";
Смотрим *.eep.
Код:
:0400000061626300D6 :00000001FF
Символы 'a', 'b', 'c' - 61, 62, 63 присутствуют. Другое дело, что попытка использования их далее в программе не удается. Члены массива читаются как 0xFF. Но, видимо, это издержки AVR Studio, а может CVAVR. Данные есть в файле *.eep. Но если они не присоединены к cof , то AVR Studio может не знать о них. Надо проверить на железе. А если сделать так:
, то в AVR Studio все далее работает, но в *.eep нули (т. к. объявляем массив без инициализации), которые (может быть?) заменятся реальными значениями после программирования железа. А вообще - не уверен - навряд-ли. При использовании первого варианта, как уже подмечали, у вас в eeprom будут нужные значения, и после программирования, переменные можно выкинуть из исходного кода, а затем запрограммировать только flash, не трогая eeprom
чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения