Заголовок сообщения: 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.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Есть написаная программа на С и откомпилирована в С++ 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 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: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 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: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. после этого начинайте отладку.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения