Отображение значения частоты на SSD1306

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Рекомендуется оформить сообщение в соответствии с правилами раздела
Здравствуйте Форум!

Собрал синтезатор частоты с одной не перестраиваемой( фиксированной) частотой 100 МГц. Использовал: Ардуино Нано, Si5351 и дисплей OLED SSD1306. Написал скетч, нормально выдает частоту, желаемый выходной уровень сигнала, коррекция частоты. Но я не знаю как прописать в скетче запрос на считывание частоты для отображения ее на дисплее. Библиотеки все в скетче присутствуют, включая дисплей. В setup прописана инициализация дисплея, параметры шрифта, отображается заголовок в дисплее. Но вот откуда дисплею брать информацию о значении частоты я не знаю. Я не программист. Если кто знает, подскажите пожалуйста. Спасибо.
 

poty

★★★★★★✩
19 Фев 2020
3,226
939
Не очень понятно, что хотите сделать? Если используется одна частота, то зачем её считывать откуда-то?
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Написал скетч, нормально выдает частоту,
откуда дисплею брать информацию о значении частоты я не знаю. Я не программист.
Вот эти две фразы никак не стыкуются друг с другом. Если вы не программист - как писали скетч? Может ничего не писали, а просто нашли готовый в инете? А если сами написали управление частотой - то странно что вы не понимаете, как извлечь ее значение для дисплея...
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Готовый шаблон я взял от "Si5351 example" и скорректировал его убрав вторую частоту и добавил скетч и библиотеки для SSD1306, прописал уровень сигнала и коррекцию частоты. На счет программиста. Не так уж трудно это было. Но вот с отображением частоты я не знаю как это сделать

Не знаю правильно ли я задал вопрос. Мне нужно отображать значение установленной в синтезаторе частоты на дисплее SSD1306.
 

poty

★★★★★★✩
19 Фев 2020
3,226
939
Так Вы же эту частоту и устанавливали. Зачем её откуда-то считывать? Она хранится у Вас в переменной, константе, структуре...
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
есть много примеров для разных датчиков где переменная снимается с конкретно указанного на датчике пине и все эти датчики имеют отдельно еще SDA иSCL. Здесь все понятно. Плата Si5351имеет только питание 2 пина и SDA, SCL. И это все.

Pins 0, 1 , 2 - это высокочастотные выходы синтезаторов, далее Pins SCL, SDA, Ground, Vin. Pins 0, 1, 2 никуда не подключаются, используются как контрольные точки. ВЧ выходы CLK0, CLK1, CLK2.
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,226
939
@evg23, звучит странно... Если уж до такой степени не владеете программированием, то как вообще заставили работать чип?
Для того, чтобы настроить нужную частоту Вы же записывали значение некоторой переменной или константы в "плату"? Вот и выводите эту переменную или константу на экран: любое чтение данных датчика - это две операции: 1) получение данных по протоколу датчика и запись этих данных в переменную, 2) использование переменной (для расчёта, вывода....). Так как датчика у Вас нет, то первый пункт просто пропускаете, переменная у Вас уже заполнена.
В принципе, и прочитать значение регистра, наверное, можно. Только зачем?
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Если я предоставлю вам файл скетча, вы сможете его отредактировать?
 

poty

★★★★★★✩
19 Фев 2020
3,226
939
@evg23, думаю, тут лучше желающие поучиться помогут. Вы только поточнее запрос сформулируйте.
Ну, если уж совсем никого не найдёте - кидайте.
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
только два собеседника на сегодня, а воз и ныне там, как говориться
 

poty

★★★★★★✩
19 Фев 2020
3,226
939
Ну а что Вы хотели? Вопрос "ни о чём", дописать пару строчек в скетч - мало кому интересно, это не программирование даже, а так, помощь безвозмездная.
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Сбрасываю скетч. В самом низу, где прописуются установки дисплея display.print(??????); я поставил знак вопроса, т.к. не знаю что там вписать. Конечно можно написать там в кавычках 150000000 и будет выводиться это число, но мне нужно чтоб на дисплей выводилось переменная которая где то там записано как значение частоты. Спасибо.
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,226
939
@evg23, вот честно, скетч - это тестовый пример, идущий к библиотеке (ну, или близко к нему). Там нет никакой настройки частоты, управления коррекцией и т.п. Берётся правильное значение нужной частоты (в виде константы), опорной частоты (снова в виде константы) и вызывается функция библиотеки для настройки. Т.е., для этого случая
написать там в кавычках 150000000 и будет выводиться это число
- самый правильный вариант. Извиняюсь, что огорчил.
Библиотека не позволяет получить нужную частоту из чипа, но это можно сделать вручную (есть метод si5351_read()). Только зачем? В функции loop у Вас есть полный отчёт о том, работает ли чип на установленной частоте или нет. Какой смысл заново считывать установленное двумя строчками ранее значение?

Я также несколько озадачен тем, что вначале монитор используется на 57600 бод, а потом, через полсекунды - переключается на 9600. Это что - так задумано?
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
То что чип выдает правильную частоту я проверял дополнительно анализатором спектра, но мне нужно чтоб частота визуально выводилась на дисплей и то что выводится на дисплей не задавалось мною вручную как display.print("150000000") а вызывалось какой то командой, не знаю какой.

Согласен я не программист

