09.03.2013, 12:16
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Вывод данных с АЦП на ЖКИ
Допустим, в обработчике прерывания по завершению АЦП преобразования, я взял данные из регистра 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.
|
|
|
|
09.03.2013, 13:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Frensis777, для поддержки флоат спринтф надо чего то там включить в студии, нагуглишь думаю. Или воспользуйся другими видами приведения к строке.
|
|
|
|
09.03.2013, 13:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
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:
|
|
|
|
|
09.03.2013, 14:43
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Сообщение от whoim
|
Frensis777, для поддержки флоат спринтф надо чего то там включить в студии, нагуглишь думаю. Или воспользуйся другими видами приведения к строке.http://microsin.ru/content/view/1099/44/
|
То, что Вы привели, это относится к компилятору AVR-GCC. Несмотря на некоторые сходства с компилятором CodeVisionAVR, имеются и различия.
Что касается библиотеки, то, например, для того чтобы в компиляторе CodeVisionAVR успешно работать с числами с плавающей точкой float достаточно подключить хидер stdio.h, что я, собственно, и сделал в самом начале, еще до того как обратиться за помощью на этот форум.
Так что вопрос остается актуальным...
|
|
|
|
09.03.2013, 15:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Сообщение от Frensis777
|
Что касается библиотеки, то, например, для того чтобы в компиляторе CodeVisionAVR успешно работать с числами с плавающей точкой float достаточно подключить хидер stdio.h
|
stdio не для работы с числами с плавающей запятой, это библиотека стандартных функций ввода-вывода.
В Вашем же случае надо настроить опции проекта.
|
|
|
|
09.03.2013, 15:41
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Попробуйте так
Цитата:
|
sprintf(buffer,"%.2f",V);
|
Ну, или так
Цитата:
|
sprintf(buffer,"%5.2f",V);
|
А то единичка - слишком мало для ширины
Последний раз редактировалось Yurkin2007; 09.03.2013 в 16:04.
|
|
|
|
09.03.2013, 20:43
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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.
|
|
|
|
09.03.2013, 21:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Сообщение от Frensis777
|
Два вопроса к Вам, тов. Ara41:
1)изменение настроек (s)printf на соответствующий пункт, который Вы упомянули, означает работу компилятора с дробными числами?
2)после изменения настроек опций проекта для работы функции (s)printf с типом float, у меня размер кода по сравнению с первоначальным вариантом возрос на 100%!
|
ну вроде эти настройки и сделаны для (s)printf, чтобы не тащить с собой в бинарник лишний код, который не будет использоваться. У Вас было наоборот. Отсюда и разница в размерах.
|
|
|
|
09.03.2013, 21:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Вывод данных с АЦП на ЖКИ
Есть функция (printf или sprintf). В этой функции анализируется строка формата. И реализуется вывод в соответствии с заданной строкой формата.
Естесственно, что если убрать анализ и вывод дробных чисел, размер функции будет намного меньше. Поэтому при включении поддержки формата дробных чисел у функций printf/sprintf размер прошивки и увеличился.
Делить надо на 1024.
Vin = ADC * Vref / 1024
Таким образом, диапазон измеряемого напряжение будет от 0 до (Vref. - 1 младший разряд).
Эта формула, кстати, приведена в даташите.
|
|
|
|
10.03.2013, 14:10
|
|
Прописка
Регистрация: 15.03.2009
Сообщений: 162
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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, время: 01:56.
|
|