Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Атмел коддвизион вывод на жк экран
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Andrew_k5
Не получается вывести переменную с дробной частью. %е не работает.
Xenia
А %f ?
demiurg_spb
Если один знак после запятой, то так:
Код
snprintf(&buff[0], BUFF_SIZE, "%#.1f",  x);
Andrew_k5
Если %f -ничего не выводит, если %#.1f - выводит .1f
demiurg_spb
Вероятно не включена поддержка типа float для printf,sprintf... функций.
Найдите как её включить. Или попробуйте использовать функции ftoa или dtostrf.
Andrew_k5
Спасибо, получилось. Включил в codevision. Также пришлось подключить mаth.h что съело 15 кб кода.
demiurg_spb
Цитата(Andrew_k5 @ Oct 4 2009, 13:58) *
Спасибо, получилось. Включил в codevision. Также пришлось подключить mаth.h что съело 15 кб кода.
Нет, это не mаth.h съело 15 кб кода, т.к. это всего-лишь заголовочный файл.
А съели прилинкованные функции, необходимые для printf("%f",....).
Если хотите уменьшить размер кода, используйте предложенные мной ранее функции (dtostrf или ftoa).
KCA
demiurg_spb
Вы писали:
Если хотите уменьшить размер кода, используйте предложенные мной ранее функции (dtostrf или ftoa).

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

Я в программе вольтметра , для форматирования вывода на LCD использую sprintf , так тоже хотелось бы сократить размер кода.
Пробовал itoa но ничего не вышло.
Спасибо.
-JonnS-
Цитата(KCA @ Dec 12 2009, 15:43) *
А немогли бы обьяснить поподробнее как их использовать?

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

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

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


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

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

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

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

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

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

А что до этого - так или иначе, изучайте хотябы технический английский так я стараюсь.
Но в 53, да и после 22,8 лет в шахте тупееш оч. сильно. Увы! blush.gif
SysRq
Согласно документации cvavr, функция itoa преобразует число в строку, и определена так:
Код
void itoa(int n, char *str)

Показывайте код, посмотрим как вы пытались её использовать. Укажем ошибки, если есть.
KCA
Здравствуйте!

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

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): слишком много аргументов в вызове функции
demiurg_spb
Попробуйте так:
Код
itoa(AdcCode,lcd_buffer);

Вам ведь уже говорили:
Цитата(SysRq @ Dec 13 2009, 21:52) *
Согласно документации cvavr, функция itoa преобразует число в строку, и определена так:
Код
void itoa(int n, char *str)
Имеет смысл смотреть документацию на cvavr. Там и без знания английского можно увидеть что надо...
KCA
Интересно!
Теперь ошибки нет!
Но я ведь читал в других описаниях этой функции, что нужно указывать и систему счисления
в которую преобразовываем???
Наверное это одна из особенностей компилятора КОДЕВИЖН?
И ОГРОМНОЕ СПАСИБО!!!
demiurg_spb
Цитата(KCA @ Dec 14 2009, 12:26) *
Наверное это одна из особенностей компилятора КОДЕВИЖН?
Этот компилятор изобилует разного рода особенностями...
Но, функция itoa не стандартизирована, поэтому её реализация может быть любой или может вообще отсутствовать.
Ругать за это компилятор не стоит.
KCA
Здравствуйте!
Избавился от функции 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 - сотые (после запятой)
SysRq
Цитата(KCA @ Dec 19 2009, 19:12) *
St - целая (до запятой)
Ds - десятые (после запятой)
Ed - сотые (после запятой)
Как вы получаете эти значения?
KCA
Код
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 пока  не останется целой части, считать                                         
//количество проходов.

Вообщето это не я придумал.
Это меня так научили.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.