Вот пример рабочего скетча для случая ручной перестройки частоты с помощью энкодера. Я проверял, работает отлично, частота и ее показания на дисплее изменяются, но мне не нужно изменять частоту и применять энкодер, плюс тонна скетча. Замечу что в этом скетче нет никаких display.print(" ") и все отображается на дисплее корректно. Мой случай проще, фиксированная частота и все.
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,226
939
мне нужно чтоб частота визуально выводилась на дисплей и то что выводится на дисплей не задавалось мною вручную как display.print("150000000") а вызывалось какой то командой
Хорошо, задайте эту свою константу в #define, const переменной, обычной переменой наконец и выводите эту переменную. Ничего ж не поменяется в скетче, кроме добавления одной строки - объявить переменную и присвоить ей нужное значение, и замены всех 15000000000 на эту переменную. Только по хорошему надо бы согласовать её со вторым параметром
si5351.set_freq_manual(15000000000ULL, 60000000000ULL, SI5351_CLK2);
так как они связаны вполне жёсткими рамками. То есть, для изменения частоты придётся менять ДВА параметра, а не один. Вот, во втором скетче именно так и сделано:
C++:
volatile uint32_t bfo_f =  900000000ULL / SI5351_FREQ_MULT;   // CLK0 start IF
volatile uint32_t vfo_t = 1420000000ULL / SI5351_FREQ_MULT;   // CLK2 start Tx freq
volatile uint32_t vfo_r = vfo_t - bfo_f;                      // CLK1 start Rx freq
volatile uint32_t vfo_s = vfo_t;                              // Saved for RIT
Замечу что в этом скетче нет никаких display.print(" ") и все отображается на дисплее корректно.
Уверены?
C++:
void display_frequency()
{
  char LCDstr[10];
  char Hertz[7];
  int p,q = 0;
  unsigned long freq;
  display.clearDisplay();

  switch(act_clk)
  {
    case 0:                               // Tx frequency
      freq = vfo_t;
      break;
    case 1:                               // Tx frequency (Used in RIT Mode)
      freq = vfo_t;
      break;
    case 2:                               // MF frequency
      freq = bfo_f;
      break;
  }
   
  Hertz[1]='\0';                           // empty array

  sprintf(LCDstr, "%ld", freq);           // convert freq to string
  p=strlen(LCDstr);                       // determine length
  display.setCursor(100,16);
  display.setTextSize(1);
  if (p>6){                               // MHz
    display.print(F("MHz"));
    q=p-6;
    strcpy(Hertz,LCDstr);                 // get Herz digits (6)
    strcpy(LCDstr+q,Hertz+(q-1));         // copy into LCDstr and add to MHz
    LCDstr[q]='.';                        // decimal point
  }
  else {                                  // KHz
    display.print(F("KHz"));
    q=p-3;
    strcpy(Hertz,LCDstr);                 // get Herz digits (3)
    strcpy(LCDstr+q,Hertz+(q-1));         // copy into LCDstr and add to KHz
    LCDstr[q]='.';                        // decimal point
  }

  switch (p)
  {
    case 5:                               //  10 KHZ
      display.setCursor(36,0);
      break;
    case 6:                               // 100 KHZ
      display.setCursor(24,0);
      break;
    case 7:                               //   1 MHZ
      display.setCursor(12,0);
      break;
    case 8:                               //  10 MHZ
      display.setCursor(0,0);
      break;
    case 9:                               // 100 MHZ
      display.setCursor(0,0);
      break;
  }
   
  display.setTextSize(2);
  display.println(LCDstr);
  display_settings();
}
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Я делал так: #define AFREQ 100000000 и #define BFREQ 150000000, а для дисплея display.print(AFREQ) и display.print(BFREQ). Но это тупо.
 

poty

★★★★★★✩
19 Фев 2020
3,226
939
@evg23, в приведённом скетче (втором) - тоже самое, только "причёсано" - выводится в Гц, кГц, МГц.
По поводу "тупо": тут весь вопрос в необходимости вывода этих данных, этот вопрос Вам задают с самого начала. Я бы, например, выводил информацию о достижении этой частоты (или сбоях) - эта инфа осмысленная и динамическая.
 
Изменено:

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
"Я бы, например, выводил информацию о достижении этой частоты (или сбоях) - эта инфа осмысленная и динамическая." ВОТ ИМЕННО ЭТО МНЕ И НУЖНО. Потому как написать в print можно что угодно. Мне нужно знать что на самом деле происходит с синтезатором частоты в данный момент. Это моя цель в индикации частоты. Т.е. если индикатор показывает 150000000 то это действительно выходная частота которую выдает синтезатор на данный момент, плюс то что Вы предложили "информацию о достижении этой частоты (или сбоях)" было очень полезно видеть на дисплее. Я уже пробовал чтоб Ардуино обмерял частоту синтезатора и выдавал значение частоты на дисплей, но увы максимальную частоту которую может померять Ардуино что то около 5MHz а то и меньше. Лучше всего до 1MHz меряет без проблем и не надо заморачиваться со скетчами. Но мне нужно мерять 150MHz. Хоть частотомер делать и пристегивать его к Ардуино с дисплеем.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,226
939

@evg23, мда... Посмотрите на информацию из loop, там как раз оно и есть.
 

evg23

✩✩✩✩✩✩✩
18 Июн 2023
12
0
Если бы я что то понимал в этой loop, нужно учиться.
 

poty

★★★★★★✩
19 Фев 2020
3,226
939

@evg23, в описании библиотеки на гите есть описание применения, в том числе - описание примеров. Там подробно расписано что за цифры выводятся.