Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
21.02.2007, 20:31
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Это не решает проблему. Ну и что, могу сделать так чтобы не выводить 17,2 При этом в реале 17, 29999.
Нужно чтобы при делении получалось 17,3. Это хорошо, что получаю 7,29 ошибка на лицо. Я хочу быть твердо уверен, что если показывает что-то индикатор, значит так оно и есть.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 20:35
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от Kukaz
|
А если честно, преобразование ты делаешь через жопу (
Если число 99.99 то сколко будет крутиться твой цикл ?
|
А я не спешу ![Улыбка](images/smilies/icon_smile.gif) Главное работает. А числа 99,99 не должно быть вообще. Только три разряда.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 23:35
|
|
Частый гость
Регистрация: 28.07.2005
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Во дает !
Ты разницу между 7.29 и 17.2 вообще видишь?
И что за датчик тебе точность дает в 0.5% ?
|
|
|
|
21.02.2007, 23:55
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Конечно вижу разницу, не надо думать, что я тупой совсем. Просто как нибудь делать не хочу и не умею. Если человек вводит коефициент 17,3, то его не обрадует если получиться 17,2 ну и пусть, что в реале там не 17,2 а 17,299999. Поэтому повторю задачу:
Нужно вводить коефициенты с плавающей запятой в диапазоне от 0,01 до 100. И чтобы число помещалось в три разряда, т.е не 17,299999, а 17,3 (например)
Сейчас в голову пришла одна идея, попробую, если получиться напишу.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
22.02.2007, 00:54
|
|
Частый гость
Регистрация: 28.07.2005
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Да, тяжелый случай.
Если вводится коэффициент, то зачем преобразовывать его сначало во float, а затем обратно в строку для вывода на дисплей ? Строку ввода, что сразу не вывести. Да и вообще, как можно ввести число, не видя то, что вводишь?
Что-то ты тут паришь всех - сам-то знаешь, что хочешь ?
|
|
|
|
22.02.2007, 01:35
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от Kukaz
|
Да, тяжелый случай.
Если вводится коэффициент, то зачем преобразовывать его сначало во float, а затем обратно в строку для вывода на дисплей ? Строку ввода, что сразу не вывести. Да и вообще, как можно ввести число, не видя то, что вводишь?
Что-то ты тут паришь всех - сам-то знаешь, что хочешь ?
|
Я знаю один форум, не буду называть ега название, где "умников" которые только критикуют, но ничего не советуют, наказывают. Как ты предлагаеш вводить число с плавающей запятой на трехразрядный индикатор? А потом его еще отобразить на нем? В формуле ПИДа используеться float, для вывода параметров на индикатор функция есть. Ввод всех параметров кроме как float сделан на основе изменения самой переменной. С float так делать не получается. Давайте договоримся не строить из себя то чего на самом деле нет. Если ничего толкового посоветовать не можеш, то зачем показывать, что ты тоже "не лыком шит"!!!
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
22.02.2007, 10:25
|
|
Частый гость
Регистрация: 12.12.2005
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Если желаешь на индикатор выдать 17.3 вместо 17.299, то вызывай outfordis(f+0.05).
|
|
|
|
22.02.2007, 11:41
|
|
Прохожий
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от masterpc
|
Сейчас в голову пришла одна идея, попробую, если получиться напишу.
|
Старано, что double не помог... Видать реализован как-то по другому... На всякий случай уточню, я предлагал сменить float SUM; на double SUM; И соответственно в других местах вычислений тоже использовать double.
Есть одно предложение. Я просто с IAR не знаком, есть ли там функция sprintf? Если есть и вас устроит полученный результат в виде строки, то попробуйте сделать следующее (еще это будет зависеть от реализации самой функции sprintf, конечно, т.е. реализована ли там эта возможность):
Код:
|
char buf[5]; /* здесь ввиде строки будет число (3 байта на цифры, 1 на точку и еще один на терминирующий строку ноль в конце строки) */
sprintf(buf, "%.01f", SUM); /* .01 - означает кол-во цифр после точки */ |
|
|
|
|
22.02.2007, 18:16
|
|
Прохожий
Регистрация: 25.08.2005
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
masterpc, читал тут твои посты, и пацталом был ! Как я понял ты собрался сделать из устройства вывода информации (7-сегментный индикатор) устройство ввода? Удачи! А не судьба прилепить к твоему девайсу кнопку (хотябы одну), повесить на прерывание (желательно) и тупо вводить свои коэфиценты. Это совершенно очевидное решение, ведь кнопка - простейшее устройство ввода... Потом все что ввел во внутреннем представлении перегонишь в привычный человеку вид (понимаешь о чем я).
ЗЫ: В Ц есть функции округления как вверх, так и вниз (имею ввиду примерно это: 0.46 округляется до 0.5 или до 0.4). Полистай справочник.
ЗЫЫ: Если ушь не нашел в справочнике... Правила округления надеюсь знаешь? Вот твои 17.29f. Задайся разрядом до которого нужно округлить. В твоем случае это первый в дробной части (т.е. результат должен быть таким: 17.3f).
Алгоритм:
0: float data = xx.yy; // x числа в целой части, у - в дробной
1: int idata = (int) (data*10.0f);
2: float result;
3: if(data*10.0f - (float)idata ›= 0.5f)
4: result = (float)(idata + 1)/10.0f;
5: else
6: result = (float)idata/10.0f;
Алгоритм не оптимизировал для наглядности (и это лишь пример).
Рассмотрим этапы работы на примере:
0: data = 17.29f;
1: idata = 172;
2: resut = хз;
3: if(172.9f-172.0f ›= 0.5f) // 0.9f ›= 0.5f ?
4: result = (float)(172 + 1)/10.0f; // result = 17.3f
Удачи!
|
|
|
|
22.02.2007, 18:38
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от ReiseReise
|
masterpc, читал тут твои посты, и пацталом был ! Как я понял ты собрался сделать из устройства вывода информации (7-сегментный индикатор) устройство ввода? Удачи! А не судьба прилепить к твоему девайсу кнопку (хотябы одну), повесить на прерывание (желательно) и тупо вводить свои коэфиценты. Это совершенно очевидное решение, ведь кнопка - простейшее устройство ввода... Потом все что ввел во внутреннем представлении перегонишь в привычный человеку вид (понимаешь о чем я).
ЗЫ: В Ц есть функции округления как вверх, так и вниз (имею ввиду примерно это: 0.46 округляется до 0.5 или до 0.4). Полистай справочник.
|
Давайте раскажу про девайс: Индикатор - светодиодный, трехразрядный. ЧЕТЫРЕ кнопки ввода!!! (up/duwn, esc, enter). Устройство имеет два независимых канала регулирования. 1-й ПИД - управяляет трехходовым клапаном с помощью ШИМа. 2-й управление реле - термостатирование (не стандартное, ШИМ с периодом 200 секунд). Подключаються два датчика DS1820. Програмно реализовано довольно непростое меню с вводом пароля, сменой датчика, отображением всякой инфы и т.д. Вводятся 14 параметров, три из которых коэффициенты. Все это конечно же пишеться в EEPROM. Индикация динамическая, но особенная: в один момент времени включен не один разряд, а один сегмент одного из разрядов. Все уже готово и работает, остались мелочи всякие и ввод коефициентов.
Спасибо за подсказку на счет округления, попробую, но не гарантирую, что сегодня успею. Как что, сразу напишу
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:12.
|
|