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

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

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


Аватара пользователя
jaxkz
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 18, 2014 07:42:07

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

Сообщение jaxkz »

На атмеге 32 не инициализируется дисплей, пробовал прошивать все 3 версии с радио на теа5676. На 16 меге дисплей работает.

И еще вопросик, я назначил на пульте кнопку сохранить радиостанцию (CMD_RC5_FM_STORE - код 36), но что то никак не получается сохранить ни одну. При нажатии, вместо цифры номера станции, высвечивается символ --, а что еще нажать не знаю.

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

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

Сообщение WiseLord »

jaxkz писал(а):На атмеге 32 не инициализируется дисплей
В варианте под ATmega16 при посылке данных в дисплей сначала идёт ожидание готовности дисплея (пустые циклы). И данные посылаются только когда дисплей готов их принять. Соответственно, более быстрый экземпляр дисплея будет работать шустрее более медленного.
В варианте под ATmega32 этот подход упрощён. По умолчанию считается, что дисплей должен отработать команду за 50мкс и быть готовым принять следующую. В коде это не проверяется, очередная команда просто посылается по пятидесятимикросекундному таймеру, без пустых циклов. 50мкс выбраны исходя из моего опыта работы с несколькими такими дисплеями. Возможно, Вам попался более медленный экземпляр.
В любом случае, попробуйте тестовую прошивку из вложения, где чтение очередной порции данных из кадрового буфера в дисплей замедлено до 100мкс. Если всё будет ОК, внесу это в основную ветку для ATmega32 (хотя заманчиво было бы найти более точное значение, например, 70мкс, чтобы и дисплей работал нормально, и частота кадров была повыше).
jaxkz писал(а):При нажатии, вместо цифры номера станции, высвечивается символ --, а что еще нажать не знаю
Система работает просто. Если нажать на эту кнопку, то текущая частота сохраняется в EEPROM и у станции появляется номер. Если ещё раз нажать эту кнопку на уже сохранённой станции, её частота из EEPROM удаляется. Для настройки на станции своего региона нужно пройтись по всем "неправильным" станциям, удалив их этой кнопкой, и этой же кнопкой сохранить свои нужные частоты.
jaxkz писал(а):Можно ли прикрутить управление сразу двумя аудиопроцессорами?
Это потребует другой схемотехники, в частности, I²C-мультиплексора, который смог бы перебрасывать шину I²C (или хотя бы линию данных SDA) с одного аудиопроцессора на другой. Для управления этим мультиплексором также понадобились бы дополнительные свободные ноги микроконтроллера.

P.S. Набросал короткое руководство по пользованию устройством.
Вложения
ampcontrol.odt.7z
(39.88 КБ) 526 скачиваний
test_m16.7z
(63.59 КБ) 430 скачиваний
Аватара пользователя
jaxkz
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 18, 2014 07:42:07

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

Сообщение jaxkz »

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

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

Сообщение WiseLord »

Там изменения на уровне исходного кода.
Спойлер

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

