Свежие обсуждения
Микроконтроллеры

Сил уже больше нет - ПРЕРЫВАНИЯ и АТМЕГА8

1 3 4

Еще +1 на знак числа, тогда уж. Он тоже в длину входит.

 

Спасибо за совет, но у меня пока только положительные числа

 

Lerik: если знать его глюки, то может и ничего?

Да можно, можно

Lerik: А второй делал, только блин видимо в Протеусе это тоже не работает

Второй - это какой?
float f = (float)((unsigned int)(F_data * 100))/100;

или
sprintf..?

Тут протеус никак не может влиять, это уже дело исключительно компилятора. Если не работает в протеусе - значит компилятор не понял.

Lerik: АНТОХА, а почему пиктура 7.1 ? Если число будет не больше 9,9 можно ведь 3.1 ?

Да просто так, чтоб влезло Можно и 3.1. Только под завершающий 0 не забудь место в буфере.

 

AHTOXA: или
sprintf..?

sprintf - имеется ввиду на индикаторе пишет что попало и в самой строковой переменной , если в протеусе посмотреть тоже

AHTOXA: Можно и 3.1. Только под завершающий 0 не забудь место в буфере.
не ну ты что это я помню

Вот посмотри что получается....

 

Lerik: Вот посмотри что получается....

Похоже printf не знает float. Такое бывает, для экономии места Можно поковыряться в ключах компилятора..

 

а где именно? ковырять?

 

Lerik: а где именно? ковырять?

А какой компилятор-то?

У avr-gcc это ключ линкера -lprintf_flt

У IAR это в xcl-файле, что-то вроде
-e_small_write=_formatted_write
-e_small_write_P=_formatted_write_P
(не помню точно)

В принципе, если ftoa работает, то без лучше с ним, printf очень большой.

 

Компилятор у меня CodeVisionAVR, а вот где про ключи почитать не знаю.
ftoa - не подходит, во первых он округляет по правилам математики, а мне надо вообще не учитывать отбрасываемый разряд, и второе в конце концов мне надо получить текстовую строку (сборку) из нескольких переменных, так как это делает sprintf , но пока безрезультатны мои попытки

 

Ну придётся немного потрудиться

Типа такого:


char lcd_buf[16];
char tmp[7];
unsigned int u;
char pos;;
char * ch;

// рисуем текст:
lcd_buf[0] = 'U';
lcd_buf[1] = '=';

// готовим целое число, в 100 раз больше нужного
u = (F_data * 100);

// получаем часть числа до запятой
itoa(u/100, tmp, 10);

// выводим...
ch = tmp;
pos = 2;

while (*ch)
lcd_buf[pos++] = *ch++;

// рисуем точку.
lcd_buf[pos++] = '.';

// теперь то, что после запятой...
u%= 100;

if (u < 10)
lcd_buf[pos++] = '0';

itoa(u, tmp, 10);

ch = tmp;

while (*ch)
lcd_buf[pos++] = *ch++;

// добиваем пробелами сколько надо (если там ещё параметр)
while (pos < 8)
lcd_buf[pos++] = ' ';

Где-то так

 

Спасибо, огромное АНТОХА !!!

Но ведь существует же sprintf как раз для этого случая и я просто уверен, что оно работает , на выходных не было времени, сегодня попробую прошить код в железо и посмотрю работает ли оно ?