whale 6 19 августа Опубликовано 19 августа (изменено) · Жалоба Just now, Priest_89 said: время на постройку костылей а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ? Думаю вариант с нопами прокатит. Изменено 19 августа пользователем whale 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 19 августа Опубликовано 19 августа · Жалоба 44 минуты назад, whale сказал: Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ? А чем мой способ не угодил предводителю дворянства? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 69 Понедельник в 16:43 Опубликовано Понедельник в 16:43 · Жалоба 2 hours ago, jcxz said: А чем мой способ не угодил предводителю дворянства? слишком просто и даже переносимо получается. надо сделать что-нибудь вроде void delay(int cycles){ __asm__("add pc, r0"); __asm__("nop"); __asm__("nop"); __asm__("nop"); __asm__("nop"); //... } чтобы потом всё раком встало при "не правильном" переданном значении аргумента функции. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 Понедельник в 16:47 Опубликовано Понедельник в 16:47 · Жалоба А чем мой способ не угодил предводителю дворянства? предводителю уездного дворянства Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 22 Понедельник в 18:17 Опубликовано Понедельник в 18:17 · Жалоба 5 hours ago, whale said: Вижу только один путь - делаем сто нопов подряд и смещаем указатель команд на нужную строку нопов. Весь вопрос как сместить это указатель (счетчик команд) на нужную величину с минимальными потерями, тк смещение от цикла к циклу все время меняется. Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ? Мой преподаватель такое делал. делал он так. внутри функции задержки натравливал указатель на первый ноп. потом инкрементил этот указатель на число нопов в столбце минус нужная задержка. и передавал туда управление. если найду код выложу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 Понедельник в 18:31 Опубликовано Понедельник в 18:31 (изменено) · Жалоба Just now, firstvald said: инкрементил этот указатель на число нопов Вот это и есть самый главный секретный вопрос - как инкрементировать указатель команд на нужное значение в stm32 iar В avr все было просто тут хрен разберешь, перерыл всю доку так и не нашел где в каком секретном регистре содержится этот указатель. Изменено Понедельник в 18:33 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 Понедельник в 19:19 Опубликовано Понедельник в 19:19 (изменено) · Жалоба 1 hour ago, _pv said: надо сделать что-нибудь вроде Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс, при cycles = 0,1 значение сдвига одинаковые (те не сдвигает) также такой эффект повторяется далее через пару цифр - 2,3 4,5 итд те между 1 и 2 сдвиг 3кгц между 2 и 3 сдвиг ноль. между 3 и 4 сдвиг3кгц между 4 и 5 сдвиг ноль. итд может что то с длинной pc связано, в принципе можно сдвиг умножать на два ) void delay(char cycles){ asm("add pc, r0"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); Изменено Понедельник в 19:26 пользователем whale 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Priest_89 8 Понедельник в 19:20 Опубликовано Понедельник в 19:20 · Жалоба 35 minutes ago, whale said: где в каком секретном регистре содержится этот указатель. В регистре PC (R15) (Cortex-M0 Technical Reference Manual, п.3.5) 5 hours ago, whale said: а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ? Решать, безусловно, Вам, но.. Плата - насколько я понял из ваших постов, у Вас макетная версия, которая все равно требует переделки. Серии STM и их клонов полностью или с небольшими оговорками совместимы по пинам. Так что из переделок - 4 перемычки на выходы таймеров, а если повезет - то и их не понадобится. Программа - опять же, рабочая программа на Си переносится без особых проблем, с небольшими изменениями в работе периферии и перенастройкой делителей в таймерах и интерфейсах. В то же время, если оставлять старый контроллер, любая доработка/модификация в будущем приведет к возврату к обсуждаемому геморрою, либо ресурсов не хватит в принципе и опять же придется менять контроллер. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 25 Понедельник в 19:21 Опубликовано Понедельник в 19:21 · Жалоба если так хочется делать ногодрыгами и НОПами, я бы сделал по-другому: создал бы с десяток функций void f1() { asm("nop"); return; } void f2() { asm("nop"); asm("nop"); return; } ... void f10() { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); return; } запихнул бы их адреса в массив указателей на функцию, измерил бы точно сколько они длятся и вызывал бы так, что f10() вызывается в цикле сколько надо раз, а потом управление попадает на одну из тех, что в массиве. Тогда при точном измерении длительности такого извращения можно с точностью до такта настроить такую задержку. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
НЕХ 5 Понедельник в 19:31 Опубликовано Понедельник в 19:31 · Жалоба Может проще приспособить копеечный синтезатор ? Видел, применяется в китайских лазерных рулетках. https://www.compel.ru/infosheet/RUIMENG/MS5351M Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 Понедельник в 20:15 Опубликовано Понедельник в 20:15 · Жалоба А что с прерываниями делать? Насколько независимое управление нужно? Там же трёхфазный таймер, можно по фазе на мост и одна фаза запасная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 69 Понедельник в 20:18 Опубликовано Понедельник в 20:18 · Жалоба 41 minutes ago, whale said: Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс, это clang аргумент в r0 передаёт, и вроде ничего больше не делает, судя по godbolt.org, что именно там делает iar в прологе если фунция не naked объявлена это в листинг смотреть надо. инструкция nop вроде как два байта занимает, и почему при сдвиге на нечётный адрес он вообще в какой-нибудь hard fault не улетает я не очень понимаю. jcxz на первой странице нормальный вариант на С через switch привёл. Да, за компилятором в листинг поглядывать надо, потому что при разных уровнях оптимизации он вероятно может и в цепочку ifов скомпилировать, но такие вещи либо целиком на ассемблере, либо бороться с оптимизатоциями компилятора без каких-либо гарантий. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 Понедельник в 20:20 Опубликовано Понедельник в 20:20 (изменено) · Жалоба Just now, _pv said: switch switch if и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал, единственный рабочий вариант это ваш получился. Если ноп два байта тогда понятно, думаю меньше шаг уже не получить. Изменено Понедельник в 20:23 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 69 Понедельник в 20:25 Опубликовано Понедельник в 20:25 · Жалоба 2 minutes ago, whale said: switch if и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал, листинг в студию. clang для арма из предложенного jcxz свича сам делает ровно такую же последовательность нопов и инкремент pc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 Понедельник в 20:29 Опубликовано Понедельник в 20:29 · Жалоба Just now, _pv said: clang для арма iar видимо делает по другому, поискать надо, может завтра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться