whale 6 16 августа Опубликовано 16 августа (изменено) · Жалоба Есть stm32g070 он управляет независимо двумя полумостами с частотой 500кгц, желательно с произвольным выбором ног, выдает пачки импульсов, реализовано просто дерганьем ног, время между изменениями состояния задается while(FG2--){__NOP();} но при изменении int FG2 на единицу частота сдвигается на 35кгц (при вых 500кгц) что слишком много, хотелось бы шаг хотя бы в 5кгц, есть ли конструкция аналогичная выше но выполняемая в 5-10 раз быстрее ? Тогда можно двигать частоту с меньшим шагом. Изменено 16 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 16 августа Опубликовано 16 августа · Жалоба Цитата есть ли конструкция аналогичная выше но выполняемая в 5-10 раз быстрее Есть. Но нужно перестать надевать трусы через голову и использовать таймеры по назначению. 1 5 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 220 17 августа Опубликовано 17 августа · Жалоба Там только TIM1 умеет полный мост, и на любые выводы он это не умеет, поэтому прямой код на каждую пачку каждой частоты и каждой группы выводов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 17 августа Опубликовано 17 августа (изменено) · Жалоба Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной, те FG = 0....250 goto FG; 1: nop 2: nop 3: nop итд тогда будет шаг = nop+переход и автоматом приращиваться с увеличением FG в этом случае не потребуется сравнений но возможно потребуется сложение Изменено 17 августа пользователем whale 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 17 августа Опубликовано 17 августа · Жалоба 16 минут назад, whale сказал: Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной, . . . . Не скажу за STM32, ищите по ключам "вычисляемый переход", "операции с программным счетчиком PC". Хотя это скорее для ASM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 17 августа Опубликовано 17 августа · Жалоба Just now, k155la3 said: для ASM Для asm для avr я знаю asm + stm не успел изучить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 17 августа Опубликовано 17 августа · Жалоба В 18.08.2024 в 01:07, whale сказал: Для asm для avr я знаю asm + stm не успел изучить. Зачем? Написать программу на си, потом откомпилировать её, получить asm. Исправить в си нужные места заменив их кодом asm. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 17 августа Опубликовано 17 августа (изменено) · Жалоба Уточню, нужна программа которая делает задержку на столько тактов, сколько записано в переменной char, в идеале, в реале с минимальными доп. тактами. Изменено 17 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 августа Опубликовано 18 августа · Жалоба 6 часов назад, whale сказал: Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной, А если хоть слегка подумать? switch (i) { case N: asm(" NOP"); case N-1: asm(" NOP"); ... case 3: asm(" NOP"); case 2: asm(" NOP"); case 1: asm(" NOP"); case 0: asm(" NOP"); } При достаточно большой величине N должен получиться как раз ваш "вычисляемый переход". Но делать это на си, а не на асм - это играть в рулетку. Уж не говоря о том, что продолжаете упорно надевать трусы через голову. С таким подходом никогда не научитесь создавать что-то стоящее на микроконтроллерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 18 августа Опубликовано 18 августа · Жалоба А массив указателей на ф-ции - разве не вариант "вычисляемого перехода"? И я чет не понял, зачем столько NOP-ов в таблице? Они ж ничем не отличаются. Это чето похоже на индусский код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 220 18 августа Опубликовано 18 августа · Жалоба 7 часов назад, whale сказал: нужна программа которая делает задержку на столько тактов Не нужна. Вам сказали, как такое делается — собираете в ОЗУ нужный линейный код, т.е. без ветвлений, под требуемую частоту и требуемые выводы МК, и по стробу с таймера, также ожидаемого выравнивающим кодом, переходите на него, иначе этот свой ультразвук при таком жабоудушении никак не сделаете, и ещё надо уточнить, имеет ли ОЗУ в STM32 приоритет перед шиной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 18 августа Опубликовано 18 августа · Жалоба 9 часов назад, Plain сказал: собираете в ОЗУ Если под каждые 256 частоты делать отдельную таблицу никакой озу не хватит. Я уже говорил, лучше сделать вычисляемой переход, при этом будет одна максимальная задержка из nop из которой выбирается нужная часть, если делать это по тупому через сравнение и goto то выигрыша не будет, тут надо более тонко, сразу прибавить к текущему счетчику команд нужное значение например. 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 44 18 августа Опубликовано 18 августа · Жалоба 13 hours ago, whale said: Как сделать в IAR чтобы переход скажем goto был с приращением по заданной переменной, те FG = 0....250 goto FG; Причём тут IAR? Язык С++ позволяет очень просто делать такое. Есть таблица вызовов методов класса: //////////////////////////////////////////////////////////////////////////////// void( *const SysCall[ 256 ] )( PLC_F446* ) { //-------------------------------------------------------------------------- // Системные вызовы, относящиеся к работе непосредственно ПЛК. &unsupportedSysCall, // 0 &sc_PLC_D2X, // 1 &sc_PLC_Y2D, // 2 &sc_PLC_STORE_EXTR_PARAMS, // 3 &unsupportedSysCall, // 4 &unsupportedSysCall, // 5 ...... Вот так вызывается метод по его индексу: bool PLC_F446::rtsyscall( void ) { bool result = false; if( ( unsigned )extr_params.sc < ( sizeof( SysCall ) / sizeof( SysCall[ 0 ] ) ) ) { ( *SysCall[ extr_params.sc ] )( this ); result = true; } return( result ); } Поменяйте сигнатуру ( *SysCall[ extr_params.sc ] )( this ), передавая ил не передавая ему то, что ему нужно или не нужно, и оформите его как обычную функцию. Привязываться к тактам МК очень плохая идея. Используйте периферию, ибо сама архитектура ARM такого не предполагает из-за всяких там кэшей, шин, FIFO и тому подобных штучек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 24 18 августа Опубликовано 18 августа · Жалоба On 8/16/2024 at 9:51 PM, whale said: он управляет независимо двумя полумостами с частотой 500кгц, желательно с произвольным выбором ног, Может быть тогда перекладывать данные в регистры GPIO через DMA по событию таймера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
majorka65 1 18 августа Опубликовано 18 августа · Жалоба Фазосдвигающий или противофазный мост? И зачем произвольный выбор ног? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться