Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Чт фев 15, 2018 12:17:04
А простите за дурацкий вопрос. А как на ассемблере устроить десятичный счет последовательно от 0000 до 9999. Чего совсем нет никаких хороших идей
Пробовал последовательно инкрементировать 4 ячейки памяти (каждую через 9 циклов) с CJNE через 9, но например, при переходе от 0019 к 0020 сначала образуется 0009, и только в следующем цикле образуется 0020
Пробовал 16-битное сложение с DA A, но это работает ужасно, пропускает числа.
Пробовал 16-битное сложение с переводом результата в BCD, проверкой в десятичных числах, но результат громоздкий и тормозной.
Наверняка есть есть какой-то математический метод, но с двоичной арифметикой я как бы не очень.
Посоветуйте чего нибудь.
Чт фев 15, 2018 12:39:02
Инкремент и сложение по реакции флагов могуть отличаться (на память - шклерозь) а посему
DA A неверно сработает. Нужно использовать простое сложение с единицей.
Или алгоритм математики аналогично DA A и соответственно реакции флагов результата.
16-разрядное не применимо - обрабатываем два байта - один с единицами и десятками, другой с сотнями и тысячами.
Чт фев 22, 2018 15:06:09
А как на ассемблере устроить десятичный счет последовательно от 0000 до 9999.
Разделите задачи, у вас их две :
счетчик от 0000 до 9999
и
вывод информации в понятном пользователю виде
счетчик - инкремент младшего байта + сложение старшего байта с битом переноса и контроль достижения максимума.
а вот уже в выводе городите что вам приспичит, вплоть до реализации ITOA на асме...
Чт фев 22, 2018 15:24:50
если перевод в BCD труден то
Пробовал последовательно инкрементировать 4 ячейки памяти (каждую через 9 циклов) с CJNE через 9, но например, при переходе от 0019 к 0020 сначала образуется 0009, и только в следующем цикле образуется 0020
доводите до совершенства...
Пт май 04, 2018 21:59:03
В журнале Радио как-то публиковалась статья про преобразование аналоговых величин МК. Скрин во вложении. Что имеется в виду под порогом переключения? Напряжение, время??? Как его узнать?
- Вложения
-
- 1234567.jpg
- (103.08 KiB) Скачиваний: 925
Пт май 04, 2018 22:36:53
напряжение, разумеется. Никак- есть диапазон для данного типа ИС в ТУ, а для конкретного экземпляра определяется только практическим путем. И да,
статья в 4/2005 была про PIC12F675, а название темы немного отличается
Сб май 05, 2018 06:34:45
Лучше готовые внешние ЦАП и/или АЦП использовать (из комплектации к адуринкам).
Ранее метод применялся у ПИК МК - но там иное, чем у mcs51 построение выходных каскадов портов - для классики может не пойти.
Относительно ЦАП на основе ШИМ попроще - там любой МК сгодится.
Есть и современные от китайцев STC15F204EA с АЦП на борту (из "прощедоступных")
Сб май 05, 2018 11:35:49
напряжение, разумеется. Никак- есть диапазон для данного типа ИС в ТУ
Например, в статейном варианте: 25 Вольт, мВ? И разве на импортные микросхемы есть ТУ? И как практически тогда определить?
Вс май 06, 2018 14:55:44
где Вы в той формуле увидели В или мВ? Это т.н. эмпирическая формула. На имп. ИС есть datasheet, это ничего не меняет с точки зрения вопроса
Вс май 06, 2018 17:48:38
Так вопрос в том и заключался: какой параметр из даташита для конкретной микросхемы нужно подсталять в формулу? Есть ли у него англоязычное название?
Вс май 06, 2018 19:02:12
Этот параметр называется Input Low Voltage.
Пн май 07, 2018 16:20:10
Люди - помогите разобраться с тем что делает данный участок кода :
Именно не что делает каждая команда, а что делает с математической и логической стороны над значениями в ячейках ОЗУ 0018h-001Fh
Код в формате i8035 выполняется в адресах 0284h - 2FFh
Входной параметр в R2 (0-3) по кругу при каждом вызове
MOV R1,#18h
MOV R3,#8
M1:
MOV A,@R1
CPL A
RL A
RL A
ANL A,#0Ch
ADD A,R2
RL A
ANL A,#1Eh
MOVP A,@A
MOV R0,A
MOV A,@R1
CPL A
RR A
RR A
ANL A,#3Fh
INC A
ADD A,R0
MOV @R1,A
INC R1
DJNZ R3,M1
Начальные значения в ячейках от 1 до FF, 0 не бывает.
С адреса 0200h имеется таблица
db 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h,
db 01h, 00h, 00h, 00h, 01h, 00h, 00h, 00h,
db 01h, 00h, 01h, 00h, 01h, 00h, 00h, 00h,
db 01h, 00h, 01h, 00h, 01h, 00h, 01h, 00h,
db 01h, 00h, 01h, 01h, 01h, 00h, 01h, 00h,
db 01h, 00h, 01h, 01h, 01h, 00h, 01h, 01h,
db 01h, 01h, 01h, 01h, 01h, 00h, 01h, 01h,
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
Есть предположение что в коде ошибка. Возможно преднамеренная, но без понимания того, что код делает сложновато.
Пн май 07, 2018 18:50:42
" Входной параметр в R2 (0-3) по кругу при каждом вызове
MOV R1,#18h что содержится в регистре R18 неизвестно
MOV R3,#8
M1:
MOV A,@R1
CPL A
RL A
RL A
ANL A,#0Ch
ADD A,R2
RL A
ANL A,#1Eh
MOVP A,@A что содержится в таблице на текущей странице памяти программ неизвестно
также неизвестна сама текущая страница данного кода
MOV R0,A возможно вариант стека для акумулятора
MOV A,@R1 читаем регистр
CPL A инверсия с последующим умножением на 4
RR A
RR A
ANL A,#3Fh Забиваем единицами все, кроме 6 и 7 бита
INC A похоже на дополнение до двух, но с промежуточным умножением после инверсии
ADD A,R0 предыдущее значение складывается с результатом
MOV @R1,A засылается в регистр
INC R1 и переходим на следующий элемент массива
DJNZ R3,M1
..."
Возможно какой-то вариант CRC контроля с привлечением таблицы (изврат на тему CRC8 или подобного) или кодирования с определенным ключом обработки... Как версия улучшенной "контрольной суммы" ибо обрабатывается массив данных в ОЗУ с табличным ключом (табличная CRC??).
Вт май 08, 2018 09:25:45
Второй набор регистров не используется, забыл сказать. Используются как ячейки памяти, содержимое которых так-же было указано
Адреса расположения программного кода и таблицы указаны
Предположений что это у меня много - нужно больше конкретики или какая-то свежая мысль.
Что значит каждая команда я знаю.
ANL на забивает единицами - а забивает нулями те поля, где в параметре "0" AND же функция...
Вт май 08, 2018 09:41:11
Wladimir_TSЧе-то я строки с адресами слева от команд в упор и под лупой не наблюдаю...
Вт май 08, 2018 10:49:19
3я строка сверху с начальном сообщении указывает диапазон адресов внутри которых данный кусок находится - так как точно начального адреса не знаю (кусок выдран из более объемного кода). А как имеющийся ассемблер заставить генерить *.lst я ещё не думал. С таблицей он в одном сегменте.
Над таблицей дан конкретный адрес.
Вт май 08, 2018 12:25:11
Без адреса команды MOV R1,#18h обсуждение не имеет смысла.
(собственно более необходим абсолютный адрес для MOVP A,@A)
Т.е.
NNNN mov..... где NNNN значение адреса перого байта команды.
Раскладка адресов(как я уже писал ранее в другой теме) может быть получена или по *.hex файлу или по *.bin файлу (образ ПЗУ) без особого труда (делаем прожку на basic или на чем посовременнее).
А сама страница памяти - это 0х0200:0х02FF, а не 0284h - 2FFh как у Вас.
Диапазон целевых адресов 000хххх0 на текущей странице памяти программ 0-0x1E (0-30).
Но это всего лишь компонента обработки в которой участвует 8 байт массива в ОЗУ (0x18-0x20) и компонент из R2.
Задача прожки поменять значение массива согласно текущего байта данных, сменного ключа из R2 и ключа из таблицы в соответствии с значением первой части обработчика.
Ср май 09, 2018 15:18:41
Можно считать, что адрес первой команды MOV R1, #18h = 0284h
Основной вопрос как раз с точки зрения назначения куска кода, а не того, как он работает.
Ср май 09, 2018 15:43:30
Так уже сказано - вариант то-ли шифровальщика, то-ли генератора контрольного кода для сравнения блока из 8 байт.
Назначение определяется работой кода и устройством (общей программой и схемотехникой конкретного устройства) где тот пакет данных используется (откуда загружается и куда затем выдается).
Ср май 09, 2018 16:34:11
Если-б было все так просто.
Но - для каждого из 4х последовательных вызовов с разными входными значениями в R2 исходное содержимое 8 ячеек памяти одинаково (независимо от их содержимого после предыдущего вызова). В них не может содержаться значение 0. Полученные 32 байта есть полезная обрабатываемая информация.