CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Если я правильно понял то в переменной data хранится число, а в переменной size количество символов?
Как вывести четырехзначное или пятизначное число?
Как вывести число с пласирующей точкой, и тремя знаками после точки?
Как вывести четырехзначное или пятизначное число?
Как вывести число с пласирующей точкой, и тремя знаками после точки?
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Вот такой вопрос:
Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
Так вот может есть какие настройки компилятора, может точность повысить или еще что?
P.S. контроллер mega8 пробовал и на v1.25.9 и на v2.05.0 кстати на последней код выходит чуть больше. Результаты смотрю в Proteuse.
Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
Так вот может есть какие настройки компилятора, может точность повысить или еще что?
P.S. контроллер mega8 пробовал и на v1.25.9 и на v2.05.0 кстати на последней код выходит чуть больше. Результаты смотрю в Proteuse.
«И всё-таки она вертится!»
- Волосатый
- Сверлит текстолит когтями
- Сообщения: 1288
- Зарегистрирован: Пн апр 14, 2008 12:54:35
- Откуда: Город ГЕРОЙ Ленинград
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Люди, подскажите плиз
Как в CVAVR создать и наполнить файл eeprom? Писать туда уже научился а чтоб там изначально чтото было недогоняю как
Как в CVAVR создать и наполнить файл eeprom? Писать туда уже научился а чтоб там изначально чтото было недогоняю как
Опыт приходит сразу после того, как он был нужен...
- Coolish
- Опытный кот
- Сообщения: 785
- Зарегистрирован: Сб фев 27, 2010 21:45:37
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну либо инициализируешь переменную EEPROM
eeprom unsigned int xxx=36;
и при компиляции это пишется в eep файл по нужному адресу
либо даже можно указать абсолютный адрес переменной внутри eeprom
eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;
eeprom unsigned int xxx=36;
и при компиляции это пишется в eep файл по нужному адресу
либо даже можно указать абсолютный адрес переменной внутри eeprom
eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;
Сделать хотел грозу, а получил КоЗу
Re: CodeVision AVR в вопросах и ответах
Ну он же пишет-"Писать туда уже научился"
На мой вопрос про еепром так и никто не ответил.
На мой вопрос про еепром так и никто не ответил.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа. А на PC уж double так double, все 64 бита. Соответственно, точность представления разная (тут в соседней теме кто-то меня убеждал, что «уже опровергли», что число 12.075 во float или там double нельзя представить точно), а при рассчётах ошибки накапливаются. Я сам нарывался на такое, что при рассчётах во float-32бит не то, что точность теряется, а вообще в NAN уходит, а в double-64бит всё нормально.Apparatchik писал(а):Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
Проверьте, какой вообще float в Вашем компиляторе.
Более того, для микроконтроллеров float могу вообще нестандартным сделать с целью упрощения. Тогда точность может быть ещё немного меньше.
Скопилируйте кусок кода
Код: Выделить всё
int i = sizeof(double);
double d = 12.075;Или просто на вывод эти же величины, но d тоже выводить как целое для того, чтобы двоичный вид показать.
Код: Выделить всё
printf("%lu", *(unsigned long*)&d);Сравните представление с компьютерным. Если 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 ? И в каком месте программы надо размещать?
Опыт приходит сразу после того, как он был нужен...
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 ? И в каком месте программы надо размещать?
Я так понимаю создаем переменную ххх с адресом 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
Опыт приходит сразу после того, как он был нужен...
- Coolish
- Опытный кот
- Сообщения: 785
- Зарегистрирован: Сб фев 27, 2010 21:45:37
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в 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 (двоичный файл, набор значений по заданным адресам ещё что-то)
Сделать хотел грозу, а получил КоЗу
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
avreal писал(а):У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа
Зачем тогда нужны два одинаковых типа данных только название разное? Или оно где-то настраивается?
avreal писал(а):Проверьте, какой вообще float в Вашем компиляторе
Может кто знает какой float в CodeVision AVR? Мне вообще double нужен я думал раз такой тип есть, значит он "полноценный".
avreal писал(а):Иначе — всё только на реальном железе
Этот пункт я непонял
Последний раз редактировалось Apparatchik Сб янв 08, 2011 16:01:44, всего редактировалось 2 раза.
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.dm211 писал(а):Как сделать,чтобы работало?
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Проверил - размер double=4
А в WinAVR какой размер double?
P.S. Попробовал только что в билдере заменить все double на float
Код: Выделить всё
#define double floatрезультат не изменился. Значит дело в другом?
«И всё-таки она вертится!»
- Волосатый
- Сверлит текстолит когтями
- Сообщения: 1288
- Зарегистрирован: Пн апр 14, 2008 12:54:35
- Откуда: Город ГЕРОЙ Ленинград
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Coolish писал(а):Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eepromУ меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять
как-то так...
Если переменная не нужна, можно её не использовать в коде программы.
...
К другим способам относится, чтение содержимого 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 в вопросах и ответах
Волосатый писал(а):Такого файла нет![]()
Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа.
А если там пусто то программа работает неправильно...
Да, оказалось немного не так.
То, что пишет 0,0% usage EEPROM это наверно глюк CV.
А вот при отсутствии использования этой переменной, действительно оптимизатор её выкидывает
А остаётся поступить немного через одно место.
Сделать отдельный проект, забить эти константы и их адреса (т.е. по две строчки), но при этом в коде хоть раз в этом проекте использовать переменную. Хоть даже xxx=0; (для каждой переменной). Скомпилировать Shift+F9 и взять из папки EXE проекта получившийся файл *.eep.
Проект будет пустым, и шить его в контроллер не нужно. Если конечная цель это eep файл, я думаю, такой вариант будет оптимальным, да и основной проект трогать не надо.
Сделать хотел грозу, а получил КоЗу
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Чтобы это сделать, надо доработать сам компилятор (чтобы он генерировал нужный код) плюс библиотеку поддержки написать (необходимые операции выписать, чтобы компилятору было что вызывать).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) у коде-вижна что-то нестандартно в библиотеке, либо двоичное представление не то, либо в реализации подпрограмм +-*/ что-то наэкономили.
Более того, не могу гарантировать, что avr-gcc (WinAVR) даёт 1:1 двоичное представление float с компиляторами на PC и что рассчёты будт 1:1 совпадать.
Если можете выделить короткий кусок кода, я прогоню на avr-gcc и на плате с RS232 и в терминалке гляну результаты прогона. Заодно время по таймеру засеку, результат в тактах процессора будет
Т.е. дайте функцию, которая получает на входе несколько float-аргументов, возвращает float, внутри пусть страница каких-то вычислений с входными переменными и float-константами. И с десяток наборов входных данных.
Что-то такое, что даёт разницу у билдера и коде-вижна.
"моделировать на реальном железе" — это и имелось ввиду все отладки алгоритма делать прямо в AVR. Но на специальной отладочной программе, которая данные берёт из подготовленных массивов, чтобы ориентироваться, что алгоритм должен насчитать.
«А кому сейчас легко?»™
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: CodeVision AVR в вопросах и ответах
Попробовал. Создаем глобальный массив:Волосатый писал(а):Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (строковые, по умолчанию) значения, которые я в программе буду читать и изменять. Такого файла нет
Код: Выделить всё
eeprom char mass[]="abc";Код: Выделить всё
:0400000061626300D6
:00000001FF
не удается. Члены массива читаются как 0xFF. Но, видимо, это издержки AVR Studio, а может CVAVR. Данные есть в файле *.eep. Но если они не присоединены к cof , то AVR Studio может не знать о них. Надо проверить на железе.
А если сделать так:
Код: Выделить всё
eeprom char mass[3];
......................
mass[0]='a';
mass[1]='b';
mass[2]='c';При использовании первого варианта, как уже подмечали, у вас в eeprom будут нужные значения, и после программирования, переменные можно выкинуть из исходного кода, а затем запрограммировать только flash, не трогая eeprom
Re: CodeVision AVR в вопросах и ответах
Так работает, спасибо, теперь будем знать.ValBag писал(а):Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.dm211 писал(а):Как сделать,чтобы работало?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
чтобы в студии EEPROM содержала осмысленные значения, надо их туда загрузить из файла .eep - меню Debug -- Up/Download memory. после этого начинайте отладку.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!