EPROM это было бы конечно удобно чтоб без контроллера делать генераторы на фиксированную частоту.
А так тини13 ставлю для загрузки предварительно рассчитанных регистров.
EPROM это было бы конечно удобно чтоб без контроллера делать генераторы на фиксированную частоту.
А так тини13 ставлю для загрузки предварительно рассчитанных регистров.
Ну вот, регистры программа научилась читать, reg0=0b11110000; вот тут не совсем понятно, у меня si5351a, 4-й бит он только для si5351c, указывает что источник колебаний не соответствует требованиям, а тут в нем должен быть ноль тогда, или оба варианта и они ничего не значат?
Частично умалчивает- приходилось с помощью ClockBuilder генерить разные нетепичные прошивки и расшифровывать неописанные регистры. Так кстати и регистр адреса I2C был вычитан. Предполагалось в одном устройстве использовать две SI5351 на общей шине. Но у двух микросхем были одинаковые адреса. Самое простое оказалось сделать у одной из них отключаемое питание. При этом во второй микросхеме менялся адрес на шине программно, а потом включалось питание первой. Это было проще чем городит мультиплексор на шину.
SoundMaster, как идея: не оставляйте собития (и I2C адреси) непонятными, а организовайте простые эксперименти (части кода), которые дадут необходимую информацию.
Напр. я бы включил к аппаратный I2C напр. EEPROM 24C02 по ее схеме. Буду писать/найду код для сканирования I2C. Буду читать шину и писать код, пока не получу четкий адрес EEPROM-а = 0x50.
Когда это удастся, я буду выключить 24C02 и буду включить Si5351 (с или без конвертер уровня 5V/3,3V по I2C). Сканирование адресов определенно даст адрес чипа (ожидается (7-bit): 0x60, 0x62, в частности: 0x61 и др. 0x61 (Si5351С ИС нет) вариант или другой адрес у меня никогда не был) и не буду спрашивать себя, является ли это реальным I2C адресом моего Si5351, купил ли я подделку с маркета и др. Потом начинаю писать код для чипа с управлением по этому I2C адресу .
(частично использовал переводчика).
Последний раз редактировалось veso74; 29.07.2020 в 15:06.
Мультиплексор ни когда и не городил. Можно использовать любые пины вход/выход для i2c. Успешно использую как аппаратный так и программный i2c. Можно по трём пинам две шины запускать. Общий клок а данные на разных пинах. Тоже работает без проблем. В железе по сути всегда "ногодрыг" по определённой последовательности в итоге и не важно кто и как в программе этот ногодрыг реализует- функция компилятора с библиотеки или по тактово на ассемблере прямое управление.
У меня вопрос, написано что Multisynth может быть 4,6,8 и в интервале от 8+(1/((2^20)-1))) до 900+(1/((2^20)-1))), где (1/((2^20)-1)))=с в формуле (a+(b/c)), то есть c может быть не обязательно (1/((2^20)-1))) а меньше, вплоть до 1, это правильно? или значение c фиксировано и равно только (1/((2^20)-1)))
Не могу найти более подходящей темы для написания. Si5351, управляющий код. Варианты управления давно были сделаны и проанализированы из многих интернет-ресурсов. В связи с небольшой задачей (ATtiny13A -> Si5351A) задумался над следующим случаем:
Feedback divider,: а + (b / c), скорее его знаменатель c [1..1048575]. В процессе расчета, в зависимости от входных данных и выбранной точности расчета, цифры в поле могут быть любыми.
могу обработать:
1. масштабировать знаменатель, пока он не станет меньше 1048575 (0xFFFFF)
2. (частный случай 1) масштабировать знаменатель до другое число (напр. четное, 1000000 и др).
3. сократит знаменатель и числитель до математически максимально возможного, а при необходимости масштабировать дробь
4 ... другое действие?
В некоторых общедоступных кодах (библиотек Si5351) варианты обработки 1 или 2.
Когда есть более чистый спектр? К каким цифрам в обработки мне стремиться (для коеф.c)?
В (3) в некоторых случаях не будет делителя с дробным коэффициентом (на точных частотах, на кратных частоте кварца и т. д.).
Варианты опробованы и применимы (при ресурси в микроконтроллере), проверено на реальных устройств, программный код не так сильно увеличивается, но нет оборудования для учета спектра и паразитных продуктов.
Меня больше интересует теоретическая сторона, практическая - работает .
(частично использую переводчик БГ -> РУ)
---------
случайный пример:
b = 456789
c = 2283945
---
в. 1:
b = 209715
c = 1048575
---
в. 2
b = 200000
c = 1000000
---
в. 3
b = 1
c = 5
Вероятно, для ответа на вопрос без долгих экспериментов и дорогих приборов, нужно знать внутреннюю реализацию pll и ms в сишке. Тогда, быть может, и физика с матстатистикой подскажут.
Скрытый текст
Я тут для тини13 лабу сделал (нашел одну сишку) Освежил в памяти регистры и блок схему. (: В частном случае можно использовать mux между pll и ms и обновлять два регистра, а в общем программировать регистры заново. Но, даже в тини13, как выше уже отмечали, программирование заранее рассчитанными регистрами прекрасно размещается. Лаба может пригодиться тем, кто любит ковыряться с сишкой и микроконтроллером на уровне даташита и инструкций. https://github.com/ozforester/swap2freq
Сейчас у меня включен один выход output_00. Работает в качестве bfo на ssb. Чтобы приемник работал на АМ мне надо выключить выход. Как это сделать? Просто записать 0 в старший бит 16-го регистра, то есть весь регистр будет одни нули, или еще надо записать другие байты в другие регистры? Попробовал один байт, все выключилось и потом записываю 0х80 чтобы обратно включить и не включается
Вот так это делается:
Код:// Si5351 https://github.com/etherkit/Si5351Arduino #include <si5351.h> // v2.1.4 or later int cal_factor = 710; // Calibration factor Si5351. Подбирается на частоте 10.000.000 Гц int freq = 10000000; // Частота на CLK1 // - - - - - - - - - ИНИЦИАЛИЗАЦИЯ - - - - - - - - - - - - - void setup() { // Инициализируем Si5351 si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0); // Actual Lib Etherkit SI5351 v2.1.4 or later // Калибровка. si5351.set_correction(cal_factor * SI5351_FREQ_MULT, SI5351_PLL_INPUT_XO); } // - - - - - - - - - ГЛАВНЫЙ ЦИКЛ - - - - - - - - - - - - - void loop() { // ------------ CLK1: Включение / Выключение BFO по сигналу BFO_On_Off ------------ if (digitalRead(BFO_On_Off) == LOW) { si5351.output_enable(SI5351_CLK1, 1); si5351.set_freq(freq * SI5351_FREQ_MULT, SI5351_CLK1); si5351.drive_strength(SI5351_CLK1, SI5351_DRIVE_8MA); } else { si5351.output_enable(SI5351_CLK1, 0); } }
Последний раз редактировалось IG_58; 04.12.2022 в 18:39.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)