Страница 3 из 9
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Пн янв 13, 2025 13:30:39
shonty
[uquote="Starichok51",url="/forum/viewtopic.php?p=4670367#p4670367"]во, к примеру, как у меня сделана подстановка адреса возврата в прерывании для таймера1:[/uquote]
Starichok51, спасибо.
Работает чётко..
А то не понимал как правильно из прерывания на адрес выходить..

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Пн янв 13, 2025 14:23:55
Starichok51
таким образом можно выходить в любое место программного цикла, не обязательно в самое начало, как сделано у меня.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Пн янв 13, 2025 14:32:01
BOB51
И не только в пребываниях - любая подпрограмма может точно так же менять точку возврата.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Пн янв 13, 2025 14:58:48
akl
Команды IJMP и ICALL прекрасно работают.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Пн янв 13, 2025 16:28:19
BOB51
Это вызов подпрограмм, а речь шла об условном возврате с погашением прерывания (или без оного, что много реже).
Т. Е. Сначала вход в подпрограмму из исходной точки, затем переход к другому модулю и по его завершении возврат в исходную.
Основное назначение - разрешение работы прерываний после исполнения кратковременной части обработчика.
При том, что "длинная" часть обработчика прерывания продолжает выполняться до его окончательного завершения как обычная, подпрограмма. Плюс может быть несколько таких "длинных хвостов" согласно необходимым условиям.
Собственно одна из разновидностей построения программ...
(помимо АВРок и другие семейства существуют - смотрим тот же I8080/Z80, ПИКушки, 51е).

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 04:12:57
Demiurg
[uquote="Starichok51",url="/forum/viewtopic.php?p=4670367#p4670367"]во, к примеру, как у меня сделана подстановка адреса возврата в прерывании для таймера1:
Код: Выделить всё
;--- Таймер1 ---
ldi R16, low(RAMEND)
out SPL, R16
ldi R16, low(main)
push R16
ldi R16, high(main)
push R16
reti
перезаписываю вершину стека и пишу в стек адрес возврата.[/uquote]
Баловство. Правильная организация - разбить основной цикл, чтобы с запасом упаковаться в системный тик. 1 мс, 10 мс. Чтобы итерация основного цикла гарантированно с запасом выполнялась за системный тик.
А игры со стеком это баловство. В диспетчерах, ртосах ещё пойдет. Не более.
Как только настал момент игры со стеком. Значит, ты что то неправильно делаешь в организации программы.
Это мое мнение.
В свое время я тоже задавался вопросом. А как чё то сделать и вернуться. Потом понял. Это вопрос чайника. Правильная организация программы.
Где то валяется самописное диспетчер, ртоска. И там игры со стеком. Не пригодилось
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 07:21:18
shonty
Ну это не только в программировании. Практически во всём и у любого метода есть целесообразность и ограничения.
Тут суть в наличии вариантов решения под конкретные задачи и условия.
Demiurg писал(а):А игры со стеком это баловство
С позицией хорошо/плохо или добро/зло тоже далеко не уехать))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 08:43:57
Demiurg
[uquote="shonty",url="/forum/viewtopic.php?p=4671284#p4671284"]Ну это не только в программировании. Практически во всём и у любого метода есть целесообразность и ограничения.
Тут суть в наличии вариантов решения под конкретные задачи и условия.
Demiurg писал(а):А игры со стеком это баловство
С позицией хорошо/плохо или добро/зло тоже далеко не уехать))[/uquote]
Нет категории хорошо плохо. Есть единственная целесообразность. И инженерный подход. Постараться учесть все моменты. Чтобы твое устройство не было опасным.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 09:22:55
BOB51
Не так уж и "бесполезный" прием.
К примеру "псевдопараллельный" Обработчик динамической индикации/клавиатуры на пребывания от таймера...
Вполне жизнеспособной для применения.
Да много ещё различных вариантов. Особо для МК без возможности программно изменять приоритет прерываний.

Что же касается "абсолютной безопасности/безотказности/надёжности" самоделки - это уже отдельная тема, включающей помимо программной начинки множество других факторов.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 09:45:28
Starichok51
Demiurg, это моя программа термометра на DS18B20, и системный тик в ней 1 секунда.
прочитал температуру, вывел на экран, запустил преобразование и "топчусь" на месте и жду следующего прерывания.
и твоё мнение о "неправильности" не правильное.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 10:28:39
shonty
Demiurg, в моём случае внешнее прерывание (а оно не циклично) просто останавливает таймер. И после остановки уже нет смысла возвращаться к продолжению, а именно из прерывания нужно сделать прыжок и выполнять совсем другие действия.
Правда пришлось ввести переинициализацию индикатора на max7219 (иногда сбои были)
Но повторюсь, в данном случае мне проще сделать прыжок и переписать часть с "чистого листа", чем возвращаться в недоделанное, потом в основной цикл, который забивать проверками флагов и условий.. А программа то всего 0,9 кб ))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 11:33:59
BOB51
Отошли от темы топикстартера!

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 19:40:06
Demiurg
shonty, не верный и неправильный подход. Если вы уже подумали прыгнуть со стеком. Это уже неправильный подход. Это хак. Но не решение. Решение осознать проблему и решить её. Без прыжков по стеку.
Вывернись наизнанку. Но реши без прыжков. Это будет правильно. Игры со стеком прыжки для диспетчеров и ртос.
Добавлено after 3 minutes 51 second:
Поясню. Ты срываешь стек. И ломаешь всю предыдущую работу МК. Да, тебе хочется начать все сначала. А кто тебе мешает? Поставил программный таймер. Не нравится, начинай сначала. Кто мешает?
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:07:34
shonty
8-bit Instruction Set Rev. 0856H–AVR–07/09
Читаем например инструкцию RET:
Returns from subroutine. The return address is loaded from the STACK. The Stack Pointer uses a pre-increment scheme during RET.
Возвращается из подпрограммы. Адрес возврата загружается из СТЕКА. Указатель стека использует схему предварительного приращения во время RET.
или например инструкцию RETI:
Returns from interrupt. The return address is loaded from the STACK and the Global Interrupt Flag is set.
Возврат из прерывания. Адрес возврата загружается из СТЕКА и устанавливается флаг глобального прерывания.
Мы постоянно используем стёк, не ведая об этом и под другим соусом.
Demiurg, кроме как:
Demiurg писал(а):shonty, не верный и неправильный подход. Если вы уже подумали прыгнуть со стеком. Это уже неправильный подход. Это хак. Но не решение. Решение осознать проблему и решить её. Без прыжков по стеку.
конкретно по коду
Starichok51-ка есть что возразить?
Что там "сломалось"?
Добавлено after 1 minute 50 seconds:
А пока вы своими сообщениями лишь пытаетесь меня загипнотизировать
Добавлено after 2 minutes 23 seconds:
shonty не совсем удачный объект для гипноза))
А вот аргументы с удовольствием почитаю))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:22:46
Starichok51
в этом моем коде на программный цикл тратится несколько миллисекунд. и потом нужно ждать, когда закончится преобразование в термометре.
а время повтора цикла задано таймером с периодом 1 секунда, когда преобразование заведомо закончится.
скажу даже больше - я при этом даже не "срываю" стек, он и так уже находится на своей вершине, и операция загрузки вершины стека в моем коде даже лишняя.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:24:14
Demiurg
Зачем мне эта информация?! Я на ассемблере несколько лет сидел. Равнялся на инженера AVR. Шел следом.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:25:08
BOB51
Скорее имелось ввиду, что произвольные операции со стеком требуют особого внимания при их организации.
Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы.
В ЯВУ сие крайне не рекомендованный приём.
На сегодня время выполнения команд (быстродействие МК) многие вопросы снимает. Это раньше 1микросекунда на команду ограничения жестко накладывала.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:31:27
Demiurg
Да. Игры со стеком опасны. Ты должен четко понимать. Что ты делаешь.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:36:52
Starichok51
конечно, я бы мог сделать "тупо" по Demiurg-у : создать аппаратный таймер, допустим по 4 мс и потом по программному счетчику ждать 250 прерываний таймера, чтобы получить 1 секунду, и затем перейти на полный цикл. а после окончания цикла вернуться на ожидание 250 прерываний таймера.
а игры со стеком опасны только для тех, кто ни хера не понимает в стеке.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт янв 14, 2025 20:39:21
shonty
BOB51 писал(а):Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы.
Вот, кстати, здравая мысль..
Понятно, что программируя на библиотеках, можно уехать на другой адрес и там заблудиться..
Суть асм-а в максимальном контроле ))