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

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:

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

Пн июн 29, 2020 09:11:31

Доброго времени суток. Понадобилось использовать второй DPTR на AT89S52. Делаю вот так:
Код:
mov 0A2h,   #0   ; select DP0L, DP0H
mov DPL,  #'A'
mov 0A2h,   #1   ; select DP1L, DP1H
mov DPL,   #'B'
mov 0A2h,   #0   ; select DP0L, DP0H
mov SBUF,DPL

и не выходит каменный цветок. В UART шлется 'B', а не 'A'. Адрес регистра AUXR1, отвечающего за выбор DPTR, на карте памяти AT89S52 составляет 0A2h. За переключение отвечает младший (0) бит, который и переключаю (остальные биты не имеют значения, и всегда читаются как 1). Выводил в UART значение AUXR1 (0A2h) до, и после переключения - так оно меняется (либо 0FEh, либо 0FFh), но на выбор DPTR никак не влияет :dont_know:

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

Пн июн 29, 2020 09:35:24

Пока_без_кота писал(а):но на выбор DPTR никак не влияет
а где вы используете DPTR? в коде этого нет!
вы пишите в регистр DPTR данные, затем из этого регистра данные назад берете - что у вас должно выбраться?! что положили, то и взяли.

альтернатива из двух вариантов DPTR используется в командах типа mov a, @a+dptr - вот тут, в зависимости от выбранного DPTR, будет взяты данные по одному или другому адресу.

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

Пн июн 29, 2020 10:17:04

а где вы используете DPTR? в коде этого нет!
вы пишите в регистр DPTR данные, затем из этого регистра данные назад берете - что у вас должно выбраться?! что положили, то и взяли.

альтернатива из двух вариантов DPTR используется в командах типа mov a, @a+dptr - вот тут, в зависимости от выбранного DPTR, будет взяты данные по одному или другому адресу.

В приведенном коде этого действительно нет, но это я упрощал условия для проверки кода, который у меня не работает.
Предистория.
Подцепил я к AT89S52 внешнюю ОЗУ, и решил запилить библиотеку для работы с ней. Одной из функций библиотеки является копировании произвольного количества байт из одной области внешней ОЗУ в другую область внешнего ОЗУ. И вот тут мне понадобился второй DPTR (до этого как-то не приходилось его использовать).
"Функция" имеет вид макроса с передачей параметров:

Согласно моей первоначальной логике, селектор DPTR должен был влиять на то, куда именно (в какую пару DPL/DPH) я буду писать значение при записи указателя в DPTR.

П.С. Благодарю. Переделал присвоение параметров-указателей следующий образом, и все заработало:
Код:
mov     DPL,#low(_source)
mov     DPH,#high(_source)
mov     DP1L,#low(_dest)
mov     DP1H,#high(_dest)

Получается, что команда mov всегда пишет в первый DPTR, а вот команда inc уже знает, с каким DPTR производить действие, в зависимости от состояния селектора.
Последний раз редактировалось Пока_без_кота Пн июн 29, 2020 10:57:07, всего редактировалось 4 раз(а).

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

Пн июн 29, 2020 10:51:46

Пока_без_кота писал(а):а вот команда inc уже знает, с каким DPTR производить действие, в зависимости от состояния селектора.
даже не так: все команды, работающие с DPTR (не частями, а целиком с 16-битным), учитывают заданный селектором регистр.

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

Пн июн 29, 2020 11:00:55

Селектор отвечает за то, с каким из DPTR будет проводиться действие команды, мнемоника которой включает в себя "DPTR".
Код:
movc a,@a+dptr
jmp @a+dptr
movx a,@dptr
movx @dptr,a
mov dptr,#d16  пока поставлю  ?
inc dptr

А вот когда загрузку указателей (содержимого) делаем в соответствующие регистры РСФ, там селектор ни при делах.
8)

Почему в макросе не сработало
mov dptr,#d16
надо повнимательнее посмотреть...
Как вариант - что-то не так с управлением селектором или ограничения по командам.
Вечерком чего гляну...
Хотя...
описание команд дает однозначность:
MOV
(DPTR)<--#DATA 15-0
DPH<-DPL<- #data 15-8 <- #data 7-0
т.е. можно предположить, что загрузка будет выполнена в DPH:DPL
Даташитку на МК только вечером просмотрю...
:roll:

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

Пн июн 29, 2020 12:54:53

Прошу прощения за дезинформацию. Все дело оказалось в задержках при работе с памятью. Использую тормозную советскую КР537РУ10, и просто когда переделывал передачу параметров под раздельное присваивание DPH/DPL - вставил отладочный вывод в UART, который и создал задержку, благодаря которой все заработало. Так что первоначальный вариант оказался тоже правильным, просто перед каждой записью в память добавил задержку по 80 мкс, и все взлетело.
Ответить