Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Функция printf в cvavr 1.25.8

Непрочитано 22.06.2009, 06:47  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию Функция printf в cvavr 1.25.8

Здравствуйте!
Попытался разобраться с printf() в CodeVision 1.25.8, написал код для отладки
значению a присваиваю a=1.2 и в USART отправляю на терминале выводится a=
Почему не выводит 1.2, помогите
вот код
include ‹mega16.h›
#include ‹stdio.h›
#include ‹delay.h›

float a=1.2;
void main(void)
{

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;


ACSR=0x80;
SFIOR=0x00;

while (1)
{
printf("a=%f",a);
delay_ms(3000);
};
}
Реклама:
Mitrar вне форума  
Непрочитано 22.06.2009, 10:44  
uk8amk
Вид на жительство
 
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
uk8amk на пути к лучшему
По умолчанию

Смотрим раздел Standard C Input/Output Functions встроенного хелпа:
void printf(char flash *fmtstr [ , arg1, arg2, ...])
Далее идет описание параметров:
The format specifier string fmtstr is constant and must be located in FLASH memory.

Вы ему говорите:
"a=%f"
Т.е. даете константу и она нормально выводится.
Затем пытаетесь пропихнуть float a=1.2; и получаете ... впрочем сами знаете что получаете. Обратите внимаение что float a=1.2; - это не строковая константа, а переменная с плавающей точкой, хранящаяся в SRAM.
uk8amk вне форума  
Непрочитано 22.06.2009, 11:26  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

Вот у меня и получается что число с плавающей запятой не могу посмотреть на терминале в CodeVision,
целое число проблем нет.
Mitrar вне форума  
Непрочитано 22.06.2009, 11:50  
uk8amk
Вид на жительство
 
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
uk8amk на пути к лучшему
По умолчанию

Ну в списке стандартных функций я не вижу таких что могли бы преобразовывать float в массив char. Поэтому придется вам ее писать ручками. Тем более что кода там ненамного прибавится.
uk8amk вне форума  
Непрочитано 22.06.2009, 12:07  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

Понятно! А алгоритм перевода числа с плавающей точкой
в char не подскажите?
Mitrar вне форума  
Непрочитано 22.06.2009, 12:14  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

Может я неправильно начал тему, но смысл в том что я присваиваю для примера float a1=3, a2=2, a3;
a3 вычисляю a3=a1/a2;
вывожу в Usart
printf("a3=%f",a3);
А в терминале a3= и все
Mitrar вне форума  
Непрочитано 22.06.2009, 12:28  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,693
Сказал спасибо: 28
Сказали Спасибо 4,526 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию

Без коментариев...

-- Прилагается рисунок: --
Halex07 вне форума  
Непрочитано 22.06.2009, 12:40  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

спасибо попробую
Mitrar вне форума  
Непрочитано 23.06.2009, 09:17  
uk8amk
Вид на жительство
 
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
uk8amk на пути к лучшему
По умолчанию

Сообщение от Mitrar
Понятно! А алгоритм перевода числа с плавающей точкой
в char не подскажите?
В одном из своих проектов я использовал следующий код:

void convert_val(unsigned int num)
{
ones=0;
tens=0;
hundreeds=0;
thousands=0;
while(num›=1000)
{
++thousands;
num-=1000;
}
while(num›=100)
{
++hundreeds;
num-=100;
};
while(num›=10)
{
++tens;
num-=10;
};
ones=num;
}

Разумеется для float его надо немножко доработать(как я думаю вы уже догадались). Потом полученные данные можно выводить хоть через putchar(). И еще одно: данный алгоритм считает только положительные числа. Для чисел меньше нуля надо в циклах делать сложение.[/quote]
uk8amk вне форума  
Непрочитано 23.06.2009, 10:24  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

спасибо за ответ uk8amk, а ларчик просто открывался Halex07 был прав.
Mitrar вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать функцию printf для выовода на второй USART igla_85 Микроконтроллеры, АЦП, память и т.д 1 01.06.2009 02:35
Функция загрузчик (MK ATMEGA644) Gn0me Микроконтроллеры, АЦП, память и т.д 0 27.03.2009 16:59
CVAVR while и таймер kr11507 Микроконтроллеры, АЦП, память и т.д 10 13.12.2008 21:29
GCC AVR не работает printf("Hello word") Kabron Proteus, KiCAD и другие ECAD 8 03.03.2007 14:33
atmega128 -->sg12864; IAR -->printf()??? D1ma Микроконтроллеры, АЦП, память и т.д 2 01.03.2007 21:00


Часовой пояс GMT +4, время: 07:13.


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