Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
На атмеге 32 не инициализируется дисплей, пробовал прошивать все 3 версии с радио на теа5676. На 16 меге дисплей работает.
И еще вопросик, я назначил на пульте кнопку сохранить радиостанцию (CMD_RC5_FM_STORE - код 36), но что то никак не получается сохранить ни одну. При нажатии, вместо цифры номера станции, высвечивается символ --, а что еще нажать не знаю.
P.S можно ли прикрутить управление сразу двумя аудиопроцессорами (в моем случае TDA7439), чтобы управлять 4мя каналами?
И еще вопросик, я назначил на пульте кнопку сохранить радиостанцию (CMD_RC5_FM_STORE - код 36), но что то никак не получается сохранить ни одну. При нажатии, вместо цифры номера станции, высвечивается символ --, а что еще нажать не знаю.
P.S можно ли прикрутить управление сразу двумя аудиопроцессорами (в моем случае TDA7439), чтобы управлять 4мя каналами?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
В варианте под ATmega16 при посылке данных в дисплей сначала идёт ожидание готовности дисплея (пустые циклы). И данные посылаются только когда дисплей готов их принять. Соответственно, более быстрый экземпляр дисплея будет работать шустрее более медленного.jaxkz писал(а):На атмеге 32 не инициализируется дисплей
В варианте под ATmega32 этот подход упрощён. По умолчанию считается, что дисплей должен отработать команду за 50мкс и быть готовым принять следующую. В коде это не проверяется, очередная команда просто посылается по пятидесятимикросекундному таймеру, без пустых циклов. 50мкс выбраны исходя из моего опыта работы с несколькими такими дисплеями. Возможно, Вам попался более медленный экземпляр.
В любом случае, попробуйте тестовую прошивку из вложения, где чтение очередной порции данных из кадрового буфера в дисплей замедлено до 100мкс. Если всё будет ОК, внесу это в основную ветку для ATmega32 (хотя заманчиво было бы найти более точное значение, например, 70мкс, чтобы и дисплей работал нормально, и частота кадров была повыше).
Система работает просто. Если нажать на эту кнопку, то текущая частота сохраняется в EEPROM и у станции появляется номер. Если ещё раз нажать эту кнопку на уже сохранённой станции, её частота из EEPROM удаляется. Для настройки на станции своего региона нужно пройтись по всем "неправильным" станциям, удалив их этой кнопкой, и этой же кнопкой сохранить свои нужные частоты.jaxkz писал(а):При нажатии, вместо цифры номера станции, высвечивается символ --, а что еще нажать не знаю
Это потребует другой схемотехники, в частности, I²C-мультиплексора, который смог бы перебрасывать шину I²C (или хотя бы линию данных SDA) с одного аудиопроцессора на другой. Для управления этим мультиплексором также понадобились бы дополнительные свободные ноги микроконтроллера.jaxkz писал(а):Можно ли прикрутить управление сразу двумя аудиопроцессорами?
P.S. Набросал короткое руководство по пользованию устройством.
- Вложения
-
- ampcontrol.odt.7z
- (39.88 КБ) 526 скачиваний
-
- test_m16.7z
- (63.59 КБ) 430 скачиваний
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Спасибо!
Может вы подскажете какие биты, отвечающие за тайминги, можно в прошивке поменять, чтобы поэкспериментировать и наблюдениями поделиться?
Может вы подскажете какие биты, отвечающие за тайминги, можно в прошивке поменять, чтобы поэкспериментировать и наблюдениями поделиться?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Там изменения на уровне исходного кода.
А заработало хотя бы?
А по поводу таймингов.. идея в чём-то интересная. Можно попробовать реализовать что-то подобное, чтобы можно было через правку EEPROM попытаться достигнуть максимально высокой скорости для своего экземпляра дисплея.
Спойлер
Код: Выделить всё
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 попытаться достигнуть максимально высокой скорости для своего экземпляра дисплея.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Дисплей так и не завелся. Грешил уже на мегу, хорошо их у меня 3 шт новых (для проверки распаковал
), но увы.....
Задняя сторона дисплея
И еще вопрос, выводы ext1,ext2 и fan под что заняты в последней прошивке? Радиомодуль и аудипроцессор подключаются к одним и тем же разъемам sda и scl или ext1 и ext2, переделаны для аудиопроцессора, тогда ext1=sda ext2=scl или наоборот?
Задняя сторона дисплея
И еще вопрос, выводы ext1,ext2 и fan под что заняты в последней прошивке? Радиомодуль и аудипроцессор подключаются к одним и тем же разъемам sda и scl или ext1 и ext2, переделаны для аудиопроцессора, тогда ext1=sda ext2=scl или наоборот?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
А давайте-ка проверим по-другому.
Во вложении набор прошивок для ATmega16, таких же прошивок для ATmega32 (без кадрового буфера), и новых прошивок для ATmega32 с кадровым буфером.
На третьем варианте, как я понял, проблемы. А вот заработает ли у Вас ATmega32 на втором варианте (таком же, как для ATmega16)?
Группа контактов Ext1/Ext2/Fan используется для управления LM7001. Для других радиомодулей она не используется вообще.
Во вложении набор прошивок для 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. хотя могу ошибаться!
P.S. хотя могу ошибаться!
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
А вот заработает ли у Вас ATmega32 на втором варианте
Попробую вечерком прошить, сейчас пока на работе
проблемка стала в следующем чем лучше запрограммировать контролер и где нарыть модуль FM
Можно самодельным программатором Громова (при наличии СОМ порта), или можно на меге 8 собрать. Я пользуюсь таким:
, радиомодули можно как вы сказали из автомагнитолы отпилить или заказать. или
-
skaarjik
- Первый раз сказал Мяу!
- Сообщения: 34
- Зарегистрирован: Чт дек 23, 2010 15:40:06
- Откуда: Беларусь, Гродно
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Крутое устройство, очень понравилось. Вот бы в него добавить поддержку лестничного регулятора громкости на реле, такого как тут 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
Большое обновление и синхронизация прошивок.
- В прошивку для ATmega8 добавлена поддержка тюнера RDA5807;
- В прошивку для ATmega8 добавлена поддержка регулировки яркости;
- Удалён вариант прошивки без тюнера (не вижу в нём смысла);
- Исходники всех прошивок (ATmega8/16/32) максимально синхронизированы между собой.
- Оптимизация кода прошивок, исправления возможных недочётов.
- Проекты в формате Proteus 7 для всех вариантов дисплеев.
_____
А по поводу этого "лестничного" регулятора громкости - имхо, он ничего особенного из себя не представляет - этакий усложнённый аналог переменного резистора, требующий кучи выводов МК для управления. А взять их неоткуда. К тому же - ни тембров, ни селектора входов нет.
И не надо рассказывать про якобы аудиофильность этой штуковины. Ну не верю я, что сигнал, проходящий через длиннющую цепочку контактов реле, испортится меньше, чем он же, проходящий через обычный переменник. Я не фанат бескислородной меди и прочих аудиофильских мифов.
Впрочем, никто не мешает использовать этот спектроанализатор на Вашем текущем девайсе. Просто включать и выключать его синхронно и не использовать другие его функции - и всё.
- В прошивку для ATmega8 добавлена поддержка тюнера RDA5807;
- В прошивку для ATmega8 добавлена поддержка регулировки яркости;
- Удалён вариант прошивки без тюнера (не вижу в нём смысла);
- Исходники всех прошивок (ATmega8/16/32) максимально синхронизированы между собой.
- Оптимизация кода прошивок, исправления возможных недочётов.
- Проекты в формате Proteus 7 для всех вариантов дисплеев.
_____
Смешно, правда.skaarjik писал(а):Вот бы... уменьшить число кнопок до одной... был бы идеальный универсальный девайс
А по поводу этого "лестничного" регулятора громкости - имхо, он ничего особенного из себя не представляет - этакий усложнённый аналог переменного резистора, требующий кучи выводов МК для управления. А взять их неоткуда. К тому же - ни тембров, ни селектора входов нет.
И не надо рассказывать про якобы аудиофильность этой штуковины. Ну не верю я, что сигнал, проходящий через длиннющую цепочку контактов реле, испортится меньше, чем он же, проходящий через обычный переменник. Я не фанат бескислородной меди и прочих аудиофильских мифов.
Впрочем, никто не мешает использовать этот спектроанализатор на Вашем текущем девайсе. Просто включать и выключать его синхронно и не использовать другие его функции - и всё.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Здравствуйте! Может кто поделится печаткой под вариант на Меге 8...
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
В общем, прошил вторую версию для меги 32, полет нормальный
С фреймбуфером никак 
Последний раз редактировалось jaxkz Пт сен 26, 2014 21:53:05, всего редактировалось 1 раз.
- Александр76
- Потрогал лапой паяльник
- Сообщения: 392
- Зарегистрирован: Вс янв 25, 2009 23:17:22
- Откуда: 76RUS
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Я не фанат бескислородной меди и прочих аудиофильских мифов
И это правильно.Я тоже
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Обновление прошивки для ATmega32 с кадровым буфером.
- Добавлен режим индикатора уровня громкости (плюс к двум имеющимся режимам отображения спектра)

