roboforum.ru

Технический форум по робототехнике.

Работа с sprintf

Работа с sprintf

EasyTech » 04 фев 2012, 19:24

Добрый день мои друзья.
Столкнулся с такой проблемой: я собираю умный блок питания, получаю силу тока и напряжение и вывожу на LCD. Я считываю информацию по АЦП и перевожу их в вольты отлично, только есть проблема при выводе числа double на LCD. Использую библиотеку stdio.h функцию sprintf();
Для получения напряжения использую внутренний источник питания на 2.56В и умножаю значение АЦП на константу 1.15 (я её сам расчитал для своего резистового делителя), делаю все с учебника.
Я считываю данные отлично, но вывожу какую то чушь на LCD! Мне кажется я не правильно использую данную библиотеку. Библиотека LCD работает исправно!
Вот посмотрите как я использую функцию sprintf();
P.S. Пишу вне компилятора, т.к. программу писал на ноуте, а сейчас я сижу перед домашним ПК, поэтому я убрал ненужные мелочи.
Код: Выделить всёРазвернуть
#include <avr/interrupt.h>
#include <avr/stdio.h>
#include "lcdlib.h"
volatile double adcbuf, uin;
ISR(ADC_vect) { adcbuf = ADCW; uin = adcbuf * 1.15;} // в прерывании высчитали напряжения на акб
void adc_init (void) {/*Иницализация АЦП*/} // проинициализировали АЦП
int main void{
adc_init();
lcd_init();
sei();
char buffer[20]; //буфер для хранения значения напряжения
while(1) {
sprintf(buffer, "%.2f", uin) // переводим double -> char
lcdsym(buffer); // выводим.
         }
}

И выводит какую то чушь. Если в данном примере ошибок нет, то я перепроверю у себя АЦП конфигу и библиотеку LCD

Re: Работа с sprintf

Romikgy » 04 фев 2012, 23:54

у авр я бы вообще посоветовал не использовать числа с плавающей точкой ... уж больно они тяжелые для этого проца

Re: Работа с sprintf

HarryStar » 05 фев 2012, 10:49

В CVAVR например в настройках компиляции указывается, поддерживает ли sprintf числа с плавающей точкой. Без нужной галки выводится фигня.

Для локализации проблемы упростите прогу.
uin = 1.2345678;
sprintf(buffer, "%.2f", uin)
вот до такого.
и если все нормально, наращивайте постепенно.

Romikgy писал(а):у авр я бы вообще посоветовал не использовать числа с плавающей точкой ... уж больно они тяжелые для этого проца

Если проц почти ничего не делает, какой смысл не использовать простое решение?

Re: Работа с sprintf

Romikgy » 05 фев 2012, 14:16

ИМХО такие решения , будут проблемными в дальнейшем ....

Re: Работа с sprintf

boez » 06 фев 2012, 01:28

В прерывании про плавающую точку забыть сразу. Учись программировать правильно. Просто сохрани в переменную целое число - и переключи на следующий канал, если их несколько.

Ну а дальше, можно и с плавающей точкой считать, если правда процу делать нечего. Найди, где в настройках среды или компилятора включить плавающую точку в printf. Потому что она 100% по умолчанию выключена, ее использование молча добавляет 2-3 килобайта в размер проги, естественно это мало кому нужно.


cron
Rambler\'s Top100 Mail.ru counter