Технический форум по робототехнике.
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);
}
blindman » 24 июн 2012, 18:08
1. Смешал в кучу десятичные и 16-ричные
2. Вот здесь переполнение: procent*0x3ff
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 то все считается и не переполняется.
blindman » 24 июн 2012, 18:45
0x50 * 0x3FF = 0x13FB0; 0x13FB0 & 0xFFFF = 0x3FB0; 0x3FB0 / 0x99 = 0x6A
Если шлешь десятичное число, то и не делай из 50 80
CALLIKA » 24 июн 2012, 18:55
blindman писал(а):0x13FB0 & 0xFFFF = 0x3FB0;
получается если я возьму pwm как long int то все должно проходить, а оно не проходит
Если шлешь десятичное число, то и не делай из 50 80
а я и не делаю...
blindman » 24 июн 2012, 19:04
Отправляешь 50 десятичное?
В чем смысл вот этого ? procent = (p_text1 << 4)|(0b00001111 & p_text2);
CALLIKA » 24 июн 2012, 19:40
blindman писал(а):Отправляешь 50 десятичное?
В чем смысл вот этого ? procent = (p_text1 << 4)|(0b00001111 & p_text2);
преобразует принятые из УАРТ два ASCII кода (0х35 и 0х30) в один HEX процетов (0х50).
blindman » 24 июн 2012, 19:43
Еще раз. 50 отправляешь - десятичное ? Зачем его преобразуешь в 50 16-ричное (оно же 80 десятичное) ?
CALLIKA » 24 июн 2012, 19:55
blindman писал(а):Еще раз. 50 отправляешь - десятичное ? Зачем его преобразуешь в 50 16-ричное (оно же 80 десятичное) ?
посылаю 50 десятичное, т.к. человеку удобнее ориентироваться в диапазоне десятичных...на МК оно в любом случае приходит как два шестнадцатеричных - мне показалось так будет удобнее, работать с одним HEX числом.
blindman » 24 июн 2012, 20:03
Оно "приходит" на МК не как десятичное, и не как 16-ричное. Ты путаешь число и форму его записи. Пятьдесят в 10-чной записи выглядит как 50, в 16-ричной - как 32. Но это то же самое число. А вот 50 в 10-чной записи и 50 в 16-ричной - это разные числа.
Добавлено спустя 46 секунд:
И не надо цитировать предыдущее сообщение.
CALLIKA » 24 июн 2012, 20:15
Ну в любом случае мне нужно получить значение от пользователя и как то его пропорционально приравнять к ряду 0-1023 , а в каких формах записи я буду это делать не сильно важно...
В вашей формуле видно что ошибка не в форме записи
0x50 * 0x3FF = 0x13FB0; 0x13FB0 & 0xFFFF = 0x3FB0; 0x3FB0 / 0x99 = 0x6A
а в том что выделено жирным?
blindman » 24 июн 2012, 20:20
Да ни в каких формах ты это не делаешь. Число - оно и есть число! Ошибка в том, что ты декодируешь запись числа как будто она 16-ричная, в то время как она 10-чная
CALLIKA » 25 июн 2012, 14:54
Ну хорошо, допустим я небуду преобразовывать, и допустим я захочу послать число не 50 а 99 тогда формула будет такой:
0x63 * 0x3FF = 0x18B9D; 0x18B9D & 0xFFFF = 0x8B9D; 0x8B9D / 0x63 = 0x169 - что не есть правильно !
я правильно понимаю что 0x18B9D & 0xFFFF вот это зависит от того какого типа переменная ? int - 0xffff, long int - 0xffffffff ?
elmot » 25 июн 2012, 14:57
Почти правильно.
unsigned int - 0xffff
unsigned long - 0xffffffff ?
blindman » 25 июн 2012, 16:58
CALLIKA писал(а):что не есть правильно
Конечно. Из-за переполнения при вычислениях