Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение skaarjik »

В старом репозитории была ветка PGA2310, кто-нибудь забирал ее ?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Ок, скопировал эту ветку и на github.
Можете забрать здесь, но ничего ценного там нет - только старый каркас для поддержки этого аудиопроцессора (без посылки реальных данных по шине), к текущей архитектуре не подходящий.
Аватара пользователя
loki_amorf
Открыл глаза
Сообщения: 69
Зарегистрирован: Пт апр 23, 2010 13:04:48
Откуда: г.Киев

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение loki_amorf »

Что нужно по PGA2310?
У меня трудится на предыдущем Владимира движке, правда на Атмега 64.
+ я добавил переключение аудио входов на реле.
Пока что все на полумакетках, буду разводить плату в PCAD.
skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение skaarjik »

Хочу собрать управление своим самодельным усилителем по этому проекту, вместо того, что у меня стоит сейчас.
Контроллер буду использовать atmega64, т.к. нужно будет реализвать некоторые дополнительные функции, дисплей KS0108A,
аудиопроцессор хотелось бы использовать PGA2310, переключение входов на реле. Регулировки частот мне не нужны.

Что значит предыдущий движок?
Сложно ли добавить в проект Ваш драйвер для PGA2310 и отключить лишние функции?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Предыдущий движок значит, что в последних прошивках полностью поменялась архитектура поддержки аудиопроцессоров и тюнеров, что позволило все их поддерживать в рамках одного файла прошивки. Сейчас всего три прошивки - по одной для каждого типа дисплея, и каждая из них умеет работать с любым из поддерживаемых тюнеров и аудиопроцессоров.

В новом варианте добавить поддержку ещё одного аудиопроцессора очень просто. Для того же PGA2310 нужно:

1. В audioproc.h добавить в enum audioProc ID нового процессора (привязать его к некоему номеру), типа AUDIOPROC_PGA2310.

2. В audioproc.c в функции sndInit() добавить этот процессор и описать параметры сетки регулировок для него. Например, нам нужна только громкость и баланс. Тогда добавляем что-то вроде:

Код: Выделить всё

case AUDIOPROC_PGA2310:
    sndPar[MODE_SND_VOLUME].grid = &grid[1];
    sndPar[MODE_SND_BALANCE].grid = &grid[4];
    break;
Остальные параметры, которые не указаны, будут просто отсутствовать.
Здесь grid[1] и grid[4] - нужные диапазоны регулировки, берущиеся из соответствующего массива в начале audioproc.c. По необходимости можно добавить свои диапазоны.

3. Добавить по аналогии с другими (удобно для простоты взять tda7448) пару файлов pga2310.c/pga2310.h, где описать нужные функции. Ну и где надо, по мелочи добавить их вызовы в audioproc.c.

Собственно, этого достаточно для базовой регулировки громкости/баланса. Для переключения входов через реле нужно дописать ещё пару вещей.

Если сами не осилите, могу набросать каркас, только уже c тем, что слать по I2C-шине, сами разбирайтесь.
Аватара пользователя
loki_amorf
Открыл глаза
Сообщения: 69
Зарегистрирован: Пт апр 23, 2010 13:04:48
Откуда: г.Киев

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение loki_amorf »

Можно попробовать.
Работающая функция софт SPI у меня присутствует.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Собственно, вот весь патч, который нужно наложить на исходники, чтобы получилась поддержка PGA2310 (по адресу 0x0E в EEPROM прописываем AUDIOPROC_PGA2310 = 0x06).

Режимы корректно отображаются на экране, всё работает за исключением того, что в реальности в микросхему ничего не отсылается (нужны несколько строк кода, формирующие эти посылки).
Спойлер

Код: Выделить всё

diff --git a/audio/audioproc.c b/audio/audioproc.c
index 6de9815..b11311d 100644
--- a/audio/audioproc.c
+++ b/audio/audioproc.c
@@ -16,7 +16,8 @@ static const sndGrid grid[] PROGMEM = {
    {-15, 15, 1.25 * 8},   /* 7: -18.75..18.75dB with 1.25dB step */
    {  0,  3, 3.75 * 8},   /* 8: 0..11.25dB with 3.75dB step */
    {  0,  3, 6.25 * 8},   /* 9: 0..18.75dB with 6.25dB step */
-   {-21,  0, 1.00 * 8},   /* 4: -21..0dB with 1dB step */
+   {-21,  0, 1.00 * 8},   /*10: -21..0dB with 1dB step */
+   {-96, 31, 1.00 * 8},   /*11: -96..31dB with 1dB step */
 };
 
 static sndParam sndPar[MODE_SND_END];
@@ -41,6 +42,7 @@ void sndInit(void)
    tda7439Init(sndPar);
    tda731xInit(sndPar);
    tda7448Init(sndPar);
+   pga2310Init(sndPar);
 
    /* Load audio parameters stored in eeprom */
    for (i = 0; i < MODE_SND_END; i++) {
@@ -163,6 +165,13 @@ void sndInit(void)
       sndPar[MODE_SND_CENTER].set = tda7448SetSpeakers;
       sndPar[MODE_SND_SUBWOOFER].set = tda7448SetSpeakers;
       break;
+   case AUDIOPROC_PGA2310:
+      sndPar[MODE_SND_VOLUME].grid = &grid[11];
+      sndPar[MODE_SND_BALANCE].grid = &grid[4];
+      _inCnt = PGA2310_IN_CNT;
+      sndPar[MODE_SND_VOLUME].set = pga2310SetSpeakers;
+      sndPar[MODE_SND_BALANCE].set = pga2310SetSpeakers;
+      break;
    default:
       break;
    }
@@ -251,6 +260,8 @@ void sndSetMute(uint8_t value)
       break;
    case AUDIOPROC_TDA7448:
       tda7448SetMute(_mute);
+   case AUDIOPROC_PGA2310:
+      pga2310SetMute(_mute);
    default:
       break;
    }
diff --git a/audio/audioproc.h b/audio/audioproc.h
index 0009e26..78dfe23 100644
--- a/audio/audioproc.h
+++ b/audio/audioproc.h
@@ -5,6 +5,7 @@
 #include "tda731x.h"
 #include "tda7439.h"
 #include "tda7448.h"
+#include "pga2310.h"
 #include "../pins.h"
 
 typedef enum {
@@ -14,6 +15,7 @@ typedef enum {
    AUDIOPROC_TDA7314,
    AUDIOPROC_TDA7318,
    AUDIOPROC_TDA7448,
+   AUDIOPROC_PGA2310,
    AUDIOPROC_END
 } audioProc;
 
diff --git a/audio/pga2310.c b/audio/pga2310.c
new file mode 100644
index 0000000..92bd7fc
--- /dev/null
+++ b/audio/pga2310.c
@@ -0,0 +1,45 @@
+#include "pga2310.h"
+
+#include <avr/pgmspace.h>
+
+static sndParam *sndPar;
+
+void pga2310Init(sndParam *sp)
+{
+   sndPar = sp;
+
+   return;
+}
+
+void pga2310SetSpeakers(int8_t val)
+{
+   int8_t spLeft = sndPar[MODE_SND_VOLUME].value;
+   int8_t spRight = sndPar[MODE_SND_VOLUME].value;
+   int8_t volMin = pgm_read_byte(&sndPar[MODE_SND_VOLUME].grid->min);
+
+   if (sndPar[MODE_SND_BALANCE].value > 0) {
+      spLeft -= sndPar[MODE_SND_BALANCE].value;
+      if (spLeft < volMin)
+         spLeft = volMin;
+   } else {
+      spRight += sndPar[MODE_SND_BALANCE].value;
+      if (spRight < volMin)
+         spRight = volMin   ;
+   }
+
+   /* Write some bytes to bus to set speakers */
+
+   return;
+}
+
+void pga2310SetMute(uint8_t val)
+{
+   if (val == MUTE_ON) {
+      /* Write some bytes to bus to set mute */
+
+   } else {
+      pga2310SetSpeakers(0);
+   }
+
+   return;
+}
diff --git a/audio/pga2310.h b/audio/pga2310.h
new file mode 100644
index 0000000..3f081ad
--- /dev/null
+++ b/audio/pga2310.h
@@ -0,0 +1,14 @@
+#ifndef PGA2310_H
+#define PGA2310_H
+
+#include <inttypes.h>
+#include "audio.h"
+
+/* Number of inputs */
+#define PGA2310_IN_CNT            1
+
+void pga2310Init(sndParam *sp);
+void pga2310SetSpeakers(int8_t val);
+void pga2310SetMute(uint8_t val);
+
+#endif /* PGA2310_H */
Также отправил это в ветку PGA2310 на GitHub, вместо старого кода.

Для поддержки нескольких входов через реле нужно добавить ещё несколько строчек кода, дёргающих соответствующим образом свободные выводы контроллера.
skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение skaarjik »

Большое спасибо, микросхема PGA2310 пока не пришла, постараюсь разобраться, на управление реле моих знаний точно хватит :)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Тестовая прошивка с возвращённой поддержкой синтезатора частот LM7001.

На железе пока не проверял, так что отзывы привествуются.

Поскольку для термоконтроля и управления синтезатором используются одни и те же ножки, на ATmega32 можно выбрать только что-то одно. За выбор отвечает байт eepromExtFunc (адрес 0x3D в EEPROM).
Значения:
0x01 - поддержка термоконтроля на DS18x20
0x02 - поддержка LM7001.
(0x03 включает поддержку и того, и другого, но ставить это значение нельзя - можно и МК испортить).

Помимо этого, для выбора тюнера LM7001 нужно установить байт eepromFMTuner (адрес 0x20 в EEPROM) в значение TUNER_LM7001 (0x04).

В новом варианте прошивки с учётом будущих усовершенствований сильно поменялись адреса байтов конфигурации (диапазон 0x00..0x3F в EEPROM). Смотрите eeprom.h для подробностей.

Исходники в тестовой ветке на github.

P.S. Проверил в железе - да, всё работает.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Тестовая прошивка с поддержкой PGA2310.

Опять же, в железе я это проверить не могу, но теоретически должно работать.

На ATmega32 используются те же ножки для управления, что для термоконтроля и LM7001. Так что выбираем только что-то одно. За выбор отвечает байт eepromExtFunc (адрес 0x3D в EEPROM).

Возможные значения:

0x01 - поддержка термоконтроля на DS18x20
0x02 - поддержка LM7001.
0x04 - поддержка PGA2310.

Также по адресу 0x0E в EEPROM прописываем AUDIOPROC_PGA2310 = 0x06.

На ATmega64 можно включить и все фунции сразу (побитовое сложение указанных выше опций), только в pins.h надо всё развесить на незанятые порты.
Вложения
ampcontrol-d7cdc63.7z
(26.83 КБ) 270 скачиваний
skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение skaarjik »

Это отличная новость, огромное спасибо!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Жду отзывов о работоспособности. У меня этой микросхемы нет, так что до конца не уверен, что правильно реализовал интерфейс управления.
skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение skaarjik »

я жду посылки - обязательно проверю
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Тестовая прошивка с поддержкой RDS.

Поскольку из всех поддерживаемых только RDA5807 имеет встроенный декодер RDS, то функция активизируется только на ней.

Честно говоря, у меня условия приёма не самые лучшие, так что даже со стереоприёмом бывают проблемы, не говоря уже об RDS. Поэтому толком только на одной станции (Минск, радио Би-Эй на 104,6) RDS декодируется более-менее нормально. На других станциях, где есть RDS, всё гораздо хуже. Но хотя бы одна эта станция даёт понять, что алгоритм я реализовал вроде как правильный.

В общем, обладатели RDA5807 могут потестировать.

Все функции ранее выложенных "тестовых" прошивок (поддержка LM7001, PGA2310) также присутствуют.

Если станция не имеет RDS-потока, на экране FM-тюнера отображается анализатор спектра, как и ранее. В случае наличия сигнала RDS вместо него выводится передаваемая информация (8 символов).

Аватара пользователя
FOLKSDOICH
Говорящий с текстолитом
Сообщения: 1580
Зарегистрирован: Ср окт 04, 2006 22:33:56
Откуда: М.о.

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение FOLKSDOICH »

Ахренеть. Молодца!
Всё придумано до и для нас.
Аватара пользователя
san-sanych
Встал на лапы
Сообщения: 127
Зарегистрирован: Вт июл 15, 2014 17:03:13
Откуда: Могилев, Беларусь
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение san-sanych »

Огромное спасибо автору за возвращенную поддержку LM7001!
Завтра залью новую прошу в свой усь и буду наслаждаться.

P.S. Ну а RDS - это вообще супер!!! Жаль, что нет у меня RDA5807 (был один, да использовал его в радиочасах), а то обязательно бы попробовал. Буду надеяться, что со временем автор прикрутит декодер RDS и к аналоговым тюнерам.

Пора уже Горизонту или Витязю заключать с автором договор и запускать ресивер на основе проекта в серию :))) Правда при наших накладных стоимость его на выходе боюсь будет неподъемной.
Аватара пользователя
VeryLazyCat
Опытный кот
Сообщения: 832
Зарегистрирован: Пн май 17, 2010 22:21:01
Откуда: Madagaskar

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение VeryLazyCat »

Ув.WiseLord, а если добавить в схему внешнюю память -
получится проект с кадровым буффером для дисплея LS020 ?

Или может МК заменить, у которого хватит памяти ?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение WiseLord »

Для полноценной поддержки LS020 с кадровым буфером нужен размер ОЗУ 176*132=23232 точек. То есть - 46464 байт (максимальное использование цветовой палитры LS020, 16-битный цвет RRRRRGGG GGGBBBBB), или 23232 байт (8-битный цвет RRRGGGBB) или 2904 байт (одноцветная палитра, 8 точек на байт).

ATmega32 не умеет работать с внешней памятью. У ATmega64 c 4кБайт ОЗУ есть возможность использования третьего варианта. Отдельной командой цвет можно менять для разных отображаемых элементов - прогрессбаров, надписей.

В целом, варианта два - либо организовывать кадровый буфер в варианте с ATmega64, либо использовать умеющий работать с внешней памятью другой контроллер.

Первый вариант меня не устраивает тем, что нарушится совместимость кода с ATmega32, то есть, по сути это выльется в отдельный проект. Я для себя не вижу смысла покупать более дорогой и сложный для изготовления МК ATmega64 искать б/у LS020 на барахолках, когда за фактически те же деньги я спокойно купил на Aliexpress цветной дисплей с лучшими параметрами и менее геморройный в плане пайки.

Второй проект - это также по сути отдельный проект, несовместимый с ATmega32.

В общем, про кадровый буфер можно, по сути, забыть.

Есть ещё одна возможность - вернуть поддержку LS020 в том виде как она была, без всяких кадровых буферов.

Сейчас вся отрисовка происходит в файле display.c единообразным для всех дисплеев 128x64 способом. Например, отрисовка иконки:

Код: Выделить всё

static void showParIcon(const uint8_t *icon)
{
   gdSetXY(104, 2);
   gdWriteIcon24(icon);

   return;
}
В новом варианте будет как-то так:

Код: Выделить всё

static void showParIcon(const uint8_t *icon)
{
#if defined(LS020)
   ls020SetXY(148, 2);
   ls020SetColor(COLOR_RED);
   ls020WriteIcon24(icon);
#else
   gdSetXY(104, 2);
   gdWriteIcon24(icon);
#endif
   return;
}
Думаю, идея понятна. И так же сделать практически со всеми функциями в этом файле. Мне не так уж сложно добавить (по сути, вернуть) поддержку ls020. Но жуть как лень отрисовывать все экраны с элементами по новым координатам. Тем более, что количество экранов, по сравнению с вариантом под ATmega16, значительно выросло. А дисплея такого у меня нет, а моделировать его в Proteus получается слишком тормознуто.

Если кто-то разбирается на базовом уровне в C, имеет в наличии LS020 и ему не лень самому посидеть над кодом (даже не столько над кодом, сколько над дизайном под новое разрешение) - может заняться. Я со свой стороны базовую поддержку всех нужных функций. То есть, для всех функций gd<Function> будут аналоги в виде ls020<Function>, а уже позиционированием и #if/#else/#endif заниматься буду не я.
Аватара пользователя
VeryLazyCat
Опытный кот
Сообщения: 832
Зарегистрирован: Пн май 17, 2010 22:21:01
Откуда: Madagaskar

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение VeryLazyCat »

Огромное Спасибо за развёрнутый ответ!

Осталось только найти кто разбирается на базовом уровне в C
и поможет с отрисовкой....
Здесь же просили ребята вернуть поддержку LS020 по той простой причине,
что его можно купить за копейки в сравнении с дисплеем 128х64 - присоединяйтесь.
Sergey212
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс янв 06, 2013 00:40:48

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128

Сообщение Sergey212 »

VeryLazyCat писал(а):Огромное Спасибо за развёрнутый ответ!
Здесь же просили ребята вернуть поддержку LS020 по той простой причине,
что его можно купить за копейки в сравнении с дисплеем 128х64 - присоединяйтесь.


С приобретением LS020 вообще проблем нет. В любой мастерской по ремонту мобилок предложат за малые деньги. Проверено. Так что я тоже за поддержку этого дисплея. Автору проекта огромная благодарность за его титанический труд.
Ответить

Вернуться в «Статьи»