А если серьёзно, для чего nop используют в программе? Понятно, ничего не делать, пропуск командного цикла, задержка. В каких случаях это может понадобиться, пример можно? Если внешнее устройство, порт не поспевает, надо ПП задержки делать, на nop-ах в цикле или таймерах. Но иногда встречались листинги, один-два nop-а и всё. Чего они там задержат?
Как минимум, для подмены команды при ветвлении, для выравнивания, для того, чтобы подождать, пока какая-то одна аппаратная часть догонит другую.
И не стоит забывать, что ассемблер - это по сути не созданный язык программирования какого-то уровня, а набор инструкций процессора, оформленных в виде языка.
Как минимум, для подмены команды при ветвлении, для выравнивания
Можно этот момент прояснить? Какие команды подменять, если одно условие - значит делать то, другое - это. И про выравнивание. Поиск предлагает выравнивание фото.
Условное ветвление имеет разное время исполнения, в зависимости от необходимости этого самого ветвления. Если код продолжает линейное исполнение, то время равно 1 циклу, а если произошел переход, то 2 циклам. Пустые инструкции позволяют выровнять оба варианта и обеспечить отсутствие джиттера временнОй диаграммы на этом участке. Так же пустые инструкции позволяют формировать импульсы определенной длительности ногодрыгом. Обычно так делают при коротких импульсах длительностью в несколько машинных циклов. В 16-разрядной платформе (PIC24/dsPIC) nop-ы применяют для задержек в циклах с RAW-инструкциями. Не путать с RMW. К ним относятся инструкции с автоинкрементными/автодекрементными адресациями.
линейное исполнение, то время равно 1 циклу, а если произошел переход, то 2 циклам. Пустые инструкции позволяют выровнять оба варианта Так же пустые инструкции позволяют формировать импульсы определенной длительности ногодрыгом. Обычно так делают при коротких импульсах длительностью в несколько машинных циклов.
incrementing of Timer0 (TMR0 and Prescaler) will also be inhibited 2 instruction cycles (TCY). So if the prescaler is configured as 2, then after a write to the TMR0 register TMR0 will not increment for 4 Timer0 clocks (Figure 11-3). After that, TMR0 will increment every prescaler number of clocks later.
А если предделитель настроен 1:256, пропуск 512 клоксов? И вообще, не противоречат ли они сами себе: с одной стороны, как они говорят раньше, при записи в TMR0 предделитель сбрасывается, а тут он, оказывается, уже настроен 1:2 и при записи в TMR задержка 4 клокса, и он не сбрасывается, получается. Как бы там ни было, надо, значит, сначала записать TMR, а потом предделитель. И никаких проблем? В смысле пропусков клоксов?
Clock - это единственное число Clocks - множественное. Если употребляете англицизмы, то потрудитесь не писать глупости. Или склоняйте по правилам русского языка, или пишите по английски. А то ваши клоксы звучат гомерически смешно.
https://web.archive.org/web/20080221231 ... c16_11.pdf страничка 6... Речь о 4 циклах при внутреннем тактировании. Собственно предделитель T0 делит с WDT и там конкретно по выбранному МК почитать не помешает. Иногда включая ерраты.
Обнаружил ошибку в предыдущем описании. То сообщение никак удалить не могут.
Придумал способ превращения 8 бит таймера в 16 бит. Основано на динамическом вычислении значения предделителя. Свойства: 1) точность отсчёта - десятки тиков 2) дискретность отсчёта - 1 тик 3) диапазон 64К тактов, как у 16 бит без делителя Минусы: 1) большее время инициализации ...
Код:
Дано: 16бит число 0x4321 Значение предделителя=период : макс разрядность предделителя 1) 4321:FF=43 (округлить до целого) ; FF - макс разрядность предделителя (или 4321 >>8 = 43, надеюсь правильно обозначил сдвиг вправо на 8 разрядов, быстрее, но меньше точность) 2) У результата определить вес старшего единичного разряда 43 -> max^2 = 40 и взять следующий старший вес = 80 (не корите за корявость выражения) Предделитель=0x80
Значение таймера=FF-период : предделитель Кол-во циклов=4321:80=86 (округлить) Значение TMR=FF-86=79, так как он считает от нуля
Итого имеем T=preTMR*TMR 80*86=4300
Ошибка 21 тик, что на единицах и десятках миллисекунд очень даже нечувствительно. Из FF вычитать кол-во циклов, так как таймер считает от нуля.
Всю ветку не читал, но для PIC без регистров LAT в некоторых случаях NOP очень даже может помочь. Вот хорошая статья на тему RMW: https://electrosome.com/read-modify-write-problem-pic/ Когда проблема RMW может возникнуть:
Цитата:
The actual physical state (voltage level) of a pin may be different from the value written to PORT register in certain instances. For example: - When the output pin is connected to high inductance or capacitance loads. - When the output pin is connected to LEDs without current limiting resistors. - When the output pin drives a transistor without base resistor. - When the output pin is shorted to ground.
И возможные варианты решения проблемы:
Цитата:
... How to Solve this problem ? 1. Insert a delay after RB7 = 1 such that sufficient time is provided for the charging of capacitor. ...
Этим "delay" как раз и может стать NOP. Но это, повторюсь, справедливо лишь в некоторых случаях, особенно у начинающих :-D. Нормальная схемотехника позволит не прибегать к таким трюкам, это чисто для теории. У первых PIC была еще история связанная с конвеером, где мог потребоваться NOP: http://www.amber.ssau.ru/download/PIC16_Manual.pdf п.9.10.2. Последовательность операций с портами ввода/вывода
Про подавление дребезга и паразитных скачков на сканируемых входах: как-то говорили, и назывались цифры, что при механических кнопках порядка 20мс, на оптодатчиках вроде меньше, но тоже около единиц миллисекунд. Если память не изменяет. А как быть, если период между импульсами (между нажатиями, можно считать) сам по себе 5мс? Ничего лучше как несколько раз опрашивать входы, сверяя с предыдущим состоянием, я не придумал. Применена пара свето-фотодиод, между ними пролетает шторка из алюминия, обрезанная ножницами вручную. В сканировании участвует от 7 до 10 команд, безошибочный повтор 5 раз - это получается 35-50мкс. Какова надёжность такого способа? Можно, наверное, шторку подточить на строгую перпендикулярность краёв, покрасить поглощающей краской, или и так сойдёт?
А как быть, если период между импульсами (между нажатиями, можно считать) сам по себе 5мс?
Что это за механический датчик с периодом 5 мс? В любом случае, такой "автомобиль" не поедет. Оптодатчики дребезга не имеют, в отличии от механических. Там вопрос решается простым гистерезисом триггера Шмитта или компаратора.
Чему вы удивлячетсь, хоть я и не писал об этом, но контакты прерывателя механические, да, вполне себе работают до 6000-8000тыс. оборотов, а это период 5-3мс у 2Ц/2Т мотора.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения