Прежде всего хочу поблагодарить автора за отличный проект. Собрал на меге 16 - что было в наличии, RDA5807. Хочу собрать еще аудио контролер на tda7318. Когда то по случаю купил дисплей 20*2 Noritake Itron CU20025ECPB-U1J. На нем получилась отличная картинка, так как он менее инерционен. Проект адаптировал под разрешение 20*2. Но есть вопрос к автору: Данный дисплей умеет сам менять програмно яркость. Не могли бы Вы ткнуть носом что подправить в исходнике что бы управление яркостью шло не через ШИМ как сейчас, а использовать команды дисплея? В приложении краткий даташит. Спасибо.
Вероятно, опечатка в даташите. При такой комбинации RS и RW, что указана там в табличке для якобы установки яркости, на самом деле происходит запись данных в память, что в той же табличке видно.
Ага, действительно, есть какое-то хитрое включение - если сразу после команды Function Set послать байт 0b000000xx, то будет установлена яркость. Всего доступно 4 градации - 25%, 50%, 75% и 100%. Хотя может зависеть от типа модуля.
В общем, отключайте ШИМ, и врезайте в эти функции посылку нужных команд/данных
Заголовок сообщения: Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Добавлено: Сб мар 04, 2017 16:37:21
Родился
Зарегистрирован: Сб мар 04, 2017 16:27:44 Сообщений: 5
Рейтинг сообщения:0
WiseLord Доброго времени суток! Появился вопросик, можно ли сделать переключение входов PT2323 при помощи Второго энкодера, если убрать пару кнопок управления?
WiseLord Доброго времени суток. Не подскажите, как адаптировать регулировку громкости (на полный диапазон - 84дб) и тембра (регулируется только вч) под TDA7468? Изменив grid с -79 на -63, громкость регулируется, но не полностью гасит. Если ставлю -84, то до -63 регулируется также, а с -64 увеличивается и до -84 опять уменшается. А тембра имеют один субадрес и на "вч" и на "нч", разделены на старший и младший полубайт.
Насколько я понял, у этого контроллера есть два регулятора громкости. Первый, до регуляторов тембров, от -63 до 0дБ, с шагом 1дБ. Второй, после регуляторов, от -24дБ до 0дБ с шагом 8дБ.
Технически проще выставить второй постоянно на 0 (или вывести его в канал "Preamp") и регулировать его отдельно. А основную громкость - первым регулятором от -63 до 0дБ.
Либо просто программно совместить оба регулятора в один виртуальный, и регулировать как-то так:
Но я бы всё же для простоты это в отдельные регулировки вынес, "слотов" хватает. Для домашнего использования можно было бы выставить Vol2 в минимум, а основной громкости -63..0 вполне бы хватило. Нужно громче - можно отдельным регулятором поднять.
P.S. Смотрю, в даташите "виртуальная" громкость тоже как-то так и реализована.
Хотел плату начать делать, пока придут с Али комплектующие, не получается открыть pcbs.lay6, пишет "pcbs.lay6" ist keine Sprint-Layout Dadei. Что такое может быть?
WiseLord, спасибо за ответ. Я в принципе с громкостью так и сделал, -63 - 0дб. А вот как регулировать "нч" ("вч" регулируется) тембр, при едином суб-адресе не понимаю. Подскажите пожалуйста примерный код, как это реализовать.
В любой момент значения НЧ и ВЧ доступны как sndPar[MODE_SND_BASS].value и sndPar[MODE_SND_TREBLE].value (смотрите по аналогии с другими аудиопроцессорами). Поэтому при любой регулировке - НЧ или ВЧ, не важно - нужно просто посылать оба эти значения в одном байте.
Снова обращаюсь к Автору. Переделал я подсветку под Noritake Itron. Все завелось, яркость регулируется - 4 уровня. У меня к Вам просьба - не могли бы Вы посмотреть исходник во вложении на предмет того правильно ли я отмаштабировал экран спектроанализатора под индикатор 20*2? Мне кажется что нет. А также не могли бы глянуть на то правильно ли отмаштабированы шкалы (Bar) под такой индикатор. Спасибо.
if (userSybmols != LCD_LEVELS) { lcdGenLevels(); userSybmols = LCD_LEVELS; }
for (i = 0; i < 16; i++) { lcdBuf[i] = buf[2 * i] + buf[2 * i + 1]; lcdBuf[i] += buf[32 + 2 * i] + buf[32 + 2 * i + 1]; lcdBuf[i] >>= 2; }
for (i = 0; i < 16; i++) { ks0066SetXY(i, 0); if (lcdBuf[i] < 8) ks0066WriteData(0x20); else ks0066WriteData(lcdBuf[i] - 8); ks0066SetXY(i, 1); if (lcdBuf[i] < 8) ks0066WriteData(lcdBuf[i]); else ks0066WriteData(0xFF); }
Данные для спектрограммы сохраняются в массиве buf[64]. Первые 32 байта - данные для левого канала, последующие 32 - для правого. Код выше всё что делает - перекладывает эти данные в массив lcdBuf из 16 элементов. 0,1,32,33 байты buf[] => в lcdBuf[0], 2, 3, 34, 35 байты buf[] => в lcdBuf[1] и так далее. Потом уже lcdbuf[16] выводится на экран.
Нельзя просто взять и сделать lcdBuf[20], больше ничего не поменяв. В этом случае, даже если программа не упадёт, данные для 17-20 элементов всё равно будут мусором по сути.
С масштабированием тоже не всё ОК. У меня изначально в showBar:
Код:
if (min + max) { value = (int16_t)48 * (value - min) / (max - min); ... } else { value = (int16_t)23 * value / max;
Цифры не от балды. 48 - это 16 (длина строки) умноженное на 3 (количество "палочек" бара в одном знакоместе, то есть длина бара в этих "палочках". 23 это фактически то же самое, но для симметричных (тембры) баров - центральный отображается всегда, плюс есть по 23 влево и вправо. В случае длины строки 20 там, теоретически, должно быть 60 и 29.
WiseLord, замучился уже с тембрами. Скажите, при такой архитектуре секции регулировки тембров (на скриншоте), возможна независимая регулировка тембров нижних и верхних частот? У меня не получается так, при регулировке вч, изменяются высокие, но и уменшаюся низкие, и наоборот.
Возьмём, например, sndPar[MODE_SND_TREBLE].value. Диапазон -14..+14дБ с шагом 2 (используется grid_n14_14_2). В этом случае это .value будет числом от -7 до +7 - всего 15 возможных значений.
При этом значения от -7 до 0 согласно таблице выше должны превращаться в raw значения от 0 до 7 при посылке в шину, а значения от 0 до 7 - в raw значения от 15 до 8. Это согласуется с формулой val > 0 ? 15 - val : 7 + val, которая и для других аудипроцессоров применяется.
val = sndPar[MODE_SND_BASS].value; data = val > 0 ? 15 - val : 7 + val; data <<= 4;
val = sndPar[MODE_SND_TREBLE].value; data |= (val > 0 ? 15 - val : 7 + val);
I2CWriteByte(data);
I2CStop(); }
Эту функцию нужно дёргать и при регулировке тембра НЧ, и при регулировки тембра ВЧ, т.е. назначить в sndInit её на обе эти регулировки.
Практически никакой разницы с TDA7439 нет, только там на НЧ/СЧ/ВЧ выделены отдельные байты, и в tda7439SetBMT посылаются все они, один за другим (с автоинкрементом адреса). А здесь данные упаковываются в один байт согласно таблице, и посылается только этот один байт.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения