Перейти к содержанию
    

adnega

Свой
  • Постов

    3 587
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент adnega


  1. А какие именно делители не понятны? /M=8 это делитель перед PLL2S. он у вас тоже 8. PLL2SN - это *N в блоке PLL2S - у вас x197, а должен быть x384. PLL2SR - это /R в блоке PLL2S - у вас /2, а должен быть /5. Таким образом частота I2S у вас будет не 98.5МГц, а 76.8МГц. Затем в настройках I2S нужно задать делитель 100, но в регистрах он разбит на две части - см. описание I2SPR Поскольку передаются два канала, то делитель I2S должен быть не 100 (как я указал выше), а 50=25*2+0.
  2. Попробовал размотать код от jcxz: получается полином 6-ой степени (для ряда Тейлора странные коэффициенты), причем A0 != 0 поэтому sin(0) будет != 0. Что!?
  3. Я, думаю, так может быть: sin(T + t) = sin(T) * cos(t) + cos(T) * sin(t) T - табличные значения, t - отклонение от табличного значения. sin(t) = t - t^3/3! + t^5/5! - ... = (((1/5!)t^2 - 1/3!)t^2 + 1)t cos(t) = 1 - t^2/2! + t^4/6! - ... = ((1/6!)*t^2 - 1/2!)t^2 + 1 Как у jcxz сделано самому интересно.
  4. Только если в начале каждого стимула обнулять расчеты.
  5. Неа, нужно будет многократно рассчитывать значения - может и погрешность набежать.
  6. Кста, все может получиться и на 8МГц кварце: - /M = /8 - PLL2SN = x384 - PLL2SR = 5 - I2SPR_I2SDIV = 50 - I2SPR_ODD = 0 8M / 8 * 384 / 5 / 50 / 2 = 48k * 16 Обращаю внимание, что предделитель I2S не обязан быть степенью двойки (как у SPI, например)
  7. Если генераторы независимые, то смысла нет. А если генератор общий, то проблем с синхронизацией будет меньше. Кста, если частоту I2S сделать равной степени двойки (например, 65536), то и с делениями полегчает.
  8. Раз уж мы про округления, то f_ton = 8000 f_smpl = 46875 def divRound(a, b): return ((a + b // 2) // b) p1 = 0 p2 = 0 for i in range(f_smpl): p1 += divRound(f_ton << 32, f_smpl) p1 &= 0xFFFFFFFF; p2 += f_ton if p2 > f_smpl: p2 -= f_smpl p3 = (p2 << 32) // f_smpl p3 &= 0xFFFFFFFF print(i, p1, p3, p1 - p3) p3 дает нулевую фазовую ошибку через f_smpl семплов, а p1 дает ошибку 1.63E-6. warn{это Python, поэтому // - это не комментарий, а целочисленное деление}
  9. ((10) + ((1) / 2) / 1 = (10 + 1 / 2) / 1 = (10 + 0) / 1 = 10
  10. Фазу можно точнее накапливать (например, алгоритм Брезенхема), но будет небольшой фазовый шумок. У jcxz без фазового шума, но с небольшим отклонением по частоте (где-то в 6 знаке после запятой 8000.0000016298145 Гц).
  11. Ряд Тейлора? Т.е. иметь заранее вычисленные значения синуса, а рядом Тейлора достраивать промежуточные значения? Я примерно о том же и говорю: для ускорения можно в добавок к таблицам значений синуса в конкретных точках, хранить значения коэффициентов ряда Тейлора для данной точки. Затем берем дельту, дельту в кубе, в пятой и т.д. и делам свертку?
  12. Сигнал заранее известен, можно настроить DMA в кольцевом режиме и готовить половинки заранее - FPU в помощь.
  13. ТС, видимо, не хочет заниматься арифметикой, а хочет использовать константный массив.
  14. Сконвертировать можно sof->rbf можно при помощи Convert Programming File (есть в меню File проекта). Внизу нужно будет нажать Add File и добавить ваш sof. Либо установить соответствующую галочку в настройках проекта.
  15. Нормальное желание. Только грузить лучше не по JTAG, а через PS (Passive Serial). Примерно так: - дергаете nCONFIG на GND; - CONF_DONE падает вниз; - затем через DCLK и DATA0 подаете битовый поток (из .rbf, но там биты в байте обращены); - получаете на CONF_DONE единицу. Многое зависит от объема прошивки (кста, поддерживается сжатие), у меня при DCLK порядка 20 МГц получилось чуть более 20 мс. Это как раз EP2: ep2_data.rbf ep2_ps.dsl Для второго циклона: https://www.intel.in/content/dam/www/programmable/us/en/pdfs/literature/hb/cyc2/cyc2_cii51013.pdf Пример main.c
  16. Насчет цен все сложно, а документацию можно тут подсмотреть.
  17. Все реально. Если код не модифицирующийся - тогда совсем легко. Когда вы укажите функции секцию, то она скомпилируется с адресами из ОЗУ, но копия будет лежать во flash. Стартап на этапе инициализации секций должен скопировать образ из flash в ОЗУ. Все! - функцию/обработчик можно вызывать.
  18. Перенести можно только всю таблицу целиком. Но можно и не переносить: вектора во flash, обработчик прерывания в ОЗУ.
  19. Просто объявляете регион памяти для ITCRAM, а затем в атрибутах функции указываете этот регион. Примерно так (функция в ОЗУ): int ram_func(const int x, const int y) __attribute__(( section(".ramfunc") )); В скрипте линкера: .data : AT ( _sidata ) { . = ALIGN(4); _sdata = .; *(.data) *(.data.*) *(.ramfunc) . = ALIGN(4); _edata = . ; } >RAM
  20. При помощи mega328p и прошивки jtag2updi у меня все заработало. Даже собрал прошивку под китайскую LGT8F - заработал UPDI. А вот usbasp так и не смог заставить работать. Был бы кварц на 16МГц - возможно помогло, а вот ни на 12МГц, ни на 8МГц usbasp (с прошивкой jtag2updi) даже не определяется.
  21. Ок. Как получится - отпишусь
  22. Я добавил внешний bat-файл Интерфейс программирования на стороне микроконтроллера, самый новый.
  23. Видимо, avrdude нужно подкинуть конфиг.
  24. Да, я тоже посмотрел что нет 816-го в списке. Вот интересная статейка. У меня есть мега4809, она, вроде, тоже UPDI, но позаниматься смогу только на выходных.
  25. Иногда целевой микроконтроллер не определяется - сбрасываю скорость интерфейса Может, китайский уже свежей прошивкой прошит, но своему старичку я прошивку обновлял.
×
×
  • Создать...