Вопросы начинающих PIC ASM

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Так из W можно только вычитать единицу, большее число никак?
Это всё конечно хорошо, а секретной команды деления на ноль нигде не описано? :-)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4812
Зарегистрирован: Вс сен 17, 2017 17:44:21
Откуда: 51.7727, 55.0988. Высота над морем 107 м. До границы 161 км.

Сообщение Steppe »

[uquote="BOB51",url="/forum/viewtopic.php?p=4598793#p4598793"]https://web.archive.org/web/20080221231 ... /mpasm.pdf
https://web.archive.org/web/20080221231 ... C16_29.pdf
:sleep:[/uquote]
Не осилит он.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="yor",url="/forum/viewtopic.php?p=4598918#p4598918"]Так из W можно только вычитать единицу, большее число никак?
Это всё конечно хорошо, а секретной команды деления на ноль нигде не описано? :-)[/uquote]
А кто мешает математику вычитания отрицательного числа из положительного
заменить на сложение положительного числа с отрицательным?
Единственно что для однобайтовых ограничение диапазона от +127 до -127...
У стандартных среднемладших команд поддержки умножения/деления нету.
За исключением общего для практически всех МК умножения/деления на 2 (и степени двойки) сдвигами влево/вправо.
8)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

[uquote="yor",url="/forum/viewtopic.php?p=4598918#p4598918"]... а секретной команды деления на ноль нигде не описано? :-)[/uquote]
есть много всяких секретных команд ... для деления на ноль используют команду nop
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Или halt? То есть reset
Реклама
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

[uquote="yor",url="/forum/viewtopic.php?p=4599036#p4599036"]Или halt? То есть reset[/uquote]
Жесть... Не в коня корм.
Реклама
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

А если серьёзно, для чего nop используют в программе? Понятно, ничего не делать, пропуск командного цикла, задержка. В каких случаях это может понадобиться, пример можно? Если внешнее устройство, порт не поспевает, надо ПП задержки делать, на nop-ах в цикле или таймерах. Но иногда встречались листинги, один-два nop-а и всё. Чего они там задержат?
Поставщик валерьянки для Кота
Сообщения: 1988
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Действительно в немногих случаях встречал, ниже: NOP напр. в start/stop I2c, чтобы условие было выполнено.

- требование из документации I2c

Изображение

- эксперименты со HW Fast-mode plus I2c в PIC18F06Q40, измеренные данные от логического анализатора

.lst файл:

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

..   i2c_start();
*
00052:  BSF    4C8.1
00054:  NOP   
00056:  BSF    4C8.0
00058:  BRA    005A
0005A:  BCF    4C0.1
0005C:  BCF    4C8.1
0005E:  NOP   
00060:  BCF    4C0.0
00062:  BCF    4C8.0
Изображение
Контактная информация:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="Martian",url="/forum/viewtopic.php?p=4599207#p4599207"]Как минимум, для подмены команды при ветвлении, для выравнивания[/uquote]Можно этот момент прояснить? Какие команды подменять, если одно условие - значит делать то, другое - это. И про выравнивание. Поиск предлагает выравнивание фото.

