Страница 6 из 9
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 09:52:39
shonty
Starichok51 писал(а):shonty, ты что, вручную вычисляешь смещения для РС?
Ну не огульно все
В "библиотеках" в циклах да. Избегаю меток при работе со шрифтами, при конвертациях различных..
Вобщем, что универсальное, там избегаю.
И если процедура до 20 строк допустим, то внутри метки тоже не ставлю))
Starichok51 писал(а):а если нужно сделать прыжок на много адресов,
по метке прыгаю)
Метки для подпрограмм в основном. Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 10:44:56
COKPOWEHEU
[uquote="shonty",url="/forum/viewtopic.php?p=4678980#p4678980"]Использование PC более универсально, да и привычнее мне.
А конечный результат в данном случае в макросе оформлен будет.
С метками порой конфликты случаются, когда много своих "библиотек" подключаешь.[/uquote]
Использование PC как раз менее универсально. А чтобы не было конфликта подобных "одноразовых" меток, используйте цифры:
Код: Выделить всё
STC_wait:
1:
SBIS EIFR,INTF0
RJMP 1b
SBI EIFR,INTF0
shonty писал(а):Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))
Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:00:54
shonty
COKPOWEHEU писал(а):Использование PC как раз менее универсально. А чтобы не было конфликта подобных "одноразовых" меток, используйте цифры:
Код: Выделить всё
STC_wait:
1:
SBIS EIFR,INTF0
RJMP 1b
SBI EIFR,INTF0
Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
COKPOWEHEU писал(а):Извращение какое. А если понадобится лишнюю инструкцию вставить? А если поменять камень с m8 на m328 с соответствующей заменой in на lds и другим размером?
Если инструкцию вставить, то пересчитываю.
Если камень, то разные "библиотеки" у меня под m8, m328, lgt8, и т.д..
Так у m8/m328 даже регистры не все совпадают. Как универсалить

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:06:16
Jack_A
[uquote="shonty",url="/forum/viewtopic.php?p=4679000#p4679000"]Но бывает что пишу например rjmp Label+5, что бы внутрь подпрограммы запрыгнуть ))[/uquote]
Мне кажется, это не совсем хорошая практика. Трудно читаемо, особенно если после длительного перерыва или если кто-то другой разбирает исходник. Высчитывать смещения, загружать бошку. Программер должен быть достаточно ленивым.
Лишняя метка, особенно если это не безликая Label123, а осмысленное: LED_on, Busy и т.п. - денег не просит, но облегчает читаемость и модифицируемость.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:11:09
shonty
Предпочтения по оформлению кода индивидуальны и субъективны
Тем более от меня не требуется соблюдения корпоративных концепций ))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:17:06
COKPOWEHEU
[uquote="shonty",url="/forum/viewtopic.php?p=4679012#p4679012"]Если инструкцию вставить, то пересчитываю.[/uquote]
Вообще-то, метки для того и придуманы чтобы не пересчитывать.
shonty писал(а):Если метка начинается с цифры, то avrasm2 пишет: "error: syntax error, unexpected INTEGER"
Рекомендую начать осваивать гнутый ассемблер. Как минимум, проще потом с Си стыковаться.
shonty писал(а):Так у m8/m328 даже регистры не все совпадают. Как универсалить

