roboforum.ru

Технический форум по робототехнике.


Непонятки с арифметикой

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 16:48

Есть код - берет 2 цифры из УАРТА (вывожу проценты 00-99) потом преобразую их для ряда ШИМа.
Подаю в УАРТ цифру 50, а результат pwm = 0x006A, хотя меняю переменную procent на число 0x50 и выводит pwm = 0х216 т.е. правильно !
Проверил зажигая на мониторе символы.
Код: Выделить всёРазвернуть
     
     unsigned char p_text1,p_text2;
     unsigned int pwm,procent;

Код: Выделить всёРазвернуть
       p_text1 = getchar();
       p_text2 = getchar();
       lcd_gotoxy(6,1);
       lcd_putchar(p_text1);
       lcd_gotoxy(7,1);
       lcd_putchar(p_text2);
       lcd_gotoxy(8,1);
       lcd_putchar(0x25);
       procent = (p_text1 << 4)|(0b00001111 & p_text2); //50
       procent = (unsigned char) (procent & 0x0ff);

       
       pwm = (procent*0x3ff)/0x099; //преобразую   
       
       if (pwm == 0x6a) { //зажигается
        lcd_gotoxy(3,1);
        lcd_putchar(0xff);       
       }   
       if (procent == 0x50) {//зажигается
        lcd_gotoxy(2,1);
        lcd_putchar(0xff);       
       }
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 18:08

1. Смешал в кучу десятичные и 16-ричные
2. Вот здесь переполнение: procent*0x3ff
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 18:36

blindman писал(а):1. Смешал в кучу десятичные и 16-ричные
2. Вот здесь переполнение: procent*0x3ff

но я проверяю значение procent оно равно 0х50
Код: Выделить всёРазвернуть
if (procent == 0x50) {
        lcd_gotoxy(2,1);
        lcd_putchar(0xff); //символ высвечивается а значит условие истина     
       }

и если подставить вместо procent число 0x50 то все считается и не переполняется.
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 18:45

0x50 * 0x3FF = 0x13FB0; 0x13FB0 & 0xFFFF = 0x3FB0; 0x3FB0 / 0x99 = 0x6A

Если шлешь десятичное число, то и не делай из 50 80
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 18:55

blindman писал(а):0x13FB0 & 0xFFFF = 0x3FB0;

получается если я возьму pwm как long int то все должно проходить, а оно не проходит :(
Если шлешь десятичное число, то и не делай из 50 80

а я и не делаю...
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 19:04

Отправляешь 50 десятичное?
В чем смысл вот этого ? procent = (p_text1 << 4)|(0b00001111 & p_text2);
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 19:40

blindman писал(а):Отправляешь 50 десятичное?
В чем смысл вот этого ? procent = (p_text1 << 4)|(0b00001111 & p_text2);

преобразует принятые из УАРТ два ASCII кода (0х35 и 0х30) в один HEX процетов (0х50).
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 19:43

Еще раз. 50 отправляешь - десятичное ? Зачем его преобразуешь в 50 16-ричное (оно же 80 десятичное) ?
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 19:55

blindman писал(а):Еще раз. 50 отправляешь - десятичное ? Зачем его преобразуешь в 50 16-ричное (оно же 80 десятичное) ?

посылаю 50 десятичное, т.к. человеку удобнее ориентироваться в диапазоне десятичных...на МК оно в любом случае приходит как два шестнадцатеричных - мне показалось так будет удобнее, работать с одним HEX числом.
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 20:03

Оно "приходит" на МК не как десятичное, и не как 16-ричное. Ты путаешь число и форму его записи. Пятьдесят в 10-чной записи выглядит как 50, в 16-ричной - как 32. Но это то же самое число. А вот 50 в 10-чной записи и 50 в 16-ричной - это разные числа.

Добавлено спустя 46 секунд:
И не надо цитировать предыдущее сообщение.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 24 июн 2012, 20:15

Ну в любом случае мне нужно получить значение от пользователя и как то его пропорционально приравнять к ряду 0-1023 , а в каких формах записи я буду это делать не сильно важно...
В вашей формуле видно что ошибка не в форме записи
0x50 * 0x3FF = 0x13FB0; 0x13FB0 & 0xFFFF = 0x3FB0; 0x3FB0 / 0x99 = 0x6A
а в том что выделено жирным?
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение blindman » 24 июн 2012, 20:20

Да ни в каких формах ты это не делаешь. Число - оно и есть число! Ошибка в том, что ты декодируешь запись числа как будто она 16-ричная, в то время как она 10-чная
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Непонятки с арифметикой

Сообщение CALLIKA » 25 июн 2012, 14:54

Ну хорошо, допустим я небуду преобразовывать, и допустим я захочу послать число не 50 а 99 тогда формула будет такой:
0x63 * 0x3FF = 0x18B9D; 0x18B9D & 0xFFFF = 0x8B9D; 0x8B9D / 0x63 = 0x169 - что не есть правильно !

я правильно понимаю что 0x18B9D & 0xFFFF вот это зависит от того какого типа переменная ? int - 0xffff, long int - 0xffffffff ?
CALLIKA
 
Сообщения: 41
Зарегистрирован: 25 янв 2009, 00:08
Откуда: Великий Новгород
прог. языки: PHP

Re: Непонятки с арифметикой

Сообщение elmot » 25 июн 2012, 14:57

Почти правильно.
unsigned int - 0xffff
unsigned long - 0xffffffff ?
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Непонятки с арифметикой

Сообщение blindman » 25 июн 2012, 16:58

CALLIKA писал(а):что не есть правильно

Конечно. Из-за переполнения при вычислениях
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6