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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

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

Сообщение Sounds »

Если я правильно понял то в переменной data хранится число, а в переменной size количество символов?
Как вывести четырехзначное или пятизначное число?
Как вывести число с пласирующей точкой, и тремя знаками после точки?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

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

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

P.S. контроллер mega8 пробовал и на v1.25.9 и на v2.05.0 кстати на последней код выходит чуть больше. Результаты смотрю в Proteuse.
«И всё-таки она вертится!»
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

Люди, подскажите плиз :roll:
Как в CVAVR создать и наполнить файл eeprom? Писать туда уже научился а чтоб там изначально чтото было недогоняю как :(
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
Coolish
Опытный кот
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Coolish »

Ну либо инициализируешь переменную EEPROM


eeprom unsigned int xxx=36;

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

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

eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;
Сделать хотел грозу, а получил КоЗу
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

Ну он же пишет-"Писать туда уже научился"
На мой вопрос про еепром так и никто не ответил.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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. Иначе — всё только на реальном железе.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

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 ? И в каком месте программы надо размещать?
Опыт приходит сразу после того, как он был нужен...
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение 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.

Я сейчас сам это прохожу в своем проекте))
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

не кто не пробывал работать с adc на mega8535 ?дайте пожалуйста исходничок ато не хочет работать не чего...
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

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 в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять :roll: как-то так...
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
Coolish
Опытный кот
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение 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 (двоичный файл, набор значений по заданным адресам ещё что-то)
Сделать хотел грозу, а получил КоЗу
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

avreal писал(а):У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа

Зачем тогда нужны два одинаковых типа данных только название разное? Или оно где-то настраивается?
avreal писал(а):Проверьте, какой вообще float в Вашем компиляторе

Может кто знает какой float в CodeVision AVR? Мне вообще double нужен я думал раз такой тип есть, значит он "полноценный".
avreal писал(а):Иначе — всё только на реальном железе

Этот пункт я непонял :(
Последний раз редактировалось Apparatchik Сб янв 08, 2011 16:01:44, всего редактировалось 2 раза.
«И всё-таки она вертится!»
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

dm211 писал(а):Как сделать,чтобы работало?
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

avreal писал(а):Скопилируйте кусок кода

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

int i = sizeof(double);
double d = 12.075;


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

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

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

#define double float

результат не изменился. Значит дело в другом?
«И всё-таки она вертится!»
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

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

Сообщение Волосатый »

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 :(

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

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

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

Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа.
А если там пусто то программа работает неправильно...
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
Coolish
Опытный кот
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Coolish »

Волосатый писал(а):Такого файла нет :(

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


Да, оказалось немного не так.
То, что пишет 0,0% usage EEPROM это наверно глюк CV.

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

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

Проект будет пустым, и шить его в контроллер не нужно. Если конечная цель это eep файл, я думаю, такой вариант будет оптимальным, да и основной проект трогать не надо.
Сделать хотел грозу, а получил КоЗу
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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. Но на специальной отладочной программе, которая данные берёт из подготовленных массивов, чтобы ориентироваться, что алгоритм должен насчитать.

«А кому сейчас легко?»™
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение 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
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

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

Сообщение dm211 »

ValBag писал(а):
dm211 писал(а):Как сделать,чтобы работало?
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.
Так работает, спасибо, теперь будем знать.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»