Страница 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
Волосатый
Люди, подскажите плиз
Как в 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 могу вообще нестандартным сделать с целью упрощения. Тогда точность может быть ещё немного меньше.
Скопилируйте кусок кода
и по ассемблерному листингу или по дизасму гляньте размер double и двичное представление того же 12.075.
Или просто на вывод эти же величины, но 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;
Вставил в самое начало.
Что сдесь есть 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;
Вставил в самое начало.
Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?
Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.
Я сейчас сам это прохожу в своем проекте))
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 08, 2011 12:23:39
Сериг
не кто не пробывал работать с adc на mega8535 ?дайте пожалуйста исходничок ато не хочет работать не чего...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 08, 2011 12:42:14
Волосатый
Amstron писал(а):Волосатый писал(а):
Вставил в самое начало.
Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?
Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.
Я сейчас сам это прохожу в своем проекте))
Значит меня не так поняли...
Мне не ужна переменная в eeprom

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

как-то так...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 08, 2011 13:11:30
Coolish
Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в 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 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 писал(а):
Скопилируйте кусок кода
Проверил - размер double=4

. Можно его как-то сделать 8?
А в WinAVR какой размер double?
P.S. Попробовал только что в билдере заменить все double на float
результат не изменился. Значит дело в другом?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 08, 2011 17:04:06
Волосатый
Coolish писал(а):Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eeprom

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

как-то так...
Если переменная не нужна, можно её не использовать в коде программы.
...
К другим способам относится, чтение содержимого 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
результат не изменился. Значит дело в другом?
Варианта два с половиной.
- 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 в котором будут находится можно сказать начальные (строковые, по умолчанию) значения, которые я в программе буду читать и изменять. Такого файла нет
Попробовал. Создаем глобальный массив:
Смотрим
*.eep.
Символы
'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. после этого начинайте отладку.