diff --git a/display/ks0108.c b/display/ks0108.c
index f8c8bfb..68b5ad1 100644
--- a/display/ks0108.c
+++ b/display/ks0108.c
@@ -22,7 +22,7 @@ void ks0108SetBrightness(uint8_t br)
 
 static void ks0108Write(uint8_t type, uint8_t data)
 {
-   _delay_us(50);
+   _delay_us(100);
 
    if (type == KS0108_DATA)
       KS0108_CTRL_PORT |= KS0108_DI;
@@ -69,45 +69,49 @@ ISR (TIMER0_OVF_vect)
    static uint8_t cs;
 
    static uint8_t br;
-
-   if (j == 64) {                           /* Phase 1 (Y) */
-      if (++i >= 8) {
-         i = 0;
-         if (++cs >= KS0108_CHIPS)
-            cs = 0;
-         switch (cs) {
-         case 1:
-            KS0108_SET_CS(KS0108_CS2);
-            break;
-         default:
-            KS0108_SET_CS(KS0108_CS1);
-            break;
+   static uint8_t upd = 0;
+
+   upd = !upd;
+   if (upd) {
+      if (j == 64) {                           /* Phase 1 (Y) */
+         if (++i >= 8) {
+            i = 0;
+            if (++cs >= KS0108_CHIPS)
+               cs = 0;
+            switch (cs) {
+            case 1:
+               KS0108_SET_CS(KS0108_CS2);
+               break;
+            default:
+               KS0108_SET_CS(KS0108_CS1);
+               break;
+            }
          }
+         KS0108_CTRL_PORT &= ~KS0108_DI;            /* Go to command mode */
+         KS0108_DATA_PORT = KS0108_SET_PAGE + i;      /* Set Y */
+      } else if (j == 65) {                     /* Phase 2 (X) */
+         KS0108_DATA_PORT = KS0108_SET_ADDRESS;      /* Set X */
+      } else {                              /* Phase 3 (32 bytes of data) */
+         KS0108_DATA_PORT = fb[j + 64 * cs][i];
       }
-      KS0108_CTRL_PORT &= ~KS0108_DI;            /* Go to command mode */
-      KS0108_DATA_PORT = KS0108_SET_PAGE + i;      /* Set Y */
-   } else if (j == 65) {                     /* Phase 2 (X) */
-      KS0108_DATA_PORT = KS0108_SET_ADDRESS;      /* Set X */
-   } else {                              /* Phase 3 (32 bytes of data) */
-      KS0108_DATA_PORT = fb[j + 64 * cs][i];
-   }
 
-   KS0108_CTRL_PORT |= KS0108_E;               /* Strob */
-   asm("nop");
-   KS0108_CTRL_PORT &= ~KS0108_E;
+      KS0108_CTRL_PORT |= KS0108_E;               /* Strob */
+      asm("nop");
+      KS0108_CTRL_PORT &= ~KS0108_E;
 
-   if (++j >= 66) {
-      j = 0;
-      KS0108_CTRL_PORT |= KS0108_DI;            /* Go to data mode */
-   }
+      if (++j >= 66) {
+         j = 0;
+         KS0108_CTRL_PORT |= KS0108_DI;            /* Go to data mode */
+      }
 
-   if (++br >= KS0108_MAX_BRIGTHNESS)            /* Loop brightness */
-      br = KS0108_MIN_BRIGHTNESS;
+      if (++br >= KS0108_MAX_BRIGTHNESS)            /* Loop brightness */
+         br = KS0108_MIN_BRIGHTNESS;
 
-   if (br == _br) {
-      KS0108_BCKL_PORT &= ~KS0108_BCKL;         /* Turn backlight off */
-   } else if (br == 0)
-      KS0108_BCKL_PORT |= KS0108_BCKL;         /* Turn backlight on */
+      if (br == _br) {
+         KS0108_BCKL_PORT &= ~KS0108_BCKL;         /* Turn backlight off */
+      } else if (br == 0)
+         KS0108_BCKL_PORT |= KS0108_BCKL;         /* Turn backlight on */
+   }
 
    return;
 }
diff --git a/display/st7920.c b/display/st7920.c
index 0a6135f..232202b 100644
--- a/display/st7920.c
+++ b/display/st7920.c
@@ -16,7 +16,7 @@ void st7920SetBrightness(uint8_t br)
 
 static void st7920Write(uint8_t type, uint8_t data)
 {
-   _delay_us(50);
+   _delay_us(100);
 
    if (type == ST7920_DATA)
       ST7920_CTRL_PORT |= ST7920_RS;
@@ -62,34 +62,38 @@ ISR (TIMER0_OVF_vect)
    static uint8_t j = 32;
 
    static uint8_t br;
+   static uint8_t upd = 0;
+
+   upd = !upd;
+   if (upd) {
+      if (j == 32) {                              /* Phase 1 (Y) */
+         ST7920_CTRL_PORT &= ~ST7920_RS;               /* Go to command mode */
+         if (++i >= 32)
+            i = 0;
+         ST7920_DATA_PORT = ST7920_SET_GRAPHIC_RAM | i;   /* Set Y */
+      } else if (j == 33) {                        /* Phase 2 (X) */
+         ST7920_DATA_PORT = ST7920_SET_GRAPHIC_RAM;      /* Set X */
+      } else {                                 /* Phase 3 (32 bytes of data) */
+         ST7920_DATA_PORT = fb[j][i];
+      }
 
-   if (j == 32) {                              /* Phase 1 (Y) */
-      ST7920_CTRL_PORT &= ~ST7920_RS;               /* Go to command mode */
-      if (++i >= 32)
-         i = 0;
-      ST7920_DATA_PORT = ST7920_SET_GRAPHIC_RAM | i;   /* Set Y */
-   } else if (j == 33) {                        /* Phase 2 (X) */
-      ST7920_DATA_PORT = ST7920_SET_GRAPHIC_RAM;      /* Set X */
-   } else {                                 /* Phase 3 (32 bytes of data) */
-      ST7920_DATA_PORT = fb[j][i];
-   }
-
-   ST7920_CTRL_PORT |= ST7920_E;                  /* Strob */
-   asm("nop");
-   ST7920_CTRL_PORT &= ~ST7920_E;
+      ST7920_CTRL_PORT |= ST7920_E;                  /* Strob */
+      asm("nop");
+      ST7920_CTRL_PORT &= ~ST7920_E;
 
-   if (++j >= 34) {
-      j = 0;
-      ST7920_CTRL_PORT |= ST7920_RS;               /* Go to data mode */
-   }
+      if (++j >= 34) {
+         j = 0;
+         ST7920_CTRL_PORT |= ST7920_RS;               /* Go to data mode */
+      }
 
-   if (++br >= ST7920_MAX_BRIGTHNESS)               /* Loop brightness */
-      br = ST7920_MIN_BRIGHTNESS;
+      if (++br >= ST7920_MAX_BRIGTHNESS)               /* Loop brightness */
+         br = ST7920_MIN_BRIGHTNESS;
 
-   if (br == _br) {
-      ST7920_BCKL_PORT &= ~ST7920_BCKL;            /* Turn backlight off */
-   } else if (br == 0)
-      ST7920_BCKL_PORT |= ST7920_BCKL;            /* Turn backlight on */
+      if (br == _br) {
+         ST7920_BCKL_PORT &= ~ST7920_BCKL;            /* Turn backlight off */
+      } else if (br == 0)
+         ST7920_BCKL_PORT |= ST7920_BCKL;            /* Turn backlight on */
+   }
 
    return;
 }

А заработало хотя бы?

А по поводу таймингов.. идея в чём-то интересная. Можно попробовать реализовать что-то подобное, чтобы можно было через правку EEPROM попытаться достигнуть максимально высокой скорости для своего экземпляра дисплея.
Аватара пользователя
jaxkz
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 18, 2014 07:42:07

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

Сообщение jaxkz »

Дисплей так и не завелся. Грешил уже на мегу, хорошо их у меня 3 шт новых (для проверки распаковал :)) ), но увы.....
Задняя сторона дисплея
СпойлерИзображение


И еще вопрос, выводы ext1,ext2 и fan под что заняты в последней прошивке? Радиомодуль и аудипроцессор подключаются к одним и тем же разъемам sda и scl или ext1 и ext2, переделаны для аудиопроцессора, тогда ext1=sda ext2=scl или наоборот? :roll:
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А давайте-ка проверим по-другому.

Во вложении набор прошивок для ATmega16, таких же прошивок для ATmega32 (без кадрового буфера), и новых прошивок для ATmega32 с кадровым буфером.

На третьем варианте, как я понял, проблемы. А вот заработает ли у Вас ATmega32 на втором варианте (таком же, как для ATmega16)?

Группа контактов Ext1/Ext2/Fan используется для управления LM7001. Для других радиомодулей она не используется вообще.
Последний раз редактировалось WiseLord Пт сен 26, 2014 07:16:05, всего редактировалось 2 раза.
Владимир Чеканов
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт сен 23, 2014 20:46:45
Откуда: Пенза

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

Сообщение Владимир Чеканов »

проблемка стала в следующем чем лучше запрограммировать контролер и где нарыть модуль FM, по схеме посмотрев палагаю должен пойти любой FM модуль из магнитолы причём не выпаивая от туда микросхему, а использовать его целиком только распайку контактов придётся немного изменить для каждого модуля и в габаритах не вижу ни чего страшного.
P.S. хотя могу ошибаться!
Аватара пользователя
jaxkz
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 18, 2014 07:42:07

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

Сообщение jaxkz »

А вот заработает ли у Вас ATmega32 на втором варианте

Попробую вечерком прошить, сейчас пока на работе :))

проблемка стала в следующем чем лучше запрограммировать контролер и где нарыть модуль FM

Можно самодельным программатором Громова (при наличии СОМ порта)
СпойлерИзображение
, или можно на меге 8 собрать. Я пользуюсь таким:
Спойлер1) http://aliexpress.com/item/Free-Shipping-New-1pc-USB-ISP-Programmer-For-ATMEL-AVR-ATMega-ATTiny-51-Development-Board/1813921450.html 2) http://ru.aliexpress.com/item/-/2002421678.html
, радиомодули можно как вы сказали из автомагнитолы отпилить или заказать.
СпойлерИзображениеhttp://ru.aliexpress.com/item/5pcs-lot-TEA5767-FM-Radio-Module/1372632455.html
или
СпойлерИзображениеhttp://ru.aliexpress.com/item/5pcs-lot-FM-Module-RDA5807M-RRD-102V2-0-Stereo-Radio-Module/1872470149.html
skaarjik
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 15:40:06
Откуда: Беларусь, Гродно

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

Сообщение skaarjik »

Крутое устройство, очень понравилось. Вот бы в него добавить поддержку лестничного регулятора громкости на реле, такого как тут http://startcd.narod.ru/reg88/index.html, софт-старт, термоконтроль на ds18b20, уменьшить число кнопок до одной, встроенной в енкодер. Я бы не задумываясь перешел на него и был бы счастлив :)
Последний раз редактировалось skaarjik Пт сен 26, 2014 13:18:04, всего редактировалось 2 раза.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Большое обновление и синхронизация прошивок.

- В прошивку для ATmega8 добавлена поддержка тюнера RDA5807;

- В прошивку для ATmega8 добавлена поддержка регулировки яркости;

- Удалён вариант прошивки без тюнера (не вижу в нём смысла);

- Исходники всех прошивок (ATmega8/16/32) максимально синхронизированы между собой.

- Оптимизация кода прошивок, исправления возможных недочётов.

- Проекты в формате Proteus 7 для всех вариантов дисплеев.

_____
skaarjik писал(а):Вот бы... уменьшить число кнопок до одной... был бы идеальный универсальный девайс
Смешно, правда.

А по поводу этого "лестничного" регулятора громкости - имхо, он ничего особенного из себя не представляет - этакий усложнённый аналог переменного резистора, требующий кучи выводов МК для управления. А взять их неоткуда. К тому же - ни тембров, ни селектора входов нет.

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

Впрочем, никто не мешает использовать этот спектроанализатор на Вашем текущем девайсе. Просто включать и выключать его синхронно и не использовать другие его функции - и всё.
Аватара пользователя
Djony
Прорезались зубы
Сообщения: 202
Зарегистрирован: Ср ноя 10, 2010 20:25:10
Откуда: Томск

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

Сообщение Djony »

Здравствуйте! Может кто поделится печаткой под вариант на Меге 8...
Аватара пользователя
jaxkz
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс май 18, 2014 07:42:07

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

Сообщение jaxkz »

