Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 09.03.2013, 12:16  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Вывод данных с АЦП на ЖКИ

Допустим, в обработчике прерывания по завершению АЦП преобразования, я взял данные из регистра ADCW и вычислил значение на входе АЦП--- V:
PHP код:
interrupt [ADC_INTvoid adc_isr(void)
{
int adc_data;
float V;
char buffer[];
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
V=(float) adc_data*0.004882812
Понимаю, что вопрос для многих простой, но все же я не пойму, как можно вывести дробную переменную V как строку?
Пробовал вот так:
PHP код:
interrupt [ADC_INTvoid adc_isr(void)
{
...
...
...
sprintf(buffer,"%1.2f",V);/*где выражение "%1.2f" форматирует дробное число f: одна цифра в целочисленном разряде, и две цифры после десятичной точки*/
lcd_puts(buffer);//вывод на дисплей строки
lcd_gotoxy(0,0);

но при симуляции в VMLab'е на дисплее ЖКИ стоит надпись 2f, хотя сам АЦП работает правильно: в окне Peripherals доступно содержание ADCH и ADCL, и входного напряжения на АЦП, и АЦП работает правильно. Проблема только с выводом.
Реклама:

Последний раз редактировалось Frensis777; 09.03.2013 в 12:20.
Frensis777 вне форума  
Непрочитано 09.03.2013, 13:00  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Frensis777, для поддержки флоат спринтф надо чего то там включить в студии, нагуглишь думаю. Или воспользуйся другими видами приведения к строке.
whoim вне форума  
Непрочитано 09.03.2013, 13:03  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

http://microsin.ru/content/view/1099/44/
Цитата:
Это не будет корректно работать, если мы не указали линкеру использовать библиотеки плавающей точки libprintf_flt.a и libm.a. Также необходимо добавить опции линкера -Wl,-u,vfprintf (прим. переводчика - я эти опции и библиотеки не добавлял. Просто указал опцию PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt и добавил её к опциям для передачи линкеру). Это может показаться сложным, но можно процесс автомтизировать, воспользовавшись программой Mfile - генератором шаблона Makefile:
whoim вне форума  
Непрочитано 09.03.2013, 14:43  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от whoim Посмотреть сообщение
Frensis777, для поддержки флоат спринтф надо чего то там включить в студии, нагуглишь думаю. Или воспользуйся другими видами приведения к строке.http://microsin.ru/content/view/1099/44/
То, что Вы привели, это относится к компилятору AVR-GCC. Несмотря на некоторые сходства с компилятором CodeVisionAVR, имеются и различия.

Что касается библиотеки, то, например, для того чтобы в компиляторе CodeVisionAVR успешно работать с числами с плавающей точкой float достаточно подключить хидер stdio.h, что я, собственно, и сделал в самом начале, еще до того как обратиться за помощью на этот форум.

Так что вопрос остается актуальным...
Frensis777 вне форума  
Непрочитано 09.03.2013, 15:12  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Frensis777 Посмотреть сообщение
Что касается библиотеки, то, например, для того чтобы в компиляторе CodeVisionAVR успешно работать с числами с плавающей точкой float достаточно подключить хидер stdio.h
stdio не для работы с числами с плавающей запятой, это библиотека стандартных функций ввода-вывода.
В Вашем же случае надо настроить опции проекта.
Изображения:
 
Ara41 вне форума  
Непрочитано 09.03.2013, 15:41  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Попробуйте так
Цитата:
sprintf(buffer,"%.2f",V);
Ну, или так
Цитата:
sprintf(buffer,"%5.2f",V);
А то единичка - слишком мало для ширины

Последний раз редактировалось Yurkin2007; 09.03.2013 в 16:04.
Yurkin2007 вне форума  
Непрочитано 09.03.2013, 20:43  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Ara41 Посмотреть сообщение
stdio не для работы с числами с плавающей запятой, это библиотека стандартных функций ввода-вывода.
А, да, Вы правы, я спутал.
Сообщение от Ara41 Посмотреть сообщение
В Вашем же случае надо настроить опции проекта.
Я как раз над этим думал.
Да, помогло. Большое спасибо, тов. Ara41!
Сообщение от Yurkin2007 Посмотреть сообщение
Попробуйте так
PHP код:
sprintf(buffer,"%.2f",V); 
Ну, или так
PHP код:
sprintf(buffer,"%5.2f",V); 
А то единичка - слишком мало для ширины
Да нет, спасибо, все и так выводится нормально.
Два вопроса к Вам, тов. Ara41:
1)изменение настроек (s)printf на соответствующий пункт, который Вы упомянули, означает работу компилятора с дробными числами?
2)после изменения настроек опций проекта для работы функции (s)printf с типом float, у меня размер кода по сравнению с первоначальным вариантом возрос на 100%!

И еще один момент. Допустим X-опорное напряжение. И требуется на входе АЦП измерять напряжение в диапазоне от 0 до X В. Допустим, АЦП-10 битный. Это означает 1024 состояния, или, 1023 промежутка между состояниями, иначе называемый шагом АЦП. Правильно ведь? И, чтобы узнать величину шага, я опорное напряжение делю на количество шагов, т.е. на 1023. Затем, чтобы узнать, сколько у меня напряжения измерил АЦП, я должен количество полных шагов умножить на величину шага.

Вопрос: правильно ли я делаю, чтобы измерить величину шага, опорное напряжение делю не на 1024, а на 1023?

Последний раз редактировалось Frensis777; 09.03.2013 в 20:47.
Frensis777 вне форума  
Непрочитано 09.03.2013, 21:01  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Frensis777 Посмотреть сообщение
Два вопроса к Вам, тов. Ara41:
1)изменение настроек (s)printf на соответствующий пункт, который Вы упомянули, означает работу компилятора с дробными числами?
2)после изменения настроек опций проекта для работы функции (s)printf с типом float, у меня размер кода по сравнению с первоначальным вариантом возрос на 100%!
ну вроде эти настройки и сделаны для (s)printf, чтобы не тащить с собой в бинарник лишний код, который не будет использоваться. У Вас было наоборот. Отсюда и разница в размерах.
Ara41 вне форума  
Непрочитано 09.03.2013, 21:25  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Вывод данных с АЦП на ЖКИ