Как все - ifdef-ами. И in/lds тоже. Хотя, честно говоря, не знаю, как это в гнутом асме делается.
shonty писал(а):Предпочтения по оформлению кода индивидуальны и субъективны
до тех пор, пока вы их не рекомендуете кому-то другому.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:27:01
shonty
Для примера приведу примерный пример про Label+5
Есть подпрограмма, выводит на дисплей значение регистра R21 в hex формате, ну это мне для отладки нужно..
Таки вот: если я пишу rcall OUT_HEX, то выводится 0x00
а если rcall OUT_HEX+5, то выводится просто 00.
Зачем мне тут лишняя метка, когда для меня и так всё достаточно информативно)
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 11:33:54
Starichok51
shonty, то есть, тебе жалко буквы на клавиатуре расходовать на написание метки?
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 12:56:31
shonty
Starichok51 писал(а):shonty, то есть, тебе жалко буквы на клавиатуре расходовать
Starichok51, да я вообще не жадный
Но, информативность должна быть достаточной, а не излишней) Всё ж в меру дожно быть, а меры у всех разные))
Кстати, именно в том примере осталась метка OUT_HEX_NO_0x:
Но я пишу rcall OUT_HEX+5
Добавлено after 29 minutes 12 seconds:
Сам код (+4 к метке в данном случае):
Спойлер
Код: Выделить всё
OUT_HEX:
ldi R16, 0
rcall DIG_10x16 ; на вывод "0"
ldi R16, 0x10
rcall DIG_10x16 ; на вывод "x"
OUT_HEX_NO_0x:
mov R16, R21
andi R16, 0b11110000
swap R16
rcall DIG_10x16
mov R16, R21
andi R16, 0b00001111
rcall DIG_10x16
ret
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 13:46:25
COKPOWEHEU
[uquote="shonty",url="/forum/viewtopic.php?p=4679031#p4679031"]Но, информативность должна быть достаточной, а не излишней)[/uquote]
У вас информативность НЕдостаточная. Почему именно +5, как узнать это число, не заглядывая в реализацию?
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 14:19:53
shonty
COKPOWEHEU писал(а):Почему именно +5, как узнать это число, не заглядывая в реализацию?
Частично вы правы. Но как бы название метки, не заглядывая в реализацию, тоже не узнать))
Но кстати, реализацию для себя поправил))
Спойлер
Код: Выделить всё
OUT_HEX:
ldi R16, 0
rcall DIG_10x16 ; на вывод "0"
ldi R16, 0x10
rcall DIG_10x16 ; на вывод "x"
; (+4 к метке, если без 0x)
mov R16, R21
andi R16, 0b11110000
swap R16
rcall DIG_10x16
mov R16, R21
andi R16, 0b00001111
rcall DIG_10x16
ret
Добавлено after 22 minutes 16 seconds:
С выводом hex-а не самый удачный пример привёл..
Вот тут оправдан + к адресу:
Код: Выделить всё
Label:
ldi R18, 8
...
...
...
много строк
...
...
dec R18
brne Label+1
...
...
Чтобы код не пестрил метками через строчку.
Добавлено after 4 minutes 27 seconds:
PS: "+" к адресу иногда рациональнее писать , чем "PC-.."
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 14:45:04
COKPOWEHEU
[uquote="shonty",url="/forum/viewtopic.php?p=4679063#p4679063"]Частично вы правы. Но как бы название метки, не заглядывая в реализацию, тоже не узнать))[/uquote]
Названия функций и их аргументы описываются в документации. Для этого не обязательно залезать в исходник. Да даже и залезая - пробежать глазами по меткам и вычленить те, что с осмысленными именами. Опять же не заглядывая в реализацию и не пытаясь угадать куда там можно прыгать, а куда нет.
А на языках высокого уровня вообще есть такая штука, как прототипы.
shonty писал(а):Но кстати, реализацию для себя поправил))
Стало гораздо хуже. Мало того, что не появилось осмысленных меток, так и та, что была, исчезла. При анализе кода как догадаться, что в эту точку подпрограммы вообще можно попасть кроме как с предыдущей строки?
shonty писал(а):Вот тут оправдан + к адресу:
И снова сделали только хуже. Из кода вообще неочевидно зачем туда прыгать.
shonty писал(а):PS: "+" к адресу иногда рациональнее писать , чем "PC-.."
В одном-единственном случае - когда он вычисляется в рантайме. Переход по таблице или что-то в этом роде.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 14:59:08
shonty
COKPOWEHEU писал(а):shonty писал(а):Вот тут оправдан + к адресу:
И снова сделали только хуже. Из кода вообще неочевидно зачем туда прыгать.
Я не понимаю, что может быть неочевидного, если после
dec R18 очень даже очевидно куда совершается переход. А именно на адрес, следующий за
ldi R18.
И мне там метка точно не нужна.
Потому что искать глазами в коде
R18 (подсвеченную подсветкой синт-са) легче чем бесполезную метку))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 19:46:32
BOB51
shonty писал(а):...искать глазами в коде R18 (подсвеченную подсветкой синт-са) легче чем бесполезную метку))
Абсолютно неверное предположение.
Даже в старо-древних компиляторах "на бумажке карандашиком" высчитывать смещение для перехода было весьма муторно.
А при более сложной организации адресации это вообще достаточно затратное дело.
Тем более, что доступ по метке применяется как для полного адреса, так и для "укороченного" (+/- N), и не только для адресного пространства ПЗУ но и для адресного пространства ОЗУ (частью которого являются и регистровый файл и РСФ).
Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
Второе - компилятор позволяет выполнять вычисления с данными меток, удобные в случае специальных требований к размещению исполняемых модулей подпрограмм.
Да и "склеивание" взаимодействия двух независимых программ при использовании в подгружаемом софте части резидентного может пригодиться.
АВРка с ПЗУ программ конечно не 51я с совмещенной внешней памятью программ/данных, но вариант использования элементов бутлоадера загружаемой (обновляемой) программой в своих целях также не исключается.

Относительно использования абревиатуры R0 - R31...
не возбраняется и довольно часто используется при малом количестве используемых программой регистров - подобие "классического одноаккумуляторного" решения.
Однако АВР тем и отличается от I8080/Z80, MCS51 и PIC среднемладших, что имеет аж 32 регистр-аккумулятора с очень развитой системой доступа.
Нужно и про эти возможности помнить и применять. Вот тут и подходят заданные пользователем имена регистров согласно задач
Я такой вариант еще называю "модель регистров" - ибо можно задать практически модель аналогичную всем ранее перечисленным МП и МК.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 19:55:23
Starichok51
а еще для ручного расчета смещения нужно точно знать длину каждой команды - один или два адреса.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:02:46
BOB51
Хватит и такого, чтоб порой матюкнуться (особо, ежли еще учесть разницу что принимается за точку расчета нулевого адреса компилятором и "вручную" - это РАЗНЫЕ точки будут!):

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:03:42
shonty
BOB51 писал(а):Получить карту меток также особого труда не представляет - или по листингу *.lst или по map файлу (*.map) (смотрим окно project в АВР студио 4.19 или аналогичное в микрочип студио).
BOB51, редко иде открываю. Из нотепада++ батник запускаю, который компилит и, если ошибок нет, шьёт..
Starichok51 писал(а):а еще для ручного расчета смещения нужно точно знать длину каждой команды - один или два адреса.
Иногда в справку подглядываю, но точно знаю, что rcall 1 слово, а call 2 ))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:11:21
BOB51
Предпочтение все же надо отдавать IDE !
В АВР студии есть достаточно удобный отладчик - дебаггер.
Ядро и команды он отрабатывает прекрасно, хотя и имеет ерраты по некоторым аппаратным модулям МК(ограничения функционала описаны в документации IDE)/
Отладчик/симулятор штука весьма удобная (тем более дармовая).
Второе - не потребуется прописи в запускающей строке компилятора вручную ставить.
(Если "классический" многофайловик).

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:28:43
shonty
BOB51 писал(а):Предпочтение все же надо отдавать IDE !
и эмуляторам?
У меня 3 в одном) иде, эмулятор и отладчик))
И вопросов не возникает, почему в протеусе работает, а в железе нет))
Также любую метку где нужно ставлю.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:34:37
Вячеслав М.
В самом названии темы есть ошибка режущая слух - никаких задержек в прерывании не должно быть! Я в прерывании обычно только выставляю флаг события, или если идёт поток данных, в SPI например, то только заранее подготовленные данные беру и отсылаю в соответствующий регистр и принимаю входные данные, всё, ничего другого и быть не должно.