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

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

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

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

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

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


 
Опции темы

Вывод данных с АЦП на ЖКИ

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

Допустим, в обработчике прерывания по завершению АЦП преобразования, я взял данные из регистра ADCW и вычислил значение на входе АЦП--- V:
PHP код:
interrupt [ADC_INT] void 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_INT] void 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.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Frensis777, для поддержки флоат спринтф надо чего то там включить в студии, нагуглишь думаю. Или воспользуйся другими видами приведения к строке.
whoim вне форума  
Непрочитано 09.03.2013, 13:03  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 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.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Frensis777 Посмотреть сообщение
Что касается библиотеки, то, например, для того чтобы в компиляторе CodeVisionAVR успешно работать с числами с плавающей точкой float достаточно подключить хидер stdio.h
stdio не для работы с числами с плавающей запятой, это библиотека стандартных функций ввода-вывода.
В Вашем же случае надо настроить опции проекта.
Изображения:
 
Ara41 вне форума  
Непрочитано 09.03.2013, 15:41  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 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.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вывод данных с АЦП на ЖКИ

Сообщение от Frensis777 Посмотреть сообщение
Два вопроса к Вам, тов. Ara41:
1)изменение настроек (s)printf на соответствующий пункт, который Вы упомянули, означает работу компилятора с дробными числами?
2)после изменения настроек опций проекта для работы функции (s)printf с типом float, у меня размер кода по сравнению с первоначальным вариантом возрос на 100%!
ну вроде эти настройки и сделаны для (s)printf, чтобы не тащить с собой в бинарник лишний код, который не будет использоваться. У Вас было наоборот. Отсюда и разница в размерах.
Ara41 вне форума  
Непрочитано 09.03.2013, 21:25  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
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_INT] void 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, время: 22:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.