обходитесь без floatdanger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
drob = (drob * 1000UL) / 625; // как-то так
обходитесь без floatdanger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
Сам придумал, исходя из того что у меня всего 16 возможных значений, завел масив всех возможных значений. Смешно но экономичноdanger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
Да компилятор жаловалсяМастер Ломастер писал(а):обходитесь без floatdanger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);и в данном случае у вас абсолютно бессмысленное приведение типа.
drob = (drob * 1000UL) / 625; // как-то так
Да читал я егоМастер Ломастер писал(а):компилятор не жаловался, а справедливо вас предупреждал, что вы написали неудобоваримую вещь в выражении. UL - это unsigned long для константы. я ведь рекомендовал вам почитать букварик по Си....
В данном случае нужно решить, что для вас важнее - быстродействие или размер кода для умножения нужно два цикла такта и 3кб памяти тк используется тип Флоат.А для деления примерно 300 циклов такта и совсем немного памяти ведь Флоат можно не включать в код.danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
Вот как раз без флоат обходится:)Мастер Ломастер писал(а): обходитесь без floatи в данном случае у вас абсолютно бессмысленное приведение типа.
drob = (drob * 1000UL) / 625; // как-то так
ну я немного погорячился тутBerZerK-ku писал(а):Какой то сумбур в голове, после прочтения вашего поста. Я вас правильно понял: умножение на переменную типа float жрет 3кБ памяти, но осуществляется всего за 2 такта, а использование целочисленных умножения с последующим делением, получается выигрыш по памяти, но зато деление осуществляется за 300 тактов?
сдвиг в право содержимого регистра это деление его значения на два, а в лево - это его умножение на дваFreshMan писал(а):скажите пожалуйста, сдвиг в право содержимого регистра это уменьшение его значения, а в лево - это увеличение ?
можно ещеМастер Ломастер писал(а):обходитесь без floatdanger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);и в данном случае у вас абсолютно бессмысленное приведение типа.
drob = (drob * 1000UL) / 625; // как-то так
Код: Выделить всё
drob>>=3;
drob*=5;Код: Выделить всё
while (1)
{
if (PIND.0==1) // Проверка состояния переключателя
{
rab = 0b10000000; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт с инверсией
rab = rab >> 1; // Сдвиг разрядов
delay_ms (200); // Задержка на 200 мсек
}
}
else
{
rab = 0b00000001; // Сдвиг влево
while (rab!=0)
{
PORTB=rab^0xFF; // Запись в порт с инверсией
rab = rab << 1; // Сдвиг разрядов
delay_ms (200); // Задержка на 200 мсек
}
}
};
}Код: Выделить всё
rab = 0b01111111; // Сдвиг вправо
while (rab!=0)
{
PORTB=rab
rab = rab >> 1; // Сдвиг разрядов
delay_ms (200); // Задержка на 200 мсек
} Код: Выделить всё
while (rab!=0)
{
PORTB=rab
rab = rab >> 1; // Сдвиг разрядов
delay_ms (200); // Задержка на 200 мсек
}