реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вывод с помощью fprintf в WinAVR, Помогите с форматированным выводом
smk
сообщение Jul 1 2011, 16:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Мне нужно выводить строчку в виде "F = 0.0000 Hz". При этом число дожно иметь три вида в зависимости от значения частоты: 1) 0.0000; 2) 00.000; 3) 000.00 . Как правильно это сделать используя библиотечные функции форматированного вывода? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 1 2011, 19:52
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



В стандартном С это делаетcя так (ширина поля и точность могут задаваться аргументом, тогда в формате * вместо числа):
Код
#include <stdio.h>
void pr(int digits, float value)
{
        printf("%6.*f\n", digits, value);
}

int main()
{
        pr(4, 1.2345f);
        pr(3, 12.345f);
        pr(2, 123.45f);
}
Из-под avr-gcc сейчас некуда залить для на терминлку выдать, но должно работать в максимальном форматтере (а с float всё равно только максимальный и нужен).
Так что можно нагородить что-то в духе
Код
        printf("F = %6.*f Hz\n", value < 10 ? 4 : value < 100 ? 3 : 2, value);


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 3 2011, 12:32
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Не получается. Нужно как-то иначе. Или прийдется писать свою процедуру вывода.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 3 2011, 14:08
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



printf("F = %06f Hz\n", value); Не?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 3 2011, 17:06
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(smk @ Jul 3 2011, 15:32) *
Не получается. Нужно как-то иначе. Или прийдется писать свою процедуру вывода.
Точно, не получается :-(
Таки не всё поддерживает, а жаль.
Ну тогда так
Код
    fprintf_P(fconsole
        , value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n")
        , value);
Так как миленькое работает, просто гробовато выглядит.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 3 2011, 18:37
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А в printf включена поддержка float?
Go to the top of the page
 
+Quote Post
Dnepr33
сообщение Jul 3 2011, 18:46
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-02-11
Из: Днепропетровск
Пользователь №: 62 622



Цитата(smk @ Jul 1 2011, 19:20) *
Мне нужно выводить строчку в виде "F = 0.0000 Hz". При этом число дожно иметь три вида в зависимости от значения частоты: 1) 0.0000; 2) 00.000; 3) 000.00 . Как правильно это сделать используя библиотечные функции форматированного вывода? Спасибо.

не уверен за WinAVR - но по крайней мере в стандарте С можно извернуться так
1. использовать sprintf - пишем в память
2. из памяти выводим любым удобным способом - даже посимвольно, как из массива.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 4 2011, 05:23
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(skripach @ Jul 3 2011, 17:08) *
printf("F = %06f Hz\n", value); Не?
Не.



Цитата(Dnepr33 @ Jul 3 2011, 21:46) *
не уверен за WinAVR - но по крайней мере в стандарте С можно извернуться так
1. использовать sprintf - пишем в память
2. из памяти выводим любым удобным способом - даже посимвольно, как из массива.
Ну где-то так оно и делается. fprintf не догма. можно и другую функцию, лишь бы выводить удобно было.


Цитата(sergeeff @ Jul 3 2011, 21:37) *
А в printf включена поддержка float?
А как узнать? Как я понял там аргумент double.


Цитата(ReAl @ Jul 3 2011, 20:06) *
Точно, не получается :-(
Таки не всё поддерживает, а жаль.
Ну тогда так
Код
    fprintf_P(fconsole
        , value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n")
        , value);
Так как миленькое работает, просто гробовато выглядит.

Значение не отображает. Знак вопроса выводит. Текст выводит правильно.

Вот собственно тестовый код, куда и надо вставить строчку с выводом:
Код
#define F_CPU 8000000UL // 16.0 MHz
#include <util/delay.h>
#include "defines.h"
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include "lcd.h"

volatile unsigned char q;
volatile unsigned int f=0xF;
volatile double frq;
double fp = 1;
FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);

ISR(TIMER0_OVF_vect)
{
++q;
if(q==1)
    {
    PORTA ^= (1<<7);
    q=0;
    }
}

int main(void)
{
DDRA  = 0b10000000;
PORTB = 0b00000000;
DDRB  = 0b10111111;
TCCR0A = 0b10000000;
TCCR0B = 0b00000110;
TIMSK  = 0b00000010;

frq=123;

lcd_init();
stderr = &lcd_str;


fprintf_P(stderr, PSTR("F = %6.4f Hz\n"), frq);

/*value < 10 ? PSTR("F = %6.4f Hz\n") : value < 100 ? PSTR("F = %6.3f Hz\n") : PSTR("F = %6.2f Hz\n")*/

asm("sei");

    while(1)
        {
        
        asm("nop");
        }

return 0;
}


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 4 2011, 06:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(smk @ Jul 4 2011, 08:23) *
Значение не отображает. Знак вопроса выводит. Текст выводит правильно.
не включена поддержка float в fprintf. добавьте следующие параметры компилятору:

-Wl,-u,vfprintf -lprintf_flt -lm




--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 4 2011, 07:34
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(ARV @ Jul 4 2011, 09:20) *
не включена поддержка float в fprintf. добавьте следующие параметры компилятору:

-Wl,-u,vfprintf -lprintf_flt -lm


Добавил, но не уверен что правильно. Можно подробнее? Как проверить получилось или нет? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 4 2011, 08:56
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Запустите примеры, которые вам коллеги советовали и увидите, работает или нет.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 4 2011, 09:00
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(sergeeff @ Jul 4 2011, 11:56) *
Запустите примеры, которые вам коллеги советовали и увидите, работает или нет.

не работает. потому и подумал, что неправильно что-то сделал.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 4 2011, 09:03
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(smk @ Jul 4 2011, 13:00) *
не работает. потому и подумал, что неправильно что-то сделал.


Ну напишите в main для проверки:
Код
   float pi = 3.14f;
   printf("pi = %.02f\n", pi);

Должно печатать:
Код
pi = 3.14

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 4 2011, 09:49
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Jul 3 2011, 21:06) *
Точно, не получается :-(
Таки не всё поддерживает, а жаль.
Тоже давненько наткнулся на отсутствие обработки символа звёздочка в форматере printf'a в gcc.
А топикстартеру рекомендую обратить внимание на функцию
Код
dtostrf(f, WIDTH, PREC, buff)
таким образом можно выиграть по памяти не включая в проект толстую printf с поддержкой float.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 4 2011, 12:01
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(sergeeff @ Jul 4 2011, 12:03) *
Ну напишите в main для проверки:
Код
   float pi = 3.14f;
   printf("pi = %.02f\n", pi);

Должно печатать:
Код
pi = 3.14

Вот такая ошибка:
Код
../exampl.c:44: warning: format '%.02f' expects type 'double', but argument 2 has type 'float'

В моем случае может следует вот так:
Код
  printf(stderr, "pi = %.02f\n", pi);


Цитата(demiurg_spb @ Jul 4 2011, 12:49) *
Тоже давненько наткнулся на отсутствие обработки символа звёздочка в форматере pfintf'a в gcc.
А топикстартеру рекомендую обратить внимание на функцию
Код
dtostrf(f, WIDTH, PREC, buff)
таким образом можно выиграть по памяти не включая в проект толстую printf с поддержкой float.

Обратил. Теперь пытаюсь понять как пользоваться.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 17:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016