Вопрос по программированию задержки внутри прерывания

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4670367#p4670367"]во, к примеру, как у меня сделана подстановка адреса возврата в прерывании для таймера1:[/uquote]Starichok51, спасибо.
Работает чётко..

А то не понимал как правильно из прерывания на адрес выходить.. :dont_know:
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

таким образом можно выходить в любое место программного цикла, не обязательно в самое начало, как сделано у меня.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

И не только в пребываниях - любая подпрограмма может точно так же менять точку возврата.
8)
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Вопрос по программированию задержки внутри прерывания

Сообщение akl »

Команды IJMP и ICALL прекрасно работают.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Это вызов подпрограмм, а речь шла об условном возврате с погашением прерывания (или без оного, что много реже).
Т. Е. Сначала вход в подпрограмму из исходной точки, затем переход к другому модулю и по его завершении возврат в исходную.
Основное назначение - разрешение работы прерываний после исполнения кратковременной части обработчика.
При том, что "длинная" часть обработчика прерывания продолжает выполняться до его окончательного завершения как обычная, подпрограмма. Плюс может быть несколько таких "длинных хвостов" согласно необходимым условиям.
Собственно одна из разновидностей построения программ...
(помимо АВРок и другие семейства существуют - смотрим тот же I8080/Z80, ПИКушки, 51е).
8)
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение 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 мс. Чтобы итерация основного цикла гарантированно с запасом выполнялась за системный тик.
А игры со стеком это баловство. В диспетчерах, ртосах ещё пойдет. Не более.
Как только настал момент игры со стеком. Значит, ты что то неправильно делаешь в организации программы.
Это мое мнение.
В свое время я тоже задавался вопросом. А как чё то сделать и вернуться. Потом понял. Это вопрос чайника. Правильная организация программы.
Где то валяется самописное диспетчер, ртоска. И там игры со стеком. Не пригодилось
Реклама
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Ну это не только в программировании. Практически во всём и у любого метода есть целесообразность и ограничения.

Тут суть в наличии вариантов решения под конкретные задачи и условия.
Demiurg писал(а):А игры со стеком это баловство
С позицией хорошо/плохо или добро/зло тоже далеко не уехать))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

[uquote="shonty",url="/forum/viewtopic.php?p=4671284#p4671284"]Ну это не только в программировании. Практически во всём и у любого метода есть целесообразность и ограничения.

Тут суть в наличии вариантов решения под конкретные задачи и условия.
Demiurg писал(а):А игры со стеком это баловство
С позицией хорошо/плохо или добро/зло тоже далеко не уехать))[/uquote]
Нет категории хорошо плохо. Есть единственная целесообразность. И инженерный подход. Постараться учесть все моменты. Чтобы твое устройство не было опасным.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Не так уж и "бесполезный" прием.
8)
К примеру "псевдопараллельный" Обработчик динамической индикации/клавиатуры на пребывания от таймера...
Вполне жизнеспособной для применения.
Да много ещё различных вариантов. Особо для МК без возможности программно изменять приоритет прерываний.
:roll:
Что же касается "абсолютной безопасности/безотказности/надёжности" самоделки - это уже отдельная тема, включающей помимо программной начинки множество других факторов.
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

Demiurg, это моя программа термометра на DS18B20, и системный тик в ней 1 секунда.
прочитал температуру, вывел на экран, запустил преобразование и "топчусь" на месте и жду следующего прерывания.
и твоё мнение о "неправильности" не правильное.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

Demiurg, в моём случае внешнее прерывание (а оно не циклично) просто останавливает таймер. И после остановки уже нет смысла возвращаться к продолжению, а именно из прерывания нужно сделать прыжок и выполнять совсем другие действия.

Правда пришлось ввести переинициализацию индикатора на max7219 (иногда сбои были)
Но повторюсь, в данном случае мне проще сделать прыжок и переписать часть с "чистого листа", чем возвращаться в недоделанное, потом в основной цикл, который забивать проверками флагов и условий.. А программа то всего 0,9 кб ))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Отошли от темы топикстартера!
8)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

shonty, не верный и неправильный подход. Если вы уже подумали прыгнуть со стеком. Это уже неправильный подход. Это хак. Но не решение. Решение осознать проблему и решить её. Без прыжков по стеку.
Вывернись наизнанку. Но реши без прыжков. Это будет правильно. Игры со стеком прыжки для диспетчеров и ртос.

Добавлено after 3 minutes 51 second:
Поясню. Ты срываешь стек. И ломаешь всю предыдущую работу МК. Да, тебе хочется начать все сначала. А кто тебе мешает? Поставил программный таймер. Не нравится, начинай сначала. Кто мешает?
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение 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 не совсем удачный объект для гипноза))
А вот аргументы с удовольствием почитаю))
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

в этом моем коде на программный цикл тратится несколько миллисекунд. и потом нужно ждать, когда закончится преобразование в термометре.
а время повтора цикла задано таймером с периодом 1 секунда, когда преобразование заведомо закончится.
скажу даже больше - я при этом даже не "срываю" стек, он и так уже находится на своей вершине, и операция загрузки вершины стека в моем коде даже лишняя.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Зачем мне эта информация?! Я на ассемблере несколько лет сидел. Равнялся на инженера AVR. Шел следом.
Последний раз редактировалось Demiurg Вт янв 14, 2025 20:26:17, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос по программированию задержки внутри прерывания

Сообщение BOB51 »

Скорее имелось ввиду, что произвольные операции со стеком требуют особого внимания при их организации.
Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы.
В ЯВУ сие крайне не рекомендованный приём.
8)
На сегодня время выполнения команд (быстродействие МК) многие вопросы снимает. Это раньше 1микросекунда на команду ограничения жестко накладывала.
8)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Demiurg »

Да. Игры со стеком опасны. Ты должен четко понимать. Что ты делаешь.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопрос по программированию задержки внутри прерывания

Сообщение Starichok51 »

конечно, я бы мог сделать "тупо" по Demiurg-у : создать аппаратный таймер, допустим по 4 мс и потом по программному счетчику ждать 250 прерываний таймера, чтобы получить 1 секунду, и затем перейти на полный цикл. а после окончания цикла вернуться на ожидание 250 прерываний таймера.
а игры со стеком опасны только для тех, кто ни хера не понимает в стеке.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вопрос по программированию задержки внутри прерывания

Сообщение shonty »

BOB51 писал(а):Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы.
Вот, кстати, здравая мысль.. :beer:

Понятно, что программируя на библиотеках, можно уехать на другой адрес и там заблудиться.. :)))

Суть асм-а в максимальном контроле ))
Ответить

Вернуться в «AVR»