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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение Garin »

Доброго времени суток!
Помогите правильно сделать функцию деления с остатком в 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 КБ) 472 скачивания
34.jpg
(24.5 КБ) 5286 скачиваний
Последний раз редактировалось Garin Чт июл 19, 2012 17:25:38, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

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

Сообщение Flasher »

остаток равен 25
Дробная часть частного 0, 531...........
Надо определиться что надо и подковать свои знания.
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Numeric=((1200/47)*1000)+(1200%47);
а это еще че такое? оО

Вам нужно выводить именно это число? Почему бы просто его не выводить?
Или вместо 1200 и 47 будут переменные? Предполагаю что под "остатком" вы имели ввиду дробную часть...
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение Garin »

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

Возможно словами мои пояснения не очень, а мой вариант кода вообще ни в красную армию.... :)))
и всё же , на калькуляторе 1200 : 47 это = 25.531.
А в моем коде это 1200 : 47 = 25.025 ????
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

А с чего Вы взяли, что остаток - это и есть дробная часть??? :shock:
Остаток еще и поделить нужно, что бы получить дробную часть.
25/47=0,5319...
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

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" конечно, с отбрасываем остальных знаков, а не с правильным округлением
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Эмс...

Код: Выделить всё

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 аргумента, один из которых длина мне не ведомо... было бы удобнее
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение Garin »

Огромное спасибо, с вашей помощью решено, освежил что дробная что остаток.
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 КБ) 5408 скачиваний
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Я рад конечно что получилось )) На sprintf памяти не хватает?) Получше бы выглядело )
Либо сделайте какой-то свой аналог и вынесите в отдельную функцию в которую будете передавать указатель на строку и ваше число, а потом выводить lcd_puts()
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение Garin »

BCluster для моей задумки этого пока хватает (день умножения и деления, не прошел зря :twisted: )
спасибо :beer:
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Дело хозяйское - но я бы рекомендовал сразу приучаться делать правильно))
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

А если для printf-овской компании мало места, то я бы порекомендовал взять за основу itoa, только заполнял бы буфер заведомо достаточного размера с конца и не ставил бы reverse в конце подпрограммы.
Перед преобразованием заполнить буфер пробелами, функция преобразования остановится, когда будет 0 и начало останется пробелами. Эта функция может возвращать индеск буфера, который она заполнила последним, это будет первый знак числа. Если нужно выводить без фиксированной ширині поля, то начинать с этого индекса.
После чего при выводе целого числа уже всё в порядке, а при выводе числа с фикс. точкой нужно отсчитать от конца буфера заданное число символов (три для данного примера) и в предыдущий символ вставить точку, а все перед ним сдвинуть ближе к началу буфера.
Получится довольно компактно и универсально.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»