Страница 7 из 9
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:48:18
shonty
Вячеслав М. писал(а):никаких задержек в прерывании не должно быть! Я в прерывании обычно только выставляю флаг события,
совершенно верно.
и, если нужна только проверка флага, то обработчик прерывания можно не запускать, потому что флаг устанавливается и без обработчика:
[uquote="shonty",url="/forum/viewtopic.php?p=4678766#p4678766"]В обработчик прерывания же вообще можно не заходить и не обрабатывать. А вести опрос флага преывания в цикле.[/uquote]
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 20:53:58
BOB51
В прошлом IDE выпускал тот, кто и сам МК разрабатывал.
На сегодня это уже таки прошлое...
Способов отладки программ также достаточно много. Наиболее достоверные дает симулятор и отладочный макет (плюс различные варианты внутрисхемной отладки).
Остальное зависит от привычек, возможностей и целей.

Если прерывание не требует немедленной обработки, то есть большая вероятность того, что его использование в программе вообще не требуется.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:00:27
shonty
Макет достовернее. Симулятор вряд ли учтёт например разброс параметров периферии, наводки..
..дребезг кнопок

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:12:34
BOB51
Симулятор нужен для тонкой пошаговой отладки алгоритмов.
Собственно это аппаратных периферийных модулей редко касается, а вот всяко-разных переходов и фокусов с циклами/адресами и условиями достаточно часто требуется.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:15:23
Starichok51
shonty писал(а):а call 2
кроме jmp и call есть еще команды из двух слов.
Вячеслав М. писал(а):никаких задержек в прерывании не должно быть!
а попробуй запрети всем и каждому!
я вот в своем проекте в прерывании от INT0 делаю задержку, чтобы "поглотить" дребезг кнопки. даже с огромным запасом - 40 мс.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:22:30
BOB51
Помимо прерываний есть еще "базовая сетка частот" с установкой флагов по отработке определенных интервалов времени и исполнению соответствующих этим флагам обработчиков в основном цикле программы.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:27:45
Вячеслав М.
А мне не надо в прерывании антидребезгом заниматься, у меня прерывание программу с начала запускает - 1 ms. А вот в в этой программе антидребезг и происходит, причём настраивается на каждый вход индивидуально, с дискретой 1 ms, хватает от 10 до 40 одинаковых результатов на входе и создаётся событие "Нажато", "отжато", "удерживается", и "двойной клик", этого хватает для любых входов общего назначения или кнопок, Так что у меня прерывание очень скоротечно, и не делает ничего кроме событий, которые и флаги то не меняют и ничего в стеке сохранять не нужно, для прерываний даже специально пару регистров зарезервировано. Себе я запретил ))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:32:05
BOB51
Это вариации на тему "сетки частот".

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:36:59
Вячеслав М.
В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, вот и считай себе, если не дошло значит отпускай, пусть проц другими делами займётся.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 21:39:52
shonty
Starichok51 писал(а):кроме jmp и call есть еще команды из двух слов.
call, jmp, lds, sts
вроде всё
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 22:00:12
Вячеслав М.
Не разделяю мнение тех кто говорит что надо вручную смотреть адреса переходов, я всё по меткам делаю. У меня даже в макро адреса переходов передаются как метки.
Добавлено after 2 minutes 54 seconds:
А вот интересно конечно же было бы если не пожадничали и выложили все свои макро ))) Это только теоретически, не призываю )))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 22:05:34
shonty
Вячеслав М. писал(а):бы если не пожадничали и выложили все свои макро )))
Это очень опасно
Начнётся критика переходящая в срач

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Вт фев 04, 2025 23:55:44
BOB51
[uquote="Вячеслав М.",url="/forum/viewtopic.php?p=4679266#p4679266"]В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, ...[/uquote]
Не факт, что основной цикл может иметь строго фиксированную длительность, скорее наоборот.
А вот вариант сетки частот на основе прерываний от таймера, тактируемого системным генератором довольно удобная штука - интервалы всегда точно выдержаны будут.
Да и программных таймеров с контрольными флагами можно сколь угодно добавить.

Что касается макросов...
У каждой программы могут быть свои.
Не забываем, что макрос не подпрограмма - каждый раз развертывается в набор соответствующих кодов при упоминании.
Из реально удачных разве что дополнения к системе команд...
Спойлер
Код: Выделить всё
;
.macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром"
eor @0,@1 ; вызывается как xchrr rd,rs
eor @1,@0
eor @0,@1
.endmacro
;
.macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/"
ldi @0l,low(@1) ; вызывается как ldiw rp,0xnnnn или ldiw rp,name
ldi @0h,high(@1) ; (где name=0xnnnn, rp=x,y,z)
.endmacro
;

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 06:58:02
shonty
LDIW удачный макрос. И мнемоника удачная.
А вот практическое применение первого не совсем понятно

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 08:34:13
Вячеслав М.
[uquote="BOB51",url="/forum/viewtopic.php?p=4679296#p4679296"][uquote="Вячеслав М.",url="/forum/viewtopic.php?p=4679266#p4679266"]В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, ...[/uquote]
Не факт, что основной цикл может иметь строго фиксированную длительность, скорее наоборот.

[/uquote]
Можно временные коды в начале цикла ставить, тогда джиттер будет совсем незначительный, но это большая натяжка, обычно не нужно точность больше чем 1 ms, это время для обработки всей программы, в тысячи задач, и точней не надо, так же нужно иметь ввиду что программа занимается вводом/выводом в строгом времени и никакого джиттера вообще нет, разумней в начале цикла. Это реализация программы реального времени, с множеством задач. Основная программа в главном цикле не занимается вводом/выводом, она лишь собирает таблицу, а далее по событию от прерывания ввод/вывод, каждую 1 ms.
Добавлено after 21 minute 59 seconds:
[uquote="shonty",url="/forum/viewtopic.php?p=4679330#p4679330"]LDIW удачный макрос. И мнемоника удачная.

[/uquote]
У меня подобных удачных макросов несколько десятков, например есть регистры с защитной предустановкой, вот на них есть макросы, для разных процев IF стоит, включая xmega, ну естественно все словные макросы как в вашем случае, так же в макрос передаётся оперативный регистр который можно использовать в данном участке программы, и прочее. Это вы откликнулись на предложение обменяться макросами?))) Так много макросов я у DI Halt _а стащил, потом немножко подправил.
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 09:11:03
shonty
Вячеслав М. писал(а):Это вы откликнулись на предложение обменяться макросами?)))
Нет))
У меня только один стабильный макрос, это задержка. Выкладывать не буду, точно критика будет
Остальные больше ситуационные и привязанные к конкретным задачам, например к драйверам периферии.. + в них могут использоваться ситуационные дефы регистров/портов и т.п..
Вячеслав М. писал(а): Так много макросов я у DI Halt _а
Однажды, начитавшись DI_Halt-а, я увлёкся макросами. Но потом осознал, что во первых мне теперь нужно учить "язык своих макросов", а во вторых макросы абстрагируют от процессов и железа..
Тогда проще на ЯВУ перейти, чем активно макросы использовать..))
Мне конечно не жалко, но это точно никому не нужно.
Тем более там ещё и смещение адреса *2
-2
Для примера:
Спойлер
Код: Выделить всё
.MACRO DSPL_field
ldi ZL, low (@0 *2-2)
ldi ZH, high (@0 *2-2)
call SET_dspl_AREA
.ENDMACRO
DSPL_field str_2
str_0: .dw 10,319,5 ,20
str_1: .dw 10,319,5+25*1 ,20+25*1
str_2: .dw 10,319,5+25*2 ,20+25*2
str_3: .dw 10,319,5+25*3 ,20+25*3
str_4: .dw 10,319,5+25*4 ,20+25*4
...
...
Добавлено after 5 minutes 7 seconds:
Макросы нужно в связке с алгоритмами рассматривать. Макрос чаще вторичен же))
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 11:14:06
Starichok51
shonty писал(а):смещение адреса *2-2
а зачем минус 2? а почему не -20?
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 11:48:46
shonty
Starichok51 писал(а):а зачем минус 2? а почему не -20?
Потому что -2 ещё терпимо, а -20 уже холодно
Ну на самом деле.. деталей много, но если по сути:
Нужно расположить в массиве 16 битные данные, но так, чтобы и читабельны были.
То есть:
или
.db high(50), low(50), high(300), low(300),...... и т.д..
или
.dw 50, 300,........
Если .dw использовать, то при считывании массива через LPM сначала будет считываться low(), потом high(), что усложняет чтнение в цикле.
Поэтому подгружаем адресс массива со смещением -2, а цикл примерно так будет выглядеть:
Спойлер
Код: Выделить всё
ldi R17, n ; число слов в массиве
loop:
adiw ZL, 3 ; встаём на нечётный адрес памяти программ (MSB)
lpm
манипулируем с R0
...
...
sbiw ZL, 1 ; встаём на чётный адрес памяти программ (LSB)
lpm
манипулируем с R0
...
...
dec R17
brne loop
Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 11:50:10
BOB51
Что макрос, что подпрограмма - для подстановки часто встречающихся последовательностей кодов.
Преимущество подпрограмм в экономии ПЗУ, минусы - время на стековые операции при вызове/возврате.
Для макроса оптимально 3, максимум 4 команды или случай, когда стековые операции неудобны(или недопустимы).
В принципе все определяется автором основной программы.
Касательно
shonty писал(а):...
А вот практическое применение первого не совсем понятно

xchrr (xch) - это обмен данными между двумя регистрами регистрового файла.
Можно с MOV - но тогда потребуется три регистра и чуток больше команд
Ранее в системах команд были XCH, XCHD и SWAP - команды тетрадных (двоично-десятичных) манипуляций.
SWAP у АВРок осталась, а вот обмен тетрадами и обмен регистров исчезли (как и ранее часто встречавшаяся DAA - десятичная коррекция после сложения у I8080,Z80,MCS51,MCS48).
Правда на сегодня двоично - десятичный формат практически в счетчиках не используется - все в двоичном считать стараются.

Re: Вопрос по программированию задержки внутри прерывания
Добавлено: Ср фев 05, 2025 12:07:07
shonty
BOB51 писал(а):это обмен данными между двумя регистрами
я понял, что это "рокировка", только не пойму, где её применить можно
Добавлено after 3 minutes 31 second:
Ещё смысл вот этой записи не понимаю (встречается иногда):
eor R0, R0
есть же clr