|
Атмел коддвизион вывод на жк экран, Вывод переменных типа floаt |
|
|
|
Oct 5 2009, 06:55
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 12 2009, 13:43
|
Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949

|
demiurg_spb Вы писали: Если хотите уменьшить размер кода, используйте предложенные мной ранее функции (dtostrf или ftoa).
А немогли бы обьяснить поподробнее как их использовать?
Я в программе вольтметра , для форматирования вывода на LCD использую sprintf , так тоже хотелось бы сократить размер кода. Пробовал itoa но ничего не вышло. Спасибо.
|
|
|
|
|
Dec 12 2009, 20:25
|
Участник

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

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

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

|
Цитата(KCA @ Dec 12 2009, 16:43)  А немогли бы обьяснить поподробнее как их использовать? Цитирую сам себя с небольшими правками: Вероятно включена поддержка типа float для printf,sprintf... функций. Найдите как её отключить. Тогда не будет линковаться ничего лишнего. Я ответил на вопрос? Если нет, то сформулируйте Ваш вопрос конкретнее (чего хотите, что делали, какие результаты).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 13 2009, 09:22
|
Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949

|
-JonnS- demiurg_spbСпасибо что не прошли мимо! Я только только начинаю осваивать программирование микроконтроллеров. Выбрал Мега 16, КОДЕВИЖН. Вольтметр я писал не сам, а с помощью Евгения ( http://eugenemcu.ru/ ), да собственно почти весь код написал он! Злоупотреблять его терпением нехотелось бы, поэтому обратился сюда. Для преобразования результата измерения и отображения на индикаторе ( WH1602 (HD44780)) я выбрал функцию sprintf, как наиболее универсальную и мощную, а так же потому что нашел в инете статью с подробным описанием ее применения (см. вложение). Вольтметр работает. Размер кода получился 15,5% от памяти программ. Но! На разных форумах встречаются высказывания отом что размер кода можно существенно сократить если применить itoa, вот только толкового обьяснения я не смог найти. Во вложении есть фрагмент статьи по применению sprintf и картинка настроек моего компилятора. Вот, примерно такое же, обьяснение, вкратце конечно, я и хотел бы увидеть. Если это не очень сложно, то пожалуйста подскажите как сделать преобразование результата измерения (оно в ADCW) из двоичного в десятичное с помощью itoa. И еще. Огромная проблема с английским языком!!! Поэтому пожалуйста не отсылайте на англоязычные публикации. Начинать изучать язык, для меня уже несколько позновато. Заранее Спасибо.
Сообщение отредактировал KCA - Dec 13 2009, 09:47
|
|
|
|
|
Dec 13 2009, 16:20
|
Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949

|
demiurg_spbА Вы думаете что я все это не читал!? Читал, изучал, однако ничего не получалось. Может в настройках компилятора что то не так? Я ж не просто так картинку вложил, гляньте в нее, может я там чего то не отметил или наоборот отметил не то что нужно? А что до этого - так или иначе, изучайте хотябы технический английский так я стараюсь. Но в 53, да и после 22,8 лет в шахте тупееш оч. сильно. Увы!
|
|
|
|
|
Dec 13 2009, 18:52
|

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

|
Согласно документации cvavr, функция itoa преобразует число в строку, и определена так: Код void itoa(int n, char *str) Показывайте код, посмотрим как вы пытались её использовать. Укажем ошибки, если есть.
|
|
|
|
|
Dec 14 2009, 08:48
|
Группа: Участник
Сообщений: 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
Причина редактирования: Оформление программы
|
|
|
|
|
Dec 14 2009, 09:07
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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. Там и без знания английского можно увидеть что надо...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 14 2009, 09:26
|
Группа: Участник
Сообщений: 12
Регистрация: 6-07-09
Пользователь №: 50 949

|
Интересно! Теперь ошибки нет! Но я ведь читал в других описаниях этой функции, что нужно указывать и систему счисления в которую преобразовываем??? Наверное это одна из особенностей компилятора КОДЕВИЖН? И ОГРОМНОЕ СПАСИБО!!!
Сообщение отредактировал KCA - Dec 14 2009, 09:26
|
|
|
|
|
Dec 15 2009, 21:02
|

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

|
Цитата(KCA @ Dec 14 2009, 12:26)  Наверное это одна из особенностей компилятора КОДЕВИЖН? Этот компилятор изобилует разного рода особенностями... Но, функция itoa не стандартизирована, поэтому её реализация может быть любой или может вообще отсутствовать. Ругать за это компилятор не стоит.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 19 2009, 16:12
|
Группа: Участник
Сообщений: 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 - сотые (после запятой)
Причина редактирования: Оформление кода
|
|
|
|
|
Dec 19 2009, 16:51
|
Группа: Участник
Сообщений: 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 пока не останется целой части, считать //количество проходов. Вообщето это не я придумал. Это меня так научили.
Причина редактирования: Оформление кода
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|