А кстати, в проблеме RMW NOP может помочь?
Друг Кота
Аватара пользователя
Сообщения: 26015
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4599221#p4599221"]И про выравнивание.[/uquote]
Условное ветвление имеет разное время исполнения, в зависимости от необходимости этого самого ветвления. Если код продолжает линейное исполнение, то время равно 1 циклу, а если произошел переход, то 2 циклам. Пустые инструкции позволяют выровнять оба варианта и обеспечить отсутствие джиттера временнОй диаграммы на этом участке.
Так же пустые инструкции позволяют формировать импульсы определенной длительности ногодрыгом. Обычно так делают при коротких импульсах длительностью в несколько машинных циклов.
В 16-разрядной платформе (PIC24/dsPIC) nop-ы применяют для задержек в циклах с RAW-инструкциями. Не путать с RMW.
К ним относятся инструкции с автоинкрементными/автодекрементными адресациями.
[uquote="yor",url="/forum/viewtopic.php?p=4599221#p4599221"]А кстати, в проблеме RMW NOP может помочь?[/uquote] Нет.
Последний раз редактировалось КРАМ Сб июл 06, 2024 11:33:18, всего редактировалось 1 раз.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4599226#p4599226"]линейное исполнение, то время равно 1 циклу, а если произошел переход, то 2 циклам. Пустые инструкции позволяют выровнять оба варианта
Так же пустые инструкции позволяют формировать импульсы определенной длительности ногодрыгом. Обычно так делают при коротких импульсах длительностью в несколько машинных циклов.[/uquote]
Логично.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

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

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, а потом предделитель. И никаких проблем? В смысле пропусков клоксов?
Друг Кота
Аватара пользователя
Сообщения: 26015
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Clock - это единственное число
Clocks - множественное.
Если употребляете англицизмы, то потрудитесь не писать глупости.
Или склоняйте по правилам русского языка, или пишите по английски.
А то ваши клоксы звучат гомерически смешно.
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

https://web.archive.org/web/20080221231 ... c16_11.pdf
страничка 6...
Речь о 4 циклах при внутреннем тактировании.
Собственно предделитель T0 делит с WDT и там конкретно по выбранному МК почитать не помешает. Иногда включая ерраты.
8)
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4600526#p4600526"]А то ваши клоксы звучат гомерически смешно.[/uquote]Смех продлевает жизнь! НО Вам, по-моему, не смешно)) Это грустно
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Обнаружил ошибку в предыдущем описании. То сообщение никак удалить не могут.

Придумал способ превращения 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 вычитать кол-во циклов, так как таймер считает от нуля.
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4599226#p4599226"]...[uquote="yor",url="/forum/viewtopic.php?p=4599221#p4599221"]А кстати, в проблеме RMW NOP может помочь?[/uquote] Нет.[/uquote]
Всю ветку не читал, но для 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. Последовательность операций с портами ввода/вывода
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Про подавление дребезга и паразитных скачков на сканируемых входах: как-то говорили, и назывались цифры, что при механических кнопках порядка 20мс, на оптодатчиках вроде меньше, но тоже около единиц миллисекунд. Если память не изменяет. А как быть, если период между импульсами (между нажатиями, можно считать) сам по себе 5мс?
Ничего лучше как несколько раз опрашивать входы, сверяя с предыдущим состоянием, я не придумал.
Применена пара свето-фотодиод, между ними пролетает шторка из алюминия, обрезанная ножницами вручную. В сканировании участвует от 7 до 10 команд, безошибочный повтор 5 раз - это получается 35-50мкс. Какова надёжность такого способа?
Можно, наверное, шторку подточить на строгую перпендикулярность краёв, покрасить поглощающей краской, или и так сойдёт?
Друг Кота
Аватара пользователя
Сообщения: 26015
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4601467#p4601467"]А как быть, если период между импульсами (между нажатиями, можно считать) сам по себе 5мс?[/uquote]
Что это за механический датчик с периодом 5 мс? :facepalm:
В любом случае, такой "автомобиль" не поедет.
Оптодатчики дребезга не имеют, в отличии от механических. Там вопрос решается простым гистерезисом триггера Шмитта или компаратора.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4601494#p4601494"]Что это за механический датчик с периодом 5 мс?[/uquote]Где я такое написал? Внимательнее читайте сообщения))

[uquote="КРАМ",url="/forum/viewtopic.php?p=4601494#p4601494"]Оптодатчики дребезга не имеют, в отличии от механических.[/uquote]На криво обрезанной шторке, да при отражениях от неё, могут быть явления, подобные дребезгу. Назовём их "паразитными срабатываниями".
Ответить

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