Как вывести четырехзначное или пятизначное число?
Как вывести число с пласирующей точкой, и тремя знаками после точки?
У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа. А на PC уж double так double, все 64 бита. Соответственно, точность представления разная (тут в соседней теме кто-то меня убеждал, что «уже опровергли», что число 12.075 во float или там double нельзя представить точно), а при рассчётах ошибки накапливаются. Я сам нарывался на такое, что при рассчётах во float-32бит не то, что точность теряется, а вообще в NAN уходит, а в double-64бит всё нормально.Apparatchik писал(а):Есть написаная программа на С и откомпилирована в С++ Builder 2009 (консольная), она выполняет вычисления в основном с double. Почти без доработок (только функция вывода) функции скопированы в CodeVision AVR ошибок нет, но результат очень отличается.
Код: Выделить всё
int i = sizeof(double);
double d = 12.075;Код: Выделить всё
printf("%lu", *(unsigned long*)&d);Вставил в самое начало.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Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.Волосатый писал(а):Вставил в самое начало.Coolish писал(а):Ну либо инициализируешь переменную EEPROM
eeprom unsigned int xxx=36;
и при компиляции это пишется в eep файл по нужному адресу
либо даже можно указать абсолютный адрес переменной внутри eeprom
eeprom unsigned int xxx @ 0x22;
eeprom unsigned int xxx=36;Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?Код: Выделить всё
Error: mega8535.c(77): illegal symbol
Значит меня не так поняли...Amstron писал(а):Я так понимаю создаем переменную ххх с адресом 0х22. Далее в следующей строчки присваиваем переменной значение 36.Волосатый писал(а): Вставил в самое начало.Что сдесь есть 36 а что xxx ? И в каком месте программы надо размещать?Код: Выделить всё
Error: mega8535.c(77): illegal symbol
Я сейчас сам это прохожу в своем проекте))
Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eepromУ меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять
как-то так...
Зачем тогда нужны два одинаковых типа данных только название разное? Или оно где-то настраивается?avreal писал(а):У мелких микроконтроллеров любят делать sizeof(double) == sizeof(float), т.е. оба этих формата используют одинаковое 32-битное представление числа
Может кто знает какой float в CodeVision AVR? Мне вообще double нужен я думал раз такой тип есть, значит он "полноценный".avreal писал(а):Проверьте, какой вообще float в Вашем компиляторе
Этот пункт я непонялavreal писал(а):Иначе — всё только на реальном железе
Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.dm211 писал(а):Как сделать,чтобы работало?
Проверил - размер double=4avreal писал(а): Скопилируйте кусок кодаКод: Выделить всё
int i = sizeof(double); double d = 12.075;
Код: Выделить всё
#define double floatВставил я эти две строчки, файл .ееп так и не появился и использование еепром 0 byteCoolish писал(а):Если переменная не нужна, можно её не использовать в коде программы.Волосатый писал(а):Значит меня не так поняли...
Мне не ужна переменная в eepromУ меня функция из даташита читает и пишет туда. Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (стоковые, по умолчанию) значения, которые я в программе буду чиать и изменять
как-то так...
...
К другим способам относится, чтение содержимого EEPROM контроллера, если в нём уже лежат нужные значения., а также редактирование eep файла непосредственно встроенным шестнадцатеричным редактором. Это всё делается через встроенный Chip Programmer. Обратите внимание на меню: File-Load EEPROM, Edit-EEPROM, File-Save EEPROM.
Более того, если есть нужный BIN-файл (требуемые значения eeprom в сыром виде), этим же способом можно переконвертировать его в Intel HEX (.eep) файл. Содержимое не поменяется, а примет новый формат.
Для выбора одного из способов, уточните, откуда у вас берутся изначальные значения EEPROM (двоичный файл, набор значений по заданным адресам ещё что-то)
Да, оказалось немного не так.Волосатый писал(а):Такого файла нет![]()
Программа после старта читает пару ячеек еепром и присваивает их значения глобальным переменным, с которой и идет работа.
А если там пусто то программа работает неправильно...
Чтобы это сделать, надо доработать сам компилятор (чтобы он генерировал нужный код) плюс библиотеку поддержки написать (необходимые операции выписать, чтобы компилятору было что вызывать).Apparatchik писал(а):Проверил - размер double=4. Можно его как-то сделать 8?
А в WinAVR какой размер double?
Варианта два с половиной.Apparatchik писал(а):P.S. Попробовал только что в билдере заменить все double на floatрезультат не изменился. Значит дело в другом?Код: Выделить всё
#define double float
Попробовал. Создаем глобальный массив:Волосатый писал(а):Мне надо чтобы создался файл eeprom с расшрением .eep в котором будут находится можно сказать начальные (строковые, по умолчанию) значения, которые я в программе буду читать и изменять. Такого файла нет
Код: Выделить всё
eeprom char mass[]="abc";Код: Выделить всё
:0400000061626300D6
:00000001FF
Код: Выделить всё
eeprom char mass[3];
....
mass[0]='a';
mass[1]='b';
mass[2]='c';Так работает, спасибо, теперь будем знать.ValBag писал(а):Объявите массив eeprom глобальным, с необходимым размером, без инициализации. В main присвойте нужные значения элементам. Далее - работайте.dm211 писал(а):Как сделать,чтобы работало?