Синтезатор на SI5351 и дисплей от Mоторола C115
-
- Сообщения: 90
- Зарегистрирован: 18 апр 2021, 17:06
- Позывной: greck
- Город: Стрежевой
- Имя: Андрей
- Поблагодарили: 4 раза
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение greck » 30 окт 2021, 04:40
Всем доброго времени суток.
В общем за основу была взята конструкция синтезатора-генератора с LCD Так как полностью программирование я изучал только ассемблер а вот с сишными языками знаком только поверхностно.
У меня получилось изменить прошивку, а то есть дисплей поставить от моторолы.
Связь дисплея как и сишки по i2c, включаю всё работает но если повернуть валкодер по часовой стрелке то сразу происходит зависание программы и не реагирует на кнопку и валкодер хотя при этом частота с сишки соответствует и стоит чётко на месте.
А вот если после включения поворачивать энкодер против часовой то происходит декремент два раза и после этого тот же ступор.
В общем за основу была взята конструкция синтезатора-генератора с LCD Так как полностью программирование я изучал только ассемблер а вот с сишными языками знаком только поверхностно.
У меня получилось изменить прошивку, а то есть дисплей поставить от моторолы.
Связь дисплея как и сишки по i2c, включаю всё работает но если повернуть валкодер по часовой стрелке то сразу происходит зависание программы и не реагирует на кнопку и валкодер хотя при этом частота с сишки соответствует и стоит чётко на месте.
А вот если после включения поворачивать энкодер против часовой то происходит декремент два раза и после этого тот же ступор.
greck
-
- Сообщения: 90
- Зарегистрирован: 18 апр 2021, 17:06
- Позывной: greck
- Город: Стрежевой
- Имя: Андрей
- Поблагодарили: 4 раза
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение greck » 30 окт 2021, 04:54
Spoiler
#include <avr/pgmspace.h>
#include <Wire.h>
#include <Rotary.h>
#include <si5351.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ST7558.h>
//#include "FontsRus/TimesNRCyr10.h"
//------------------------------------------------------------------------------------------------------------
#define IF 0 //Введите частоту ПЧ, например: 455 = 455 кГц, 10700 = 10,7 МГц, 0 = прямое преобразование приемника или ВЧ-генератора, + добавит, а - вычитает смещение ПЧ
#define FREQ_INIT 7100000 //Введите начальную частоту при запуске, например: 7000000 = 7 МГц, 10000000 = 10 МГц, 840000 = 840 кГц
#define XT_CAL_F 145000 //Коэффициент калибровки Si5351, отрегулируйте, чтобы получить точно 10 МГц. Увеличение этого значения приведет к уменьшению частоты и наоборот
#define tunestep A1 //Измените контакт, используемый кнопкой энкодера, если хотите
#define RST_PIN A0
ST7558 lcd = ST7558(RST_PIN);
//------------------------------------------------------------------------------------------------------------
Rotary r = Rotary(2, 3);
//Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351;
unsigned long freq = FREQ_INIT;
unsigned long freqold, fstep;
long interfreq = IF;
long cal = XT_CAL_F;
unsigned long long pll_freq = 90000000000ULL;
byte encoder = 1;
byte stp;
unsigned int period = 100;
unsigned long time_now = 0;
ISR(PCINT2_vect) {
char result = r.process();
if (result == DIR_CW) set_frequency(1);
else if (result == DIR_CCW) set_frequency(-1);
}
void set_frequency(short dir) {
if (encoder == 1) {
if (dir == 1) freq = freq + fstep;
if (freq >= 120000000) freq = 120000000;
if (dir == -1) freq = freq - fstep;
if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
else if (freq < 10000) freq = 10000;
}
}
void setup() {
Wire.begin();
lcd.init();
lcd.setContrast(65);
lcd.setRotation(0);
lcd.clearDisplay();
lcd.display();
delay(2000);
lcd.clearDisplay();
//lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//display.clearDisplay();
lcd.setTextColor(BLACK);
lcd.display();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(tunestep, INPUT_PULLUP);
statup_text();
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, cal);
si5351.output_enable(SI5351_CLK0, 1);
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 0);
si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_2MA);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
stp = 3;
setstep();
layout();
displayfreq();
}
void loop() {
if (freqold != freq) {
time_now = millis();
tunegen();
freqold = freq;
}
if (digitalRead(tunestep) == LOW) {
time_now = (millis() + 300);
setstep();
delay(300);
}
if ((time_now + period) > millis()) {
displayfreq();
layout();
}
}
void tunegen() {
si5351.set_freq_manual((freq + (interfreq * 1000ULL)) * 100ULL, pll_freq, SI5351_CLK0);
}
void displayfreq() {
unsigned int m = freq / 1000000;
unsigned int k = (freq % 1000000) / 1000;
unsigned int h = (freq % 1000) / 1;
lcd.clearDisplay();
lcd.setTextSize(0);
char buffer[15] = "";
if (m < 1) {
lcd.setCursor(41, 5); sprintf(buffer, "%003d.%003d", k, h);
}
else if (m < 100) {
lcd.setCursor(15, 5); sprintf(buffer, "%2d.%003d.%003d", m, k, h);
}
else if (m >= 100) {
unsigned int h = (freq % 1000) / 10;
lcd.setCursor(15, 5); sprintf(buffer, "%2d.%003d.%02d", m, k, h);
}
lcd.print(buffer);
}
void setstep() {
switch (stp) {
case 1:
stp = 2;
fstep = 1;
break;
case 2:
stp = 3;
fstep = 10;
break;
case 3:
stp = 4;
fstep = 1000;
break;
case 4:
stp = 5;
fstep = 5000;
break;
case 5:
stp = 6;
fstep = 10000;
break;
case 6:
stp = 1;
fstep = 1000000;
break;
}
}
void layout() {
lcd.setTextColor(BLACK);
lcd.drawLine(0, 20, 127, 20, BLACK);
lcd.drawLine(0, 43, 127, 43, BLACK);
lcd.drawLine(70, 24, 70, 39, BLACK);
lcd.setTextSize(0);
lcd.setCursor(2, 28);
lcd.print("TS:");
if (stp == 2) lcd.print("1Hz"); if (stp == 3) lcd.print("10Hz"); if (stp == 4) lcd.print("1kHz");
if (stp == 5) lcd.print("5kHz"); if (stp == 6) lcd.print("10kHz"); if (stp == 1) lcd.print("1MHz");
lcd.setCursor(2, 52);
lcd.print("IF:");
lcd.print(interfreq);
lcd.print("kHz");
lcd.setTextSize(0);
lcd.setCursor(75, 23);
if (freq < 1000000) lcd.print("kHz");
if (freq >= 1000000) lcd.print("MHz");
lcd.setCursor(75, 33);
if (interfreq == 0) lcd.print("VFO");
if (interfreq != 0) lcd.print("LO");
lcd.display();
}
void statup_text() {
lcd.setTextSize(0);
lcd.setCursor(4, 5);
lcd.print("Si5351");
lcd.setCursor(4, 20);
lcd.print("VFO / RF Gener");
lcd.setCursor(4, 35);
lcd.print("Version 1.0");
lcd.setCursor(4, 50);
lcd.print(">> JCR RADIO <<");
lcd.display();
delay(3000);
lcd.clearDisplay();
}
http://digitrode.ru/computing-devices/m ... ukami.html
greck
-
- Сообщения: 365
- Зарегистрирован: 22 окт 2019, 16:06
- Позывной: R2AVB
- Город: Москва
- Имя: Олег
- Благодарил (а): 48 раз
- Поблагодарили: 117 раз
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение Oleg » 30 окт 2021, 22:42
greck,
Я проверил Ваш скетч на Arduino Nano 328 c энкодером, но без дисплея и Si5351. Если убрать код, относящийся к дисплею и Si5351, то энкодер работает нормально.
Кнопка не работает, так как у Вас небольшая ошибка.
Замените строку #define RST_PIN A0 на #define tunestep A0. После этого кнопка должна работать.
И рекомендую проверить еще раз, правильно ли подключен энкодер.
Я проверил Ваш скетч на Arduino Nano 328 c энкодером, но без дисплея и Si5351. Если убрать код, относящийся к дисплею и Si5351, то энкодер работает нормально.
Кнопка не работает, так как у Вас небольшая ошибка.
Замените строку #define RST_PIN A0 на #define tunestep A0. После этого кнопка должна работать.
И рекомендую проверить еще раз, правильно ли подключен энкодер.
Олег
R2AVB
R2AVB
Oleg
-
- Сообщения: 90
- Зарегистрирован: 18 апр 2021, 17:06
- Позывной: greck
- Город: Стрежевой
- Имя: Андрей
- Поблагодарили: 4 раза
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение greck » 31 окт 2021, 14:24
Здравствуйте, у меня всё собранно в железе, пока я не поставил si5351 всё прекрасно работало, так как дисплей должен был устанавливаться oled 128x64 а у меня в наличии был только мотороловский вот я его и поставил и всё работает без сишки и кнопка и дисплей, как только я вешаю сишку включаю всё работает кнопка срабатывает несколько раз, также энкодер если крутить против часовой стрелки срабатывает пару щелчков а потом виснет, вобщем без сишки всё работает.
Да и кстати кнопку я перевешал на вывод А1
Да и кстати кнопку я перевешал на вывод А1
greck
-
- Сообщения: 365
- Зарегистрирован: 22 окт 2019, 16:06
- Позывной: R2AVB
- Город: Москва
- Имя: Олег
- Благодарил (а): 48 раз
- Поблагодарили: 117 раз
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение Oleg » 31 окт 2021, 15:51
Полную схему того, что сейчас у Вас сейчас собрано, можете показать?
Олег
R2AVB
R2AVB
Oleg
greck
-
- Сообщения: 365
- Зарегистрирован: 22 окт 2019, 16:06
- Позывной: R2AVB
- Город: Москва
- Имя: Олег
- Благодарил (а): 48 раз
- Поблагодарили: 117 раз
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение Oleg » 01 ноя 2021, 20:26
greck, Вы уж извините, но это - не схема, а небрежная фотография. Да и от оригинала отличается не только кнопкой на A1, но и дисплеем С115, на который идет 6 проводов.
Был бы рад помочь, но вникать что и куда припаяно на этой картинке нелегко.
Был бы рад помочь, но вникать что и куда припаяно на этой картинке нелегко.
Олег
R2AVB
R2AVB
Oleg
-
- Сообщения: 90
- Зарегистрирован: 18 апр 2021, 17:06
- Позывной: greck
- Город: Стрежевой
- Имя: Андрей
- Поблагодарили: 4 раза
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение greck » 01 ноя 2021, 21:06
По схеме, всё это сделано ради применения LCD C115, и что менялось в схеме только вывод кнопки с А0 на А1, так как А0 занят на reset от LCD.
Вся схема рабочая, программа в оригинале рабочая, а вот то что виснет с LCD C115 так вот с этим нужно разобраться.
Скорее всего проблема с i2c с адресацией дисплея, просто я не знаю как явно указать адрес дисплея вот так указывается адрес на бывший дисплей (display.begin(SSD1306_SWITCHCAPVCC, 0x3C);) но для работы С115 другая библиотека и как указать 0x3C я и не знаю.
А на счёт небрежности фото, просто по быстрому проверить как это будет работать.
Вся схема рабочая, программа в оригинале рабочая, а вот то что виснет с LCD C115 так вот с этим нужно разобраться.
Скорее всего проблема с i2c с адресацией дисплея, просто я не знаю как явно указать адрес дисплея вот так указывается адрес на бывший дисплей (display.begin(SSD1306_SWITCHCAPVCC, 0x3C);) но для работы С115 другая библиотека и как указать 0x3C я и не знаю.
А на счёт небрежности фото, просто по быстрому проверить как это будет работать.
greck
-
- Сообщения: 90
- Зарегистрирован: 18 апр 2021, 17:06
- Позывной: greck
- Город: Стрежевой
- Имя: Андрей
- Поблагодарили: 4 раза
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение greck » 22 дек 2021, 16:23
Ну что, кто может сможет помочь? я сам не программист, много не понимаю так по верхам.
Попробую описать суть проблемы, в общем когда не подключен модуль si5351 то всё работает частота на дисплее меняется, шаг настройки переключается ну вроде как всё отлично.
Но как только подключаю сишку включаю частота устанавливается и даже можно на пару шелчков повернуть валкодер частота на дсплее меняется и на сишке тоже переключается но после пары щелчков зависает не вперёд не назад не переключается, шаг тоже перестаёт меняться.
Может нужно как то указать адрес дисплея? и ещё на сишке нет вывода ресет а на дисплее есть, это както может мешать?
Попробую описать суть проблемы, в общем когда не подключен модуль si5351 то всё работает частота на дисплее меняется, шаг настройки переключается ну вроде как всё отлично.
Но как только подключаю сишку включаю частота устанавливается и даже можно на пару шелчков повернуть валкодер частота на дсплее меняется и на сишке тоже переключается но после пары щелчков зависает не вперёд не назад не переключается, шаг тоже перестаёт меняться.
Может нужно как то указать адрес дисплея? и ещё на сишке нет вывода ресет а на дисплее есть, это както может мешать?
Код: Выделить всё
//#include <avr/pgmspace.h>
#include <Wire.h>
#include <Rotary.h>
#include <si5351.h>
#include <Adafruit_GFX.h>
#include <ST7558.h>
//#include "FontsRus/TimesNRCyr10.h"
//------------------------------------------------------------------------------------------------------------
#define IF 0 //Введите частоту ПЧ, например: 455 = 455 кГц, 10700 = 10,7 МГц, 0 = прямое преобразование приемника или ВЧ-генератора, + добавит, а - вычитает смещение ПЧ
#define FREQ_INIT 7100000 //Введите начальную частоту при запуске, например: 7000000 = 7 МГц, 10000000 = 10 МГц, 840000 = 840 кГц
#define XT_CAL_F -170000 //Коэффициент калибровки Si5351, отрегулируйте, чтобы получить точно 10 МГц. Увеличение этого значения приведет к уменьшению частоты и наоборот
#define tunestep A0 //Измените контакт, используемый кнопкой энкодера, если хотите
#define RST_PIN 11
ST7558 lcd = ST7558(RST_PIN);
//------------------------------------------------------------------------------------------------------------
Rotary r = Rotary(2, 3);
Si5351 si5351(0x60); //Si5351 I2C Address 0x60 (адрес I2C для Si5351)
unsigned long freq = FREQ_INIT;
unsigned long freqold, fstep;
long interfreq = IF;
long cal = XT_CAL_F;
unsigned long long pll_freq = 90000000000ULL;
byte encoder = 1;
byte stp;
unsigned int period = 100;
unsigned long time_now = 0;
ISR(PCINT2_vect) {
char result = r.process();
if (result == DIR_CW) set_frequency(1);
else if (result == DIR_CCW) set_frequency(-1);
}
void set_frequency(short dir) {
if (encoder == 1) {
if (dir == 1) freq = freq + fstep;
if (freq >= 120000000) freq = 120000000;
if (dir == -1) freq = freq - fstep;
if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
else if (freq < 10000) freq = 10000;
}
}
void setup() {
Wire.begin();
lcd.init();
lcd.clearDisplay();
lcd.display();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(tunestep, INPUT_PULLUP);
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, cal);
si5351.output_enable(SI5351_CLK0, 1);
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 0);
si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_2MA);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
stp = 5;
setstep();
layout();
displayfreq();
}
void loop() {
if (freqold != freq) {
time_now = millis();
tunegen();
freqold = freq;
}
if (digitalRead(tunestep) == LOW) {
time_now = (millis() + 300);
setstep();
delay(300);
}
if ((time_now + period) > millis()) {
displayfreq();
layout();
}
}
void tunegen() {
si5351.set_freq_manual((freq + (interfreq * 1000ULL)) * 100ULL, pll_freq, SI5351_CLK0);
}
void displayfreq() {
unsigned int m = freq / 1000000;
unsigned int k = (freq % 1000000) / 1000;
unsigned int h = (freq % 1000) / 1;
lcd.clearDisplay();
//lcd.setTextSize(0);
char buffer[15] = "";
if (m < 1) {
lcd.setCursor(41, 5); sprintf(buffer, "%003d.%003d", k, h);
}
else if (m < 100) {
lcd.setCursor(15, 5); sprintf(buffer, "%2d.%003d.%003d", m, k, h);
}
else if (m >= 100) {
unsigned int h = (freq % 1000) / 10;
lcd.setCursor(15, 5); sprintf(buffer, "%2d.%003d.%02d", m, k, h);
}
lcd.print(buffer);
}
void setstep() {
switch (stp) {
case 1:
stp = 2;
fstep = 1;
break;
case 2:
stp = 3;
fstep = 10;
break;
case 3:
stp = 4;
fstep = 1000;
break;
case 4:
stp = 5;
fstep = 5000;
break;
case 5:
stp = 6;
fstep = 10000;
break;
case 6:
stp = 1;
fstep = 1000000;
break;
}
}
void layout() {
lcd.setTextColor(ST7558_BLACK);
lcd.drawLine(0, 20, 127, 20, ST7558_BLACK);
lcd.drawLine(0, 43, 127, 43, ST7558_BLACK);
lcd.drawLine(70, 24, 70, 39, ST7558_BLACK);
lcd.setTextSize(0);
lcd.setCursor(2, 28);
lcd.print("TS:");
if (stp == 2) lcd.print("1Hz"); if (stp == 3) lcd.print("10Hz"); if (stp == 4) lcd.print("1k");
if (stp == 5) lcd.print("5k"); if (stp == 6) lcd.print("10k"); if (stp == 1) lcd.print("1M");
lcd.setCursor(2, 52);
lcd.print("IF:");
lcd.print(interfreq);
lcd.print("kHz");
lcd.setTextSize(0);
lcd.setCursor(75, 23);
if (freq < 1000000) lcd.print("kHz");
if (freq >= 1000000) lcd.print("MHz");
lcd.setCursor(75, 33);
if (interfreq == 0) lcd.print("VFO");
if (interfreq != 0) lcd.print("LO");
lcd.display();
}
greck
- R9OFG
- Сообщения: 1183
- Зарегистрирован: 03 ноя 2019, 22:30
- Позывной: R9OFG, ex R0AEK
- Город: Новосибирск
- Имя: Саша
- Благодарил (а): 182 раза
- Поблагодарили: 276 раз
- Контактная информация:
Синтезатор на SI5351 и дисплей от Mоторола C115
Сообщение R9OFG » 22 дек 2021, 17:47
greck, если код готовый брали, теоретически ни чего менять там не надо. Проверьте подключение SDA/SCL, не перепутаны? На сишке RST нет. Ардуиновский скетч?
R9OFG
Вернуться в «Узлы, блоки, модули»
Перейти
- Обязательно к прочтению
- Аналоговая схемотехника
- ↳ Супергетеродинные приемники и трансиверы
- ↳ Прямое преобразование
- ↳ Прямое усиление
- ↳ Регенераторы
- ↳ Узлы, блоки, модули
- ↳ Усилители мощности
- Цифровая техника
- ↳ SDR приемники
- ↳ SDR приставки
- ↳ SDR трансиверы
- ↳ Микроконтроллеры и программирование
- Теплая лампота
- ↳ Супергетеродины
- ↳ Регенераторы
- ↳ Прямого усиления
- ↳ УНЧ
- ↳ ВЧ усилители мощности
- Источники питания
- ↳ Трансформаторные и линейные
- ↳ Импульсные и преобразователи
- ↳ Гибриды
- ↳ Аккумуляторы и батареи
- ↳ Альтернативные источники
- Антенны
- ↳ Антенны КВ
- ↳ Антенны УКВ
- ↳ Фидеры кабели
- ↳ Антенные приборы и устройства
- ↳ Тюнеры
- Фирменная аппаратура
- ↳ Yaesu
- ↳ Icom
- ↳ Kenwood
- ↳ Прочие
- Мастерская
- ↳ Измерения, приборы и софт
- ↳ Паяльное оборудование
- ↳ Слесарка
- ↳ ЧПУ и 3D принтеры
- Разное
- ↳ Другие радио темы
- ↳ Полевой день
- ↳ Помогите опознать
- ↳ Куплю Продам Магазины Продавцы
- ↳ Флудильня и оффтоп
- Работа форума