Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Ср май 09, 2018 17:51:21

Так работает любое контрольное устройство - независимо от содержания пакета результат контрольного отсчета и прилагаемого ключа-подписи всегда одинаков.
А ежли имелась ошибка - будет и изменение результата.
8)

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Вт май 15, 2018 11:09:38

Не совсем понял фразы.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 08:48:46

Доброго времени суток.
Внутри кода находится строка символов (массив вида db 'Hello',0).
Необходимо поместить первый символ строки в буфер приемопередатчика UART, "обойти" этот массив и продолжить выполнение кода за ним + оставить в DPTR адрес второго символа строки для продолжения передачи всей строки из обработчика UART.
Помещаю в DPTR адрес первого символа строки.
Затем написал 2 варианта обхода, оба рабочие, но 1-й требует лишнюю ячейку ОЗУ, а 2-й чуть длиннее. Может кто увидит более элегантное решение:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 10:41:39

А если передачу вести самостоятельной подпрограммой?
:roll:
Т.е. основная программа идет сама по себе, а при необходимости пересылки запускаем подпрограмму обслуживания передатчика,
которую привязываем к прервыанию и начальному адресу массива символов...
А подпрограммка UARTа крутится самостоятельно пока не исчерпает содержимое массива...
:roll:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 10:51:06

Это я знаю как сделать.
Хочется именно "обходить" строку в коде, дабы иметь возможность ее объявление прямо на месте, в макросе, а не объявлять ее где-то на отшибе.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 11:02:26

Так макрос может включать в себя строку и вызов подпрограммы обслуживания передатчика...
Там просто вставляем текущий адрес начала строки равноценно таковому для любой области памяти.
:roll:
Это вызов подпрограммы с передачей параметров через стек или через регистры ОЗУ.
А в макросе остается только добавить переход для обхода участка символов строки.
Примерно
код....
вызов подпрограммы обслуживания передатчика с заданием параметра "начало строки"
переход на метку "конец строки+1"
начало строки:
конец строки+1:
продолжение кода...
:roll:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 11:17:53

:roll:

Не понял. Можно увидеть код/псевдокод ?
Под обработчиком UART имею ввиду прерывание UART с соответвующим кодом выборки и отправки строки (в текущей реализации все кроме первого символа, который отправляется из основного кода).

Ап. Благодарю.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 11, 2019 11:42:51

МММ...
В принципе есть регистровая пара в которую помещается целевой адрес начала строки перед вызовом программы передачи.
А программа передачи работает с данной регистровой парой как с текущим указателем чего отсылать.
Чего мы в ту регистровую пару поместим - адрес из текущего кода или из отдельной области - значения не имеет - будет выполняться одинаково.
Такой вариант у меня в КОТУИНКО биосе.
Разбирать/вспоминать долго (ибо таки поднаворочено).
Вот кусманчик передатчика:

и собственно весь тот проект:
https://yadi.sk/d/o-Jf3fADfDtsEQ
там поднакручено из-за особенностей вызова обработчика передатчика - сначала идет вызов как подпрограммы из кода, а затем дальнейшая обработка как прерывания до конца массива символов.
:beer:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Вс ноя 17, 2019 14:20:51

Доброго времени суток.
Написал макрос поиска подстроки (из флеша) в строке (из ОЗУ).
Покритикуйте и предложите лучше.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Вс ноя 17, 2019 20:34:56

На первый взгляд...
Разве что...
Как элемент сравнения помимо вычитания попробовать
cjne или xrl ...
Да и в ОЗУ у 51-й не так уж много места для строк произвольного размера.
Посему можно и прямой адрес задавать (не через косвенную адресацию) но при некоторой потере объема в ПЗУ.
Есть смысл выделения буфера определенного размера в косвенноадресуемой области для 52-х (128+128 байт)
там уже вариант работы через стек... Однако переносимость кода будет иметь ограничения.
В принципе то уже подгонять под конкретную потребность надо.
:roll:
И еще...
Для единичного символа это подойдет (ловим первый встретившийся и далее, если совпадает последовательность).
А вот для строки, содержащей пару одно/двух(и более) символьных повторов...
Вида :
контрстрока
поймать в ней
рок
или более сложный двойной/многократный повтор одинакового фрагмента чуток поменьше контрольного фрагмента...
:dont_know:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Вс ноя 17, 2019 22:54:41

...
Для единичного символа это подойдет (ловим первый встретившийся и далее, если совпадает последовательность).
А вот для строки, содержащей пару одно/двух(и более) символьных повторов...
Вида :
контрстрока
поймать в ней
рок
или более сложный двойной/многократный повтор одинакового фрагмента чуток поменьше контрольного фрагмента...
:dont_know:

Скорее так:
контрстрока
поймать в ней
тро
Ну я для этого как раз флаг symbol_ok и ввел. Без него код был попроще, но например последовательность '123' в массиве '1121121123ХХХ' уже не ловилась, ибо первый сивол настоящей последовательности разпозначался как неправильный второй символ преполагаемой последовательности, и пропускался.
Мне ответы на АТ-команды надо парсить, а там частенько такое встречается, что ответы началом похожи.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 18, 2019 08:56:21

А почему бы не сходу и "парсить" ?
Без предварительного буферного ввода.
(Ессно буфер - накопитель полезной составляющей будет необходим).
Единственно скорость обмена делать соответствующей.
Я поток данных из *.hex файла получаемого из терминалки ПК в бинарник внешнего ОЗУ перегоняю без особых проблем.
Правда на скорости 9600 (при кварце 11,0592МГц)... Но там дополнительная обработка содержимого добавляется - из-за того и "некоторые излишества".
Собственно в бутлоадере КОТУИНКИ этим mason_2.txt занимается.

Поскольку простая обработка символа не требует таких "наворотов"
вроде свертки двух символов в один байт или получения адресной информации для позиционного размещения фрагмента по конкретному адресу ОЗУ/ПЗУ,
решение может быть гораздо проще, без излишних добавок.
:roll:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 18, 2019 09:10:35

А почему бы не сходу и "парсить" ?
Без предварительного буферного ввода ...
решение может быть гораздо проще, без излишних добавок.
:roll:

Это уже реализовано. Есть 2 режима: парсинг данных из UART на лету, и "просто положи в буфер, как будет время - выгребу". Успешное окончания парсинга в обработчике автоматом включает режим "положи в буфер". А уже из него выгребаю и анализирую "параметры", например уровень сигнала сети. Просто иногда параметров у одного ответа много, и чтобы после получения первого параметра опять не переключатся в режим парсинга в обработчике, проще продолжить прием в буфер, и потом найти там нужную последовательность.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Пн ноя 18, 2019 10:06:59

Тогда в принципе особо чего добавить...
остается в силе вариант сравнение-переход (cjne, xrl)
да еще вариант загрузки DPTR и temp_dph:temp_dpl...
Может есть смысл в макросе грузить не в DPTR, а в temp_dph:temp_dpl...
а затем использовать внутреннюю перегрузку уже в подпрограмме.
Тем более, что предыдущий DPTR все равно предпочтительно в стеке хранить при входе
(как АСС и PSW)... А затем восстанавливать при выходе из подпрограммки.
Или старт-адрес через стек передавать - но тогда сложнее содержимое стека при разных вариантах выхода отслеживать.
:roll:
И почти упустил...
При относительно небольшом "ассортименте" блоков сравнения можно попробовать
movc a,@a+pc вместо movc a,@a+dptr с передачей начального смещения...
:roll:
Ответить