реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Атмел коддвизион вывод на жк экран, Вывод переменных типа floаt
Andrew_k5
сообщение Oct 4 2009, 07:31
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Не получается вывести переменную с дробной частью. %е не работает.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 4 2009, 07:41
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



А %f ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 4 2009, 08:15
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Если один знак после запятой, то так:
Код
snprintf(&buff[0], BUFF_SIZE, "%#.1f",  x);


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Oct 4 2009, 09:02
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Если %f -ничего не выводит, если %#.1f - выводит .1f
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 4 2009, 09:30
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вероятно не включена поддержка типа float для printf,sprintf... функций.
Найдите как её включить. Или попробуйте использовать функции ftoa или dtostrf.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Oct 4 2009, 09:58
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Спасибо, получилось. Включил в codevision. Также пришлось подключить mаth.h что съело 15 кб кода.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 5 2009, 06:55
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Andrew_k5 @ Oct 4 2009, 13:58) *
Спасибо, получилось. Включил в codevision. Также пришлось подключить mаth.h что съело 15 кб кода.
Нет, это не mаth.h съело 15 кб кода, т.к. это всего-лишь заголовочный файл.
А съели прилинкованные функции, необходимые для printf("%f",....).
Если хотите уменьшить размер кода, используйте предложенные мной ранее функции (dtostrf или ftoa).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 12 2009, 13:43
Сообщение #8





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



demiurg_spb
Вы писали:
Если хотите уменьшить размер кода, используйте предложенные мной ранее функции (dtostrf или ftoa).

А немогли бы обьяснить поподробнее как их использовать?

Я в программе вольтметра , для форматирования вывода на LCD использую sprintf , так тоже хотелось бы сократить размер кода.
Пробовал itoa но ничего не вышло.
Спасибо.
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Dec 12 2009, 20:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Цитата(KCA @ Dec 12 2009, 15:43) *
А немогли бы обьяснить поподробнее как их использовать?

Здесь оптимизированая Ftoa, с примерами изпользования.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 12 2009, 20:30
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(KCA @ Dec 12 2009, 16:43) *
А немогли бы обьяснить поподробнее как их использовать?

Цитирую сам себя с небольшими правками:
Вероятно включена поддержка типа float для printf,sprintf... функций.
Найдите как её отключить. Тогда не будет линковаться ничего лишнего.

Я ответил на вопрос?
Если нет, то сформулируйте Ваш вопрос конкретнее (чего хотите, что делали, какие результаты).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 13 2009, 09:22
Сообщение #11





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



-JonnS-
demiurg_spb


