vitalik_1984 писал(а): В вашем Мк нет двух свободных байт для хранения переменой int? В случае со знаковой переменной ваши 9999 легко помещаются в +-32 767.
Есть, только операции умножения слишком прожорливы и по времени и по памяти.
Он имел в виду реализацию умножения контроллер потянет с превеликим натягом... если хватит памяти вообще.
А в чем проблема с ассемблером? вставляй отдельным инклудом, PUSH/POP используемые регистры в подпрограмме и делов-то. Даже глаза мозолить не будет.
А вообще, для PIC-ов я гдето видел математически выведенные алгоритмы BCD-BIN и BIN-BCD преобразования для различных разрядностей, потреблением памяти и времени выполнения. С виду тарабарщина после обфускатора, а работу выполняет верно и быстро...
А вообще в таких алгоритмах можно обойтись без умножения - умножение на 10 заменяется суммой числа умноженного на 2 и на 8. в первом случае это всего лишь сдвиг на один бит, а во втором - на 3 бита.
В твоем примере - берется переменная результата X, и выполняется ряд операций:
X = D
X = X * 10 + C
X = X * 10 + B
X = X * 10 + A
4 присваивания, 3 умножения на 10(сдвиг числа на 1 бит и на 3) и 3 операции сложения. Никакого тяжеляка.
FreshMan писал(а):ааааааааааа......, тогда выходит надо не только запрещать прерывание по переполнению но и поднимать планку до FF
я правильно уразумел ?
Да, правильно. Только запись в OCR FF - это удаление гланд через Ж... Лучше перевести таймер в обычный режим счёта.
Этот пост оказался полезен? Не поленись, нажми слева!
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Извините. Так и я умею. В тексте было сказано про четыре сдвига. Здесь же присутствует еще и операция сложения.
Я недопонял, думал автор умеет чистыми сдвигами на 10 умножать. Вот и мне захотелось. Комбинациями сдвигов со сложением пользовался давно, начиная с ассемблера i8080.
unsigned char A,B,C,D;
unsigned int X;
X = D;
X = (X<<1UL);
X = (X<<3UL);
X = X + C;
X = (X<<1UL);
X = (X<<3UL);
X = X + B;
X = (X<<1UL);
X = (X<<3UL);
X = X + A;
PS: Ну почему у людей такое недоверие к компиляторам ? Неужели кто-то считает, что они глупее нас ?
unsigned char A,B,C,D;
unsigned int X, Y, Z;
X = D;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + C;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + B;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + A;
133 байт ROM, 10 байт RAM, 121 cycles
Реапьно используется сдвиг, а не умножение, как во всех примерах приведённых Alex...
"Я не даю готовых решений, я заставляю думать!"(С)
Всем привет. Столкнулся с такой проблемой: atmega8 сразу после прошивки работает по программе нормально, но стоит отключить и включить питание, и работать он отказывается. Программатор BM9010.
Объясню почему я так опасаюсь сложных операций. Когда то в этой теме даже писал.
Делал обратное преобразование BIN2BCD через деление. Для этого пришлось подключить math библиотеку. В результате это преобразование отожрало у МК больше половины памяти и работало очень долго. Тогда решил, что проще выполнить циклические вычитания.
Вот потому и заинтересовался преобразованием BCD2BIN, а вдруг тут какие неожиданные решения есть.