Страница 21 из 240

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

Добавлено: Ср сен 24, 2014 17:34:48
jaxkz
На атмеге 32 не инициализируется дисплей, пробовал прошивать все 3 версии с радио на теа5676. На 16 меге дисплей работает.

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

P.S можно ли прикрутить управление сразу двумя аудиопроцессорами (в моем случае TDA7439), чтобы управлять 4мя каналами?

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

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

P.S. Набросал короткое руководство по пользованию устройством.

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

Добавлено: Чт сен 25, 2014 11:40:53
jaxkz
Спасибо! :))
Может вы подскажете какие биты, отвечающие за тайминги, можно в прошивке поменять, чтобы поэкспериментировать и наблюдениями поделиться?

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

Добавлено: Чт сен 25, 2014 13:47:50
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 попытаться достигнуть максимально высокой скорости для своего экземпляра дисплея.

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

Добавлено: Чт сен 25, 2014 16:07:19
jaxkz
Дисплей так и не завелся. Грешил уже на мегу, хорошо их у меня 3 шт новых (для проверки распаковал :)) ), но увы.....
Задняя сторона дисплея
СпойлерИзображение
И еще вопрос, выводы ext1,ext2 и fan под что заняты в последней прошивке? Радиомодуль и аудипроцессор подключаются к одним и тем же разъемам sda и scl или ext1 и ext2, переделаны для аудиопроцессора, тогда ext1=sda ext2=scl или наоборот? :roll:

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

Добавлено: Чт сен 25, 2014 21:02:34
WiseLord
А давайте-ка проверим по-другому.

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

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

Группа контактов Ext1/Ext2/Fan используется для управления LM7001. Для других радиомодулей она не используется вообще.

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

Добавлено: Чт сен 25, 2014 21:12:29
Владимир Чеканов
проблемка стала в следующем чем лучше запрограммировать контролер и где нарыть модуль FM, по схеме посмотрев палагаю должен пойти любой FM модуль из магнитолы причём не выпаивая от туда микросхему, а использовать его целиком только распайку контактов придётся немного изменить для каждого модуля и в габаритах не вижу ни чего страшного.
P.S. хотя могу ошибаться!

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

Добавлено: Пт сен 26, 2014 08:06:29
jaxkz
А вот заработает ли у Вас ATmega32 на втором варианте
Попробую вечерком прошить, сейчас пока на работе :))
проблемка стала в следующем чем лучше запрограммировать контролер и где нарыть модуль FM
Можно самодельным программатором Громова (при наличии СОМ порта)
СпойлерИзображение
, или можно на меге 8 собрать. Я пользуюсь таким:
Спойлер1) http://aliexpress.com/item/Free-Shippin ... 21450.html 2) http://ru.aliexpress.com/item/-/2002421678.html
, радиомодули можно как вы сказали из автомагнитолы отпилить или заказать.
СпойлерИзображениеhttp://ru.aliexpress.com/item/5pcs-lot- ... 32455.html
или
СпойлерИзображениеhttp://ru.aliexpress.com/item/5pcs-lot- ... 70149.html

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

Добавлено: Пт сен 26, 2014 12:01:07
skaarjik
Крутое устройство, очень понравилось. Вот бы в него добавить поддержку лестничного регулятора громкости на реле, такого как тут http://startcd.narod.ru/reg88/index.html, софт-старт, термоконтроль на ds18b20, уменьшить число кнопок до одной, встроенной в енкодер. Я бы не задумываясь перешел на него и был бы счастлив :)

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

Добавлено: Пт сен 26, 2014 12:49:59
WiseLord
Большое обновление и синхронизация прошивок.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: Пт сен 26, 2014 14:13:34
Djony
Здравствуйте! Может кто поделится печаткой под вариант на Меге 8...

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

Добавлено: Пт сен 26, 2014 15:56:53
jaxkz
В общем, прошил вторую версию для меги 32, полет нормальный :)) С фреймбуфером никак :(

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

Добавлено: Пт сен 26, 2014 19:12:20
Александр76
Я не фанат бескислородной меди и прочих аудиофильских мифов
И это правильно.Я тоже

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

Добавлено: Сб сен 27, 2014 00:29:10
WiseLord
Обновление прошивки для ATmega32 с кадровым буфером.

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

Изображение

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

Добавлено: Сб сен 27, 2014 01:36:59
koka5555
Прошил,просто супер.

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

Добавлено: Сб сен 27, 2014 07:47:53
Александр76
И я прошил,отлично !

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

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

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

Добавлено: Сб сен 27, 2014 13:04:47
WiseLord
Это в старых прошивках. В новых длинное нажатие на первую кнопку вызывает экран регулировки яркости.

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

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

Изображение

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

Добавлено: Сб сен 27, 2014 13:15:15
котопёс
Спасибо! А как убрать эту функцию? Что бы кнопка работала только на включение-выключение.

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

Добавлено: Сб сен 27, 2014 16:26:28
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 измерений). После всё это обсчитывается и рисуется кадр спектра. Ну и всё повторяется

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

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

В общем, сейчас этого нет. Да и спектр в целом стал выглядеть более чётко.