Спасибо что не прошли мимо!
Я только только начинаю осваивать программирование микроконтроллеров.
Выбрал Мега 16, КОДЕВИЖН.
Вольтметр я писал не сам, а с помощью Евгения ( http://eugenemcu.ru/ ), да собственно почти весь код
написал он!
Злоупотреблять его терпением нехотелось бы, поэтому обратился сюда.

Для преобразования результата измерения и отображения на индикаторе ( WH1602 (HD44780)) я выбрал функцию sprintf, как наиболее
универсальную и мощную, а так же потому что нашел в инете статью с подробным описанием ее применения (см. вложение).
Вольтметр работает. Размер кода получился 15,5% от памяти программ.
Но! На разных форумах встречаются высказывания отом что размер кода можно существенно сократить если применить itoa,
вот только толкового обьяснения я не смог найти.
Во вложении есть фрагмент статьи по применению sprintf и картинка настроек моего компилятора.
Вот, примерно такое же, обьяснение, вкратце конечно, я и хотел бы увидеть.
Если это не очень сложно, то пожалуйста подскажите как сделать преобразование результата измерения (оно в ADCW) из двоичного в десятичное
с помощью itoa.

И еще. Огромная проблема с английским языком!!! Поэтому пожалуйста не отсылайте на англоязычные публикации.
Начинать изучать язык, для меня уже несколько позновато. sad.gif

Заранее Спасибо.

Сообщение отредактировал KCA - Dec 13 2009, 09:47
Прикрепленные файлы
Прикрепленный файл  ____________.rar ( 40.48 килобайт ) Кол-во скачиваний: 28
 
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 13 2009, 15:06
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Пользуйтесь поиском. И, так или иначе, изучайте хотябы технический английский.
Без этого никак. Факт!
И снова повторюсь, используйте поиск!!! Вот пример


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 13 2009, 16:20
Сообщение #13





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



demiurg_spb

А Вы думаете что я все это не читал!?

Читал, изучал, однако ничего не получалось.
Может в настройках компилятора что то не так?
Я ж не просто так картинку вложил, гляньте в нее, может я там чего то не отметил или наоборот отметил не то что нужно?

А что до этого - так или иначе, изучайте хотябы технический английский так я стараюсь.
Но в 53, да и после 22,8 лет в шахте тупееш оч. сильно. Увы! blush.gif
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 13 2009, 18:52
Сообщение #14


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Согласно документации cvavr, функция itoa преобразует число в строку, и определена так:
Код
void itoa(int n, char *str)

Показывайте код, посмотрим как вы пытались её использовать. Укажем ошибки, если есть.
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 14 2009, 08:48
Сообщение #15





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



Здравствуйте!

Вот кусочек кода (чтобы не загромождать)

CODE
#include <mega16.h>
#include <lcd.h>
#include <stdio.h>
#include <stdlib.h>
.
.
.
unsigned char lcd_buffer[33]; // Буфер LCD-дисплея
unsigned int AdcCode; // Для хранения и обработки результата измерения.

void main(void)
{
.
.
.
while (1)
{
.
.
.
AdcCode=(AdcCode)*(5.0/1024);
AdcCode=(AdcCode>>2); // Убрать два младших разряда из результата.

lcd_clear(); // Очистить экран.
lcd_gotoxy(0,0);
itoa(AdcCode,lcd_buffer,10);
lcd_puts(lcd_buffer);
}
}

Компилятор указывает на ошибку в строке itoa(AdcCode,lcd_buffer,10);
Error: VOLT,1a1.c(80): too many arguments in function call
Ошибка: VOLT, 1a1.c (80): слишком много аргументов в вызове функции

Сообщение отредактировал Omen_13 - Dec 16 2009, 04:02
Причина редактирования: Оформление программы
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 14 2009, 09:07
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Попробуйте так:
Код
itoa(AdcCode,lcd_buffer);

Вам ведь уже говорили:
Цитата(SysRq @ Dec 13 2009, 21:52) *
Согласно документации cvavr, функция itoa преобразует число в строку, и определена так:
Код
void itoa(int n, char *str)
Имеет смысл смотреть документацию на cvavr. Там и без знания английского можно увидеть что надо...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 14 2009, 09:26
Сообщение #17





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



Интересно!
Теперь ошибки нет!
Но я ведь читал в других описаниях этой функции, что нужно указывать и систему счисления
в которую преобразовываем???
Наверное это одна из особенностей компилятора КОДЕВИЖН?
И ОГРОМНОЕ СПАСИБО!!!

Сообщение отредактировал KCA - Dec 14 2009, 09:26
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 15 2009, 21:02
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(KCA @ Dec 14 2009, 12:26) *
Наверное это одна из особенностей компилятора КОДЕВИЖН?
Этот компилятор изобилует разного рода особенностями...
Но, функция itoa не стандартизирована, поэтому её реализация может быть любой или может вообще отсутствовать.
Ругать за это компилятор не стоит.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 19 2009, 16:12
Сообщение #19





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



Здравствуйте!
Избавился от функции sprintf
вот таким вот образом. (оказывается и так можно!)
Размер кода сократился почти в 2 раза!

и itoa непонадобилась!
Код
// Отображаем напряжение на LCD.

                lcd_clear();         // Очистить экран.
                lcd_gotoxy(0,0);
                lcd_putchar('U');
                lcd_putchar('=');
                lcd_putchar(St+0x30);
                lcd_putchar(',');
                lcd_putchar(Ds+0x30);
                lcd_putchar(Ed+0x30);
                lcd_putchar(' ');
                lcd_putchar('v');
                lcd_putchar('o');
                lcd_putchar('l');
                lcd_putchar('t');

St - целая (до запятой)
Ds - десятые (после запятой)
Ed - сотые (после запятой)
Причина редактирования: Оформление кода
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 19 2009, 16:42
Сообщение #20


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(KCA @ Dec 19 2009, 19:12) *
St - целая (до запятой)
Ds - десятые (после запятой)
Ed - сотые (после запятой)
Как вы получаете эти значения?
Go to the top of the page
 
+Quote Post
KCA
сообщение Dec 19 2009, 16:51
Сообщение #21





Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949



Код
AdcCode=100.0*(AdcCode)*(5.0/1024);
              St=0;                 // Сброс разряда сотен перед очередным подсчётом.
              while (AdcCode>100)  { AdcCode=AdcCode-100; St++; } // Вычитать из числа 100 пока, в нём не останется                                               
//сотен и считать количество проходов.
              Ds=0;                 // Сброс разряда десятков перед очередным подсчётом.
              while (AdcCode>10) { AdcCode=AdcCode-10; Ds++;  } // Вычитать из числа 10 пока, в нём не останется                                             
//десятков и считать количество проходов.
              Ed=0;                 // Сброс разряда единиц перед очередным подсчётом.
              while (AdcCode>0) {AdcCode=AdcCode-1; Ed++; }  // Вычитать 1 пока  не останется целой части, считать                                         
//количество проходов.

Вообщето это не я придумал.
Это меня так научили.
Причина редактирования: Оформление кода
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 14:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01548 секунд с 7
ELECTRONIX ©2004-2016