что то не понятный ваш конвертер. и где метка bBCDx_2, на которую посылает brne?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
xkp писал(а):Берем наше число Х и делим его на 10000, результат в IND4. Остаток от Х теперь делим на 1000 - результат в IND3, остаток делим на 100 - IND2, остаток делим на 10 - IND1, и оставшийся остаток это IND0.
Не кажется ли Вам, что слишком много делений (в том числе, возможно, и для нахождения остатка)?
AVR и так не имеет аппаратного деления, а тут ещё и двухбайтовые величины. Может быть очень медленно. Не зря ведь тут народ обсуждает разные хитрости.
А как иначе разложить число на разряды? Деление тут сказано образно, для смысла. А если подробнее то из Х вычитаем 10000 и если флаг переноса сброшен то IND4+1, если флаг переноса установлен то Х+10000. Далее Х-1000 .... процедура такая же для 1000,100,10
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Без делений никак. Аппаратного нет, само собой, но простой алгоритм (рабочий) я уже дал. Что рабочий не сомневайтесь, вон, передо мной стоит, циферки кажет на 14ти семисегментниках
Что значит никак? Большинство извстных мне алгоритмов основаны на вычитаниях... где же там деление?
Вот как-то так (выдрано и адаптировано с какой-то большой библиотеки функций)
так ваше циклическое вычитание одного и того же числа это и есть деление...
Алгоритм деление 2-хбайтного числа на однобайтное
Спойлер;============
;= Деление R25,R24 на R20 =
;= R25,R24 - результат, R21 - остаток =
;= используются TMP, R20, R21, R24, R25 =
;============
div_2_1:
ldi tmp,$10
clr r21
div_2_10:
lsl r24
rol r25
rol r21
brcs div_2_11
cp r21,r20
brlo div_2_12
div_2_11:
sub r21,r20
inc r24
div_2_12:
dec tmp
brne div_2_10
ret
если кому надо есть и другие заготовки делений и умножений, начиная от 2 на 1, заканчивая 4 на 3, цифры подразумевают количество байт.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Здравствуйте!
Помогите разобраться с таким вопросом: нигде толком ничего не написано про массивы на простых примерах.
Например на тех же самых светодиодах. Допустим программа на Си выглядела бы как:
Т.е. мы просто по очереди мигаем 4-мя светодиодами. А как это написать с использованием массива не пойму.
И далее на усложнение - подключить кнопку и при нажатии делать step-- с того места, на котором нажали кнопку.
С объявлением массивов-то вроде понятно
.db 1,2,3,4,5
А вот как происходит обращение к конкретному элементу - неясно
Для этого есть команды LPM и SPM работают они с индексным регистром, в него надо загрузить адрес... и обязательно учесть тот факт что метка адресует память СЛОВАМИ, а доступ к памяти через LPM - байтами, т.е. адрес метки надо умножать на два и получится номер байта с которого начинается массив, а дальше прибавляешь необходимое смещение и вперед.
Muzykant писал(а):Вы вроде и нового ничего не сказали, но теперь я, кажется, начал понимать..
Массивы (до 256 элементов) удобно располагать в памяти программ начиная с нулевого младшего адресного байта, например, $F00 или $1300.
Тогда старший адресный байт можно не трогать
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ldi ZH,High(MyArray*2) ;загрузка адреса 0-го элемента в рег. пару Z
clr ZL ; младший адресный байт нулевой,
; равнозначно ldi ZH,High(MyArray*2)
ldi Temp1,0
add ZL,Temp ;прибавление внутр. адреса
; ZH уже трогать не надо, он у всех элементов массива одинаковый
...
.CSEG
.ORG $F00 ; явно указываем где разместить массив
MyArray:
.DB $01, $03, ... ; массив до 256 байт
Мелочь, а приятно. Позволяет сократить код и ускорить быстродействие.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Спасибо за эту информацию, попробую сегодня обязательно. Меня как раз интересовало, зачем использовать 2 байта, если в массиве всего несколько элементов.