Есть функция (printf или sprintf). В этой функции анализируется строка формата. И реализуется вывод в соответствии с заданной строкой формата.

Естесственно, что если убрать анализ и вывод дробных чисел, размер функции будет намного меньше. Поэтому при включении поддержки формата дробных чисел у функций printf/sprintf размер прошивки и увеличился.

Делить надо на 1024.
Vin = ADC * Vref / 1024

Таким образом, диапазон измеряемого напряжение будет от 0 до (Vref. - 1 младший разряд).

Эта формула, кстати, приведена в даташите.
Godzilla82 вне форума  
Непрочитано 10.03.2013, 14:10  
Frensis777
Прописка
 
Аватар для Frensis777
 
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
Frensis777 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Godzilla82 Посмотреть сообщение
Есть функция (printf или sprintf). В этой функции анализируется строка формата. И реализуется вывод в соответствии с заданной строкой формата. Естесственно, что если убрать анализ и вывод дробных чисел, размер функции будет намного меньше. Поэтому при включении поддержки формата дробных чисел у функций printf/sprintf размер прошивки и увеличился.
Делить надо на 1024.
Vin = ADC * Vref / 1024
Таким образом, диапазон измеряемого напряжение будет от 0 до (Vref. - 1 младший разряд).
Эта формула, кстати, приведена в даташите.
Понятно, ясно.
...Покопавшись немного в премудростях языка С, придумал способ, как выводить дробные числа на дисплей ЖКИ без изменения опций проекта на работу с дробными числами.
Допустим, у нас в результате вычислений получается дробное число V. В процессе вычисления умножаем это число на 10, если хотим иметь точность до одного знака после десятичной точки; на 100, если хотим иметь точность до двух знаков и т.д. Вот код:
PHP код:
// Прерывание по завершению АЦП-преобразования
interrupt [ADC_INTvoid adc_isr(void)
{
int adc_data;
int V;
char buffer[];//строка в виде массива
// Чтение данных из АЦП
adc_data=ADCW;
// Place your code here
V=adc_data*0.004882812*1000;//умножаем на 1000, т.к. хотим иметь точность до 3-х знаков после десятичной точки;
//в полученном числе V все цифры после десятичной точки отбрасываются, т.к. тип переменной V-int, а получаемое выражение в процессе вычисления-//дробное и имеет место автоматическое приведение типов
sprintf(buffer,"%u.%u",V/1000,V%1000); // вместо %u до точки будет вставлен результат v/1000 без дробной части; вместо %u после точки будет вставлен результат дробной части v/1000 
lcd_puts(buffer);//вывод строки
lcd_gotoxy(0,0); 
Используя этот метод вывода дробных чисел и, тем самым не изменяя опции проекта на работу с дробными числами, удается значительно сократить объем полученного в результате компиляции кода, до первоначального значения.
Только есть одно НО: при работе с числами float при выводе ограниченного количества разрядов предусмотрено округление, чего нет в приведенном мною выше методе, где, в результате автоматического приведения типов, дробная часть числа V просто отсекается. Я думаю, что сделать самому округление-возможно для этого случая, просто надо подумать...

Последний раз редактировалось Frensis777; 10.03.2013 в 14:52.
Frensis777 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод на жки результата АЦ преобразования kushman Микроконтроллеры, АЦП, память и т.д 12 01.10.2010 17:57
Последовательный вывод данных Mitrar Микроконтроллеры, АЦП, память и т.д 9 14.05.2010 11:57
вывод двузначных чисел на ЖКИ Hellka Микроконтроллеры, АЦП, память и т.д 1 16.12.2006 05:44
Добавление и вывод данных в EEPROM ( PIC16F84A) alexander70 Микроконтроллеры, АЦП, память и т.д 0 11.10.2006 12:29
Вывод Float на ЖКИ в AVR assembler Tcom Микроконтроллеры, АЦП, память и т.д 18 07.03.2006 20:48


Часовой пояс GMT +4, время: 11:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot