В прошлом IDE выпускал тот, кто и сам МК разрабатывал. На сегодня это уже таки прошлое... Способов отладки программ также достаточно много. Наиболее достоверные дает симулятор и отладочный макет (плюс различные варианты внутрисхемной отладки). Остальное зависит от привычек, возможностей и целей. Если прерывание не требует немедленной обработки, то есть большая вероятность того, что его использование в программе вообще не требуется.
Симулятор нужен для тонкой пошаговой отладки алгоритмов. Собственно это аппаратных периферийных модулей редко касается, а вот всяко-разных переходов и фокусов с циклами/адресами и условиями достаточно часто требуется.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
а попробуй запрети всем и каждому! я вот в своем проекте в прерывании от INT0 делаю задержку, чтобы "поглотить" дребезг кнопки. даже с огромным запасом - 40 мс.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Помимо прерываний есть еще "базовая сетка частот" с установкой флагов по отработке определенных интервалов времени и исполнению соответствующих этим флагам обработчиков в основном цикле программы.
А мне не надо в прерывании антидребезгом заниматься, у меня прерывание программу с начала запускает - 1 ms. А вот в в этой программе антидребезг и происходит, причём настраивается на каждый вход индивидуально, с дискретой 1 ms, хватает от 10 до 40 одинаковых результатов на входе и создаётся событие "Нажато", "отжато", "удерживается", и "двойной клик", этого хватает для любых входов общего назначения или кнопок, Так что у меня прерывание очень скоротечно, и не делает ничего кроме событий, которые и флаги то не меняют и ничего в стеке сохранять не нужно, для прерываний даже специально пару регистров зарезервировано. Себе я запретил ))
В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, вот и считай себе, если не дошло значит отпускай, пусть проц другими делами займётся.
Не разделяю мнение тех кто говорит что надо вручную смотреть адреса переходов, я всё по меткам делаю. У меня даже в макро адреса переходов передаются как метки.
Добавлено after 2 minutes 54 seconds: А вот интересно конечно же было бы если не пожадничали и выложили все свои макро ))) Это только теоретически, не призываю )))
В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, ...
Не факт, что основной цикл может иметь строго фиксированную длительность, скорее наоборот. А вот вариант сетки частот на основе прерываний от таймера, тактируемого системным генератором довольно удобная штука - интервалы всегда точно выдержаны будут. Да и программных таймеров с контрольными флагами можно сколь угодно добавить. Что касается макросов... У каждой программы могут быть свои. Не забываем, что макрос не подпрограмма - каждый раз развертывается в набор соответствующих кодов при упоминании. Из реально удачных разве что дополнения к системе команд... Спойлер
Код:
; .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 ;
В основном цикле очень удобно временные задержки делать, ведь известно что следующий раз программа здесь будет через 1 ms, ...
Не факт, что основной цикл может иметь строго фиксированную длительность, скорее наоборот.
Можно временные коды в начале цикла ставить, тогда джиттер будет совсем незначительный, но это большая натяжка, обычно не нужно точность больше чем 1 ms, это время для обработки всей программы, в тысячи задач, и точней не надо, так же нужно иметь ввиду что программа занимается вводом/выводом в строгом времени и никакого джиттера вообще нет, разумней в начале цикла. Это реализация программы реального времени, с множеством задач. Основная программа в главном цикле не занимается вводом/выводом, она лишь собирает таблицу, а далее по событию от прерывания ввод/вывод, каждую 1 ms.
У меня подобных удачных макросов несколько десятков, например есть регистры с защитной предустановкой, вот на них есть макросы, для разных процев IF стоит, включая xmega, ну естественно все словные макросы как в вашем случае, так же в макрос передаётся оперативный регистр который можно использовать в данном участке программы, и прочее. Это вы откликнулись на предложение обменяться макросами?))) Так много макросов я у DI Halt _а стащил, потом немножко подправил.
Это вы откликнулись на предложение обменяться макросами?)))
Нет)) У меня только один стабильный макрос, это задержка. Выкладывать не буду, точно критика будет Остальные больше ситуационные и привязанные к конкретным задачам, например к драйверам периферии.. + в них могут использоваться ситуационные дефы регистров/портов и т.п..
Вячеслав М. писал(а):
Так много макросов я у DI Halt _а
Однажды, начитавшись DI_Halt-а, я увлёкся макросами. Но потом осознал, что во первых мне теперь нужно учить "язык своих макросов", а во вторых макросы абстрагируют от процессов и железа.. Тогда проще на ЯВУ перейти, чем активно макросы использовать..))
Мне конечно не жалко, но это точно никому не нужно. Тем более там ещё и смещение адреса *2-2 Для примера: Спойлер
Ну на самом деле.. деталей много, но если по сути: Нужно расположить в массиве 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
Что макрос, что подпрограмма - для подстановки часто встречающихся последовательностей кодов. Преимущество подпрограмм в экономии ПЗУ, минусы - время на стековые операции при вызове/возврате. Для макроса оптимально 3, максимум 4 команды или случай, когда стековые операции неудобны(или недопустимы). В принципе все определяется автором основной программы. Касательно
shonty писал(а):
... А вот практическое применение первого не совсем понятно
xchrr (xch) - это обмен данными между двумя регистрами регистрового файла. Можно с MOV - но тогда потребуется три регистра и чуток больше команд Ранее в системах команд были XCH, XCHD и SWAP - команды тетрадных (двоично-десятичных) манипуляций. SWAP у АВРок осталась, а вот обмен тетрадами и обмен регистров исчезли (как и ранее часто встречавшаяся DAA - десятичная коррекция после сложения у I8080,Z80,MCS51,MCS48). Правда на сегодня двоично - десятичный формат практически в счетчиках не используется - все в двоичном считать стараются.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения