Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Деление с остатком. CodeVision AVR с выводом на ЖКИ дробного

Чт июл 19, 2012 14:10:19

Доброго времени суток!
Помогите правильно сделать функцию деления с остатком в CodeVision AVR, и чтобы результат вывести на ЖКИ функцией lcd_putchar
Моя задача, числа 1200 : 47 = 25.531 , с целым числом проблем нет , а вот остаток никак "не соответствует" математике.
Проект с протеусом приложил в архиве...
Вот моя попытка сделать вычисление таким способом
Код:
                       Numeric=((1200/47)*1000)+(1200%47);    //    1200 / 47 должно= 25.531 
                       
                          NumericA=1200/47;      //Получение целого
                          NumericB=1200%47;  // остаток   


Изображение

остаток определяю неправильно, прошу подсказать, как это нужно сделать....//radiokot
Вложения
numeric.rar
Архив
(40.96 KiB) Скачиваний: 426
34.jpg
(24.5 KiB) Скачиваний: 5009
Последний раз редактировалось Garin Чт июл 19, 2012 17:25:38, всего редактировалось 1 раз.

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 14:19:54

остаток равен 25
Дробная часть частного 0, 531...........
Надо определиться что надо и подковать свои знания.

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 14:51:44

Numeric=((1200/47)*1000)+(1200%47);

а это еще че такое? оО

Вам нужно выводить именно это число? Почему бы просто его не выводить?
Или вместо 1200 и 47 будут переменные? Предполагаю что под "остатком" вы имели ввиду дробную часть...

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 14:58:34

BCluster писал(а):Вам нужно выводить именно это число? Почему бы просто его не выводить?
Или вместо 1200 и 47 будут переменные? Предполагаю что под "остатком" вы имели ввиду дробную часть...

Это я для простоты обьяснения. Да вместо 1200 и 47 будут переменные.

Возможно словами мои пояснения не очень, а мой вариант кода вообще ни в красную армию.... :)))
и всё же , на калькуляторе 1200 : 47 это = 25.531.
А в моем коде это 1200 : 47 = 25.025 ????

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 15:31:42

А с чего Вы взяли, что остаток - это и есть дробная часть??? :shock:
Остаток еще и поделить нужно, что бы получить дробную часть.
25/47=0,5319...

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 15:43:46

1200 / 47 = 25.5319

long a = 1200 / 47; // целая часть = 25
long b = 1200 % 47; // остаток = 25
long c = b*1000 / 47; // дробная часть*1000 = 531

prinf("1200/47 = %d.%d", a, c); // "1200/47 = 25.531" конечно, с отбрасываем остальных знаков, а не с правильным округлением

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 16:04:24

Эмс...
Код:
char string[20];
float a = 1200;
float b = 47;
float c = a / b;
sprintf( string, "a/b=%.3f", c );
lcd_puts ( string );


-- подправил в связи с реалиями кодвижна

оффтоп: почему в lcd_puts не сделали 2 аргумента, один из которых длина мне не ведомо... было бы удобнее

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 16:12:58

Огромное спасибо, с вашей помощью решено, освежил что дробная что остаток.
a_skr ваш конкретный пример , это то что я и спрашивал, спасибо.
Теперь мой код в любом виде отображает то что мне и требуется.
Код:
#include <mega8.h>
 #asm
   .equ __lcd_port=0x12 ;PORTD
 #endasm
 #include <lcd.h>
 unsigned long int  Numeric, NumericA, NumericB, a=1200, b=47;
 void main(void)
{
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
while (1)
      {       
                         Numeric=((a/b)*1000)+(((a%b)*1000)/b);    //    1200 / 47 = 25.531 

                          NumericA=a/b;                    //целая часть
                          NumericB=((a%b)*1000)/b;  // дробная часть

                               lcd_gotoxy(0,0); 
                                      lcd_putchar((Numeric/10000000)%10+0x30);     
                                      lcd_putchar((Numeric/1000000)%10+0x30);     
                                      lcd_putchar((Numeric/100000)%10+0x30);
                                      lcd_putchar((Numeric/10000)%10+0x30); 
                                      lcd_putchar((Numeric/1000)%10+0x30); 
                                       lcd_putsf(".");   
                                      lcd_putchar((Numeric/100)%10+0x30);
                                      lcd_putchar((Numeric/10)%10+0x30); 
                                      lcd_putchar(Numeric%10+0x30);   
                             lcd_gotoxy(0,1); 
                                            lcd_putsf(" celoe=");   
                                      lcd_putchar((NumericA/10000)%10+0x30); 
                                      lcd_putchar((NumericA/1000)%10+0x30); 
                                      lcd_putchar((NumericA/100)%10+0x30);
                                      lcd_putchar((NumericA/10)%10+0x30); 
                                      lcd_putchar(NumericA%10+0x30);
                               lcd_gotoxy(0,2);
                                      lcd_putsf("drobnaja =");   
                                      lcd_putchar((NumericB/10000)%10+0x30); 
                                      lcd_putchar((NumericB/1000)%10+0x30); 
                                      lcd_putchar((NumericB/100)%10+0x30);
                                      lcd_putchar((NumericB/10)%10+0x30); 
                                      lcd_putchar(NumericB%10+0x30);
                               lcd_gotoxy(0,3);
                                      lcd_putsf("1200/47=25.531");     
   

      };
}


Изображение
Вложения
34.jpg
(24.06 KiB) Скачиваний: 5108

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 16:18:33

Я рад конечно что получилось )) На sprintf памяти не хватает?) Получше бы выглядело )
Либо сделайте какой-то свой аналог и вынесите в отдельную функцию в которую будете передавать указатель на строку и ваше число, а потом выводить lcd_puts()

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.

Чт июл 19, 2012 17:23:54

BCluster для моей задумки этого пока хватает (день умножения и деления, не прошел зря :twisted: )
спасибо :beer:

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ дроб

Пт июл 20, 2012 07:51:56

Дело хозяйское - но я бы рекомендовал сразу приучаться делать правильно))

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ дроб

Пт июл 20, 2012 09:47:11

А если для printf-овской компании мало места, то я бы порекомендовал взять за основу itoa, только заполнял бы буфер заведомо достаточного размера с конца и не ставил бы reverse в конце подпрограммы.
Перед преобразованием заполнить буфер пробелами, функция преобразования остановится, когда будет 0 и начало останется пробелами. Эта функция может возвращать индеск буфера, который она заполнила последним, это будет первый знак числа. Если нужно выводить без фиксированной ширині поля, то начинать с этого индекса.
После чего при выводе целого числа уже всё в порядке, а при выводе числа с фикс. точкой нужно отсчитать от конца буфера заданное число символов (три для данного примера) и в предыдущий символ вставить точку, а все перед ним сдвинуть ближе к началу буфера.
Получится довольно компактно и универсально.
Тема закрыта