- Добавлен режим индикатора уровня громкости (плюс к двум имеющимся режимам отображения спектра)
- Вложения
-
- ampcontrol_m16fb-806a5e4.7z
- (60.76 КБ) 488 скачиваний
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Прошил,просто супер.
- Александр76
- Потрогал лапой паяльник
- Сообщения: 392
- Зарегистрирован: Вс янв 25, 2009 23:17:22
- Откуда: 76RUS
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
И я прошил,отлично !
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
WiseLord, не могли бы вы мне ещё помочь? В процессе возни с прибором
выяснилось что первая кнопка вкл-выкл ещё и отключает подсветку.
Как то не удобно. не поймешь толи ты его выключил толи подсветка отрубилась.
И ещё поле последней сборки прошивки где я удалил пустые экраны от часов,
При прослушивании радио пропал значок стерео при качественном приеме.
По поводу приёмника. Подключил ТЕА 5767. Работает. Но субъективно
чем выше частота , тем хуже чувствительность. До 100мгц всё в зашкале,
после ели ели вышкрибается. И подскажите схемку согласования ttl
с 5в на 3,3в.
выяснилось что первая кнопка вкл-выкл ещё и отключает подсветку.
Как то не удобно. не поймешь толи ты его выключил толи подсветка отрубилась.
И ещё поле последней сборки прошивки где я удалил пустые экраны от часов,
При прослушивании радио пропал значок стерео при качественном приеме.
По поводу приёмника. Подключил ТЕА 5767. Работает. Но субъективно
чем выше частота , тем хуже чувствительность. До 100мгц всё в зашкале,
после ели ели вышкрибается. И подскажите схемку согласования ttl
с 5в на 3,3в.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Это в старых прошивках. В новых длинное нажатие на первую кнопку вызывает экран регулировки яркости.
Значок "стерео" мог пропасть из-за того, что на пульте была нажата кнопка переключения режима стерео/моно.
Для RDA5807 я делал преобразователь типа этого:

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

Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Спасибо! А как убрать эту функцию? Что бы кнопка работала только на включение-выключение.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Зачем её убирать? Короткое нажатие и длинное нажатие - разные вещи.
Но если так уж неймётся - в main.c убрать лишний вариант case:
Обновление прошивки.
- Улучшено разделение каналов.
На всех предыдущих прошивках был досадный недочёт, на который я не обращал внимания.
Данные для Фурье анализа собираются следущим образом: Сначала АЦП измеряет уровень на левом входе (MUX0), потом переключается мультиплексором на правый (MUX1), и так далее, пока не соберёт по 64 точки для каждого входа (всего 128 измерений). После всё это обсчитывается и рисуется кадр спектра. Ну и всё повторяется
Так вот, момент переключения мультиплексора был выбран не очень удачно, и АЦП начинал обсчитывать всё сразу после переключения. А в это время из-за ёмкостных эффектов на измеряемой линии напряжение ещё было частично от "старого" канала.
Это приводило к тому, что даже если подавать сигнал только на левый, например, вход, что-то измерялось и на правом. И наоборот. Этакий "фантом" соседнего входа.
В общем, сейчас этого нет. Да и спектр в целом стал выглядеть более чётко.
Но если так уж неймётся - в 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 раза.