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

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

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

Сообщение shonty »

Вячеслав М. писал(а):никаких задержек в прерывании не должно быть! Я в прерывании обычно только выставляю флаг события,
совершенно верно.

и, если нужна только проверка флага, то обработчик прерывания можно не запускать, потому что флаг устанавливается и без обработчика:
[uquote="shonty",url="/forum/viewtopic.php?p=4678766#p4678766"]В обработчик прерывания же вообще можно не заходить и не обрабатывать. А вести опрос флага преывания в цикле.[/uquote]
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

В прошлом IDE выпускал тот, кто и сам МК разрабатывал.
На сегодня это уже таки прошлое...
Способов отладки программ также достаточно много. Наиболее достоверные дает симулятор и отладочный макет (плюс различные варианты внутрисхемной отладки).
Остальное зависит от привычек, возможностей и целей.
8)
Если прерывание не требует немедленной обработки, то есть большая вероятность того, что его использование в программе вообще не требуется.
:tea:
Реклама
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Макет достовернее. Симулятор вряд ли учтёт например разброс параметров периферии, наводки..

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

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

Сообщение BOB51 »

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

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

Сообщение Starichok51 »

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

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

Сообщение BOB51 »

Помимо прерываний есть еще "базовая сетка частот" с установкой флагов по отработке определенных интервалов времени и исполнению соответствующих этим флагам обработчиков в основном цикле программы.
:roll:
Реклама
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

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

Сообщение Вячеслав М. »

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

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

Сообщение BOB51 »

Это вариации на тему "сетки частот".
8)
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

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

Сообщение Вячеслав М. »

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

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

Сообщение shonty »

Starichok51 писал(а):кроме jmp и call есть еще команды из двух слов.
call, jmp, lds, sts

вроде всё
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

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

Сообщение Вячеслав М. »

Не разделяю мнение тех кто говорит что надо вручную смотреть адреса переходов, я всё по меткам делаю. У меня даже в макро адреса переходов передаются как метки.

Добавлено after 2 minutes 54 seconds:
А вот интересно конечно же было бы если не пожадничали и выложили все свои макро ))) Это только теоретически, не призываю )))
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

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

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

Сообщение BOB51 »

[uquote="Вячеслав М.",url="/forum/viewtopic.php?p=4679266#p4679266"]В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, ...[/uquote]
Не факт, что основной цикл может иметь строго фиксированную длительность, скорее наоборот.
А вот вариант сетки частот на основе прерываний от таймера, тактируемого системным генератором довольно удобная штука - интервалы всегда точно выдержаны будут.
Да и программных таймеров с контрольными флагами можно сколь угодно добавить.
8)
Что касается макросов...
У каждой программы могут быть свои.
Не забываем, что макрос не подпрограмма - каждый раз развертывается в набор соответствующих кодов при упоминании.
Из реально удачных разве что дополнения к системе команд...
Спойлер

Код: Выделить всё

;
 .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
;
8)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

LDIW удачный макрос. И мнемоника удачная.

А вот практическое применение первого не совсем понятно :dont_know:
Вячеслав М.
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Пн янв 13, 2025 15:24:02

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

Сообщение Вячеслав М. »

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

Можно временные коды в начале цикла ставить, тогда джиттер будет совсем незначительный, но это большая натяжка, обычно не нужно точность больше чем 1 ms, это время для обработки всей программы, в тысячи задач, и точней не надо, так же нужно иметь ввиду что программа занимается вводом/выводом в строгом времени и никакого джиттера вообще нет, разумней в начале цикла. Это реализация программы реального времени, с множеством задач. Основная программа в главном цикле не занимается вводом/выводом, она лишь собирает таблицу, а далее по событию от прерывания ввод/вывод, каждую 1 ms.

Добавлено after 21 minute 59 seconds:
[uquote="shonty",url="/forum/viewtopic.php?p=4679330#p4679330"]LDIW удачный макрос. И мнемоника удачная. :dont_know:[/uquote]

У меня подобных удачных макросов несколько десятков, например есть регистры с защитной предустановкой, вот на них есть макросы, для разных процев IF стоит, включая xmega, ну естественно все словные макросы как в вашем случае, так же в макрос передаётся оперативный регистр который можно использовать в данном участке программы, и прочее. Это вы откликнулись на предложение обменяться макросами?))) Так много макросов я у DI Halt _а стащил, потом немножко подправил.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

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

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

Сообщение Starichok51 »

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

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

Сообщение 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
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15570
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Что макрос, что подпрограмма - для подстановки часто встречающихся последовательностей кодов.
Преимущество подпрограмм в экономии ПЗУ, минусы - время на стековые операции при вызове/возврате.
Для макроса оптимально 3, максимум 4 команды или случай, когда стековые операции неудобны(или недопустимы).
В принципе все определяется автором основной программы.
Касательно
shonty писал(а):...
А вот практическое применение первого не совсем понятно :dont_know:
xchrr (xch) - это обмен данными между двумя регистрами регистрового файла.
Можно с MOV - но тогда потребуется три регистра и чуток больше команд
Ранее в системах команд были XCH, XCHD и SWAP - команды тетрадных (двоично-десятичных) манипуляций.
SWAP у АВРок осталась, а вот обмен тетрадами и обмен регистров исчезли (как и ранее часто встречавшаяся DAA - десятичная коррекция после сложения у I8080,Z80,MCS51,MCS48).
Правда на сегодня двоично - десятичный формат практически в счетчиках не используется - все в двоичном считать стараются.
8)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

BOB51 писал(а):это обмен данными между двумя регистрами
я понял, что это "рокировка", только не пойму, где её применить можно :dont_know:

Добавлено after 3 minutes 31 second:
Ещё смысл вот этой записи не понимаю (встречается иногда):
eor R0, R0
есть же clr
Ответить

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