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
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

Re: Работа с sprintf

Сообщение Romikgy » 04 фев 2012, 23:54

у авр я бы вообще посоветовал не использовать числа с плавающей точкой ... уж больно они тяжелые для этого проца
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Работа с sprintf

Сообщение HarryStar » 05 фев 2012, 10:49

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

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

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

Если проц почти ничего не делает, какой смысл не использовать простое решение?
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Работа с sprintf

Сообщение Romikgy » 05 фев 2012, 14:16

ИМХО такие решения , будут проблемными в дальнейшем ....
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Работа с sprintf

Сообщение boez » 06 фев 2012, 01:28

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

Ну а дальше, можно и с плавающей точкой считать, если правда процу делать нечего. Найди, где в настройках среды или компилятора включить плавающую точку в printf. Потому что она 100% по умолчанию выключена, ее использование молча добавляет 2-3 килобайта в размер проги, естественно это мало кому нужно.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22