В общем, прошил вторую версию для меги 32, полет нормальный :)) С фреймбуфером никак :(
Последний раз редактировалось jaxkz Пт сен 26, 2014 21:53:05, всего редактировалось 1 раз.
Аватара пользователя
Александр76
Потрогал лапой паяльник
Сообщения: 392
Зарегистрирован: Вс янв 25, 2009 23:17:22
Откуда: 76RUS

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

Сообщение Александр76 »

Я не фанат бескислородной меди и прочих аудиофильских мифов

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

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

Сообщение WiseLord »

Обновление прошивки для ATmega32 с кадровым буфером.

- Добавлен режим индикатора уровня громкости (плюс к двум имеющимся режимам отображения спектра)

Изображение
Вложения
ampcontrol_m16fb-806a5e4.7z
(60.76 КБ) 488 скачиваний
koka5555
Потрогал лапой паяльник
Сообщения: 344
Зарегистрирован: Вт окт 22, 2013 23:09:06

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

Сообщение koka5555 »

Прошил,просто супер.
Аватара пользователя
Александр76
Потрогал лапой паяльник
Сообщения: 392
Зарегистрирован: Вс янв 25, 2009 23:17:22
Откуда: 76RUS

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

Сообщение Александр76 »

И я прошил,отлично !
Аватара пользователя
котопёс
Грызет канифоль
Сообщения: 273
Зарегистрирован: Ср янв 21, 2009 15:25:34

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

Сообщение котопёс »

WiseLord, не могли бы вы мне ещё помочь? В процессе возни с прибором
выяснилось что первая кнопка вкл-выкл ещё и отключает подсветку.
Как то не удобно. не поймешь толи ты его выключил толи подсветка отрубилась.
И ещё поле последней сборки прошивки где я удалил пустые экраны от часов,
При прослушивании радио пропал значок стерео при качественном приеме.
По поводу приёмника. Подключил ТЕА 5767. Работает. Но субъективно
чем выше частота , тем хуже чувствительность. До 100мгц всё в зашкале,
после ели ели вышкрибается. И подскажите схемку согласования ttl
с 5в на 3,3в.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Это в старых прошивках. В новых длинное нажатие на первую кнопку вызывает экран регулировки яркости.

Значок "стерео" мог пропасть из-за того, что на пульте была нажата кнопка переключения режима стерео/моно.

Для RDA5807 я делал преобразователь типа этого:

Изображение
Аватара пользователя
котопёс
Грызет канифоль
Сообщения: 273
Зарегистрирован: Ср янв 21, 2009 15:25:34

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

Сообщение котопёс »

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

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

Сообщение WiseLord »

Зачем её убирать? Короткое нажатие и длинное нажатие - разные вещи.

Но если так уж неймётся - в main.c убрать лишний вариант case:
Спойлер

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

case CMD_BTN_1_LONG:
case CMD_RC5_BACKLIGHT:
        dispMode = MODE_BR;
        setDisplayTime(DISPLAY_TIME_BR);
        break;


Обновление прошивки.

- Улучшено разделение каналов.

На всех предыдущих прошивках был досадный недочёт, на который я не обращал внимания.
Данные для Фурье анализа собираются следущим образом: Сначала АЦП измеряет уровень на левом входе (MUX0), потом переключается мультиплексором на правый (MUX1), и так далее, пока не соберёт по 64 точки для каждого входа (всего 128 измерений). После всё это обсчитывается и рисуется кадр спектра. Ну и всё повторяется

Так вот, момент переключения мультиплексора был выбран не очень удачно, и АЦП начинал обсчитывать всё сразу после переключения. А в это время из-за ёмкостных эффектов на измеряемой линии напряжение ещё было частично от "старого" канала.

Это приводило к тому, что даже если подавать сигнал только на левый, например, вход, что-то измерялось и на правом. И наоборот. Этакий "фантом" соседнего входа.

В общем, сейчас этого нет. Да и спектр в целом стал выглядеть более чётко.
Последний раз редактировалось WiseLord Сб сен 27, 2014 17:15:39, всего редактировалось 2 раза.
Ответить

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