Ср мар 15, 2023 20:14:32
Чт мар 16, 2023 00:13:13
А какая разница, сколько их? Изначально буфер на 5 символов надо заполнить пробелами или каким другим пустым кодом, если кодировка не ASCII. Цифры же формируются с конца (обратите внимание на --bufptr у Eddy_Em), и этот цикл заканчивается не по счётчику, а по нулевому остатку от исходного числа. При этом сколько символов сформировалось, столько и ладно. Программа даже не заморачивается подсчётом этих символов!Суть в том, что я не знаю, сколько разрядов у числа изначально. Может быть три, а может пять.
AVR Application Note 204: BCD Arithmetics. Начинается этот аппноут как раз с программы, а точнее с алгоритма Binary 16 to BCD Conversion. А хорошее разъяснение всей этой математики есть в 3-м томе 4-томника "Микроконтроллеры" от Алекса Фрунзе. Не столь популярное, но тоже небесполезное описание всё той же самой математики есть и в жёлтой книжке "Программы для микропроцессоров" Гуртовцева и Гудыменко. И всё это есть в сети.Опишите суть, или ткните, где это максимально понятно расписано.
Чт мар 16, 2023 05:13:55
Чт мар 16, 2023 08:30:23
Чт мар 16, 2023 09:15:32
да, каждый раз нужно сначала делать проверку на возможность вычесть, потом вычитают.СКАЗОЧНИК писал(а):Т.е. каждый раз сравнивают (проверяют), что разность больше чем вычитаемое, тогда продолжают вычитать. Накапливают переменную. и так далее с каждым разрядом?
Чт мар 16, 2023 10:18:01
int16_t data = 9876;
---
while ((data - 1000) > 0) {
data -= 1000;
a++;
}
while ((data - 100) > 0) {
data -= 100;
b++;
}
while ((data - 10) > 0) {
data -= 10;
c++;
}
d = data;
---
результат:
9876
9 8 7 6
a = data / 1000;
b = (data / 100) % 10;
c = (data / 10) % 10;
d = data % 10;
Чт мар 16, 2023 10:44:27
Чт мар 16, 2023 10:56:02
Чт мар 16, 2023 13:34:09
Чт мар 16, 2023 13:57:00
Чт мар 16, 2023 14:43:10
Чт мар 16, 2023 14:52:31
data = 9876;
a = data / 1000;
b = (data / 100) % 10;
c = (data / 10) % 10;
d = data % 10;
Чт мар 16, 2023 14:57:21
Чт мар 16, 2023 15:08:19
uint64_t data = 11126789012;
---
data++;
PORTB = data / 123456789;
Чт мар 16, 2023 15:22:27
Чт мар 16, 2023 15:23:50
Чт мар 16, 2023 21:00:12
Пт мар 17, 2023 19:37:57
Пт мар 17, 2023 20:33:27
Пт мар 17, 2023 23:15:46
Аналогичную задачу я решал (и решил) на 13-й тиньке, но (оффтопик!) на ассемблере, поскольку из прикидок на ардуине мне показалось, что на С, да ещё с логарифмом в плавающей запятой я в мелкую тиньку не уложусь: размер кода для 48-й атмеги даже без плавающей запятой был 1864 байта. На асме, конечно, уложился. Объём прошивки стал 760 байт, быстродействие упёрлось в АЦП, а не в процессор, и возник тот же самый вопрос: куда девать лишние такты и лишние байты (25% памяти)???Управление двумя линейками диодов было сделано из таймерного прерывания, чтение полученных извне данных - там же. Заодно в том же таймерном прерывании еще и АЦП опрашивался и перезапускался. И его данные в массив для усреднения складывались...
Абсолютно справедливая постановка вопроса, ибо никогда не надо забывать про критерий разумной достаточности.Зачем мне тратить свое время в таком случае на придумывание?...