Re: M61541fp + PT2323 на Microlab H-600
http://rcl-radio.ru/wp-content/uploads/ … 5220fp.pdf
я не вижу больше настроек которые управляют этими выходами
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Аудиопроцессоры → M61541fp + PT2323 на Microlab H-600
http://rcl-radio.ru/wp-content/uploads/ … 5220fp.pdf
я не вижу больше настроек которые управляют этими выходами
Можно попробовать на тестовом скетче запустить эти выходы
// R2A15218FP
#define DATA 2
#define CLK 3
#include "Arduino.h"
#include <Librarie_R2A15218FP_V1_1.h>
Librarie_R2A15218FP_V1_1 librarie_R2A15218FP_V1_1(DATA, CLK);
// Уровни громкости аудиоканалов (базовое значение — -40 дБ)
int cch_volume = 0; // Центральный канал (Cch)
// Диапазон регулировки: –95…+42 дБ (ослабление + усиление)
// Конфигурация: таблица Volume (0…–95 dB), колонка Cch
int srch_volume = 0; // Правый тыловой канал (SRch)
// Диапазон регулировки: –95…+42 дБ (ослабление + усиление)
// -95…0 дБ: базовое ослабление (таблица Volume, 0…–95 dB)
// 0…+42 дБ: дополнительное усиление (таблица Volume, 0…+42 dB)
int slch_volume = 0; // Левый тыловой канал (SLch)
// Диапазон регулировки: –95…+42 дБ (ослабление + усиление)
// -95…0 дБ: базовое ослабление (таблица Volume, 0…–95 dB)
// 0…+42 дБ: дополнительное усиление (таблица Volume, 0…+42 dB)
int swch_volume = 0; // Сабвуфер (SWch)
// Диапазон регулировки: –95…+42 дБ (ослабление + усиление)
// Конфигурация: таблица Volume (0…–95 dB), колонка SWch
int flch_volume = 0; // Левый фронтальный канал (FLch) — базовое ослабление
// Диапазон: –95…0 дБ (таблица Volume, 0…–95 dB)
// Дополнительное усиление для левого фронтального канала (над базовым уровнем)
int flch_volume_up = 0; // FLch Volume Up
// Диапазон усиления: 0…+42 дБ
// Конфигурация: таблица Volume (0…+42 dB), колонка FLch
int frch_volume = 0; // Правый фронтальный канал (FRch) — базовое ослабление
// Диапазон: –95…0 дБ (таблица Volume, 0…–95 dB)
// Дополнительное усиление для правого фронтального канала
int frch_volume_up = 0; // FRch Volume Up
// Диапазон усиления: 0…+42 дБ
// Конфигурация: таблица Volume (0…+42 dB), колонка FRch
// Настройки эквалайзера
int bass = 0; // Регулировка басов (BASS)
// Диапазон: –14…+14 дБ
// Позволяет корректировать низкие частоты
int treble = 0; // Регулировка высоких частот (TREBLE)
// Диапазон: –14…+14 дБ
// Управляет яркостью и детализацией звука
// Управление входными сигналами (согласно таблице Input Selector)
int sl_sr_vol_input = 0; // Чувствительность тыловых входов (SL/SR)
// Задаётся битами D18e и D19e
// Режимы (см. таблицу Input Selector):
// 00 (D18e=0, D19e=0) — Multi IN1 (первый мультивход, по умолчанию)
// Влияет на уровень входного сигнала для SL/SR
int l_r_vol_input = 0; // Входной сигнал для L/R каналов
// Управление битами D8a и D9a (см. таблицу Input Selector)
// Режимы:
// 00 (D8a=0, D9a=0) — Bypass MAIN (основной вход, без обработки) — по умолчанию
// 01 (D8a=0, D9a=1) — Multi IN1 (альтернативный источник)
// 11 (D8a=1, D9a=1) — Multi IN2 (второй альтернативный источник)
// Режимы записи
int rec_i_o = 0; // Переключение REC I/O (воспроизведение/запись)
// 0 — воспроизведение (по умолчанию)
// 1 — активация записи
int input_sub = 0; // Вспомогательный вход (INPUT SUB)
// 0 — отключён (по умолчанию)
// 1 — активирован (альтернативный источник)
// При активации использует настройки из секции IF D20a = 1 таблицы Input Selector
int input_main = 0; // Основной вход (INPUT MAIN)
// 0 — выбран основной вход (по умолчанию)
// Соответствует IN1–IN14 в таблице Input Selector (выбор основного источника)
int rec_m_s = 0; // Режим Mid/Side (REC M/S)
// 0 — отключён (по умолчанию)
// 1 — включён (захват пространственного звука: Mid + Side)
// Каналы записи (многоканальная система)
int rec5 = 0; // Канал REC 5
// 0 — неактивен (по умолчанию)
int rec4 = 0; // Канал REC 4
// 0 — неактивен (по умолчанию)
int rec3 = 0; // Канал REC 3
// 0 — неактивен (по умолчанию)
int rec2 = 0; // Канал REC 2
// 0 — неактивен (по умолчанию)
int rec1 = 0; // Канал REC 1
// 0 — неактивен (по умолчанию)
// Аттенюация перед АЦП (ATT out ADC)
int att = 0; // Ослабление сигнала
// Уровни (биты D19d, D20d):
// 00 — 0 дБ (без ослабления)
// 01 — –6 дБ
// 10 — –12 дБ
// 11 — –18 дБ (максимальное ослабление)
// Выбор источника для C/SW каналов
int c_sw_v = 0; // C/SW Vol INPUT (бит D18d)
// 0 — Multi IN1 (по умолчанию) — соответствует IN1–IN14 из таблицы
// 1 — Multi IN2 — альтернативный набор входов (см. таблицу Input Selector)
// Микширование и обход обработки
int mix = 0; // Режим микширования (MIX)
// 0 — стандартное микширование (по умолчанию)
// Другие значения меняют способ объединения каналов
int bypass = 1; // Режим обхода обработки (BYPASS)
// 1 — обработка отключена (сигнал идёт напрямую, по умолчанию)
// 0 — обработка активна (эквалайзер, эффекты включены)
// Примечания по таблице Input Selector:
// - IN1–IN14 — основные входы, выбираются через input_main
// - INA/INB — дополнительные входы, активируются при D20a = 1
// - Комбинации битов D4a–D7a, D0a–D3a определяют конкретный вход
// - По умолчанию всегда активен Multi IN1 (00 в управляющих битах)
void setup() {
// this calls the library
librarie_R2A15218FP_V1_1.R2A15218FP_V1_1(rec_i_o, bass, l_r_vol_input, input_sub, input_main, treble, flch_volume_up, flch_volume, rec_m_s, rec5, rec4, rec3, rec2, rec1, frch_volume_up, frch_volume, att, c_sw_v, swch_volume, cch_volume, sl_sr_vol_input, srch_volume, slch_volume, mix, bypass);
}
void loop() {}только 5.1 работает
Раз на 5,1 работает, значит и на стерео входах должно, просто надо подобрать значения переменных.
Данный контент доступен только зарегистрированным пользователям. на этом билиотеку есть это функция они идентичны да по логике управления
int l_r_vol_input = 0; // Входной сигнал для L/R каналов
// Управление битами D8a и D9a (см. таблицу Input Selector)
// Режимы:
// 00 (D8a=0, D9a=0) — Bypass MAIN (основной вход, без обработки) — по умолчанию
// 01 (D8a=0, D9a=1) — Multi IN1 (альтернативный источник)
// 11 (D8a=1, D9a=1) — Multi IN2 (второй альтернативный источник)
int sl_sr_vol_input = 3; // SL/SR Vol INPUT int 0,1,2,3
// Multi IN1 int 0
// Multi IN2 int 1
// S(R/L)CIN int 2
// SB(R/L)CIN int 3
когда int sbl_sbr_vol_input=1 задний тил включается но на библиотеку не предусмотрено
int sbl_sbr_vol_input=1
- из какой это библиотеки?
r2a15220af
Я не могу найти этот параметр sbl_sbr_vol_input в библиотеке
#ifndef __R2A15220FP__
#define __R2A15220FP__
#include <Arduino.h>
typedef union {
struct Da {
unsigned int address : 3; // 001
unsigned int rec_i_o : 1;
unsigned int enable_rec_out : 1;
unsigned int bass : 4;
unsigned int frt_to_sur : 1;
unsigned int fillerA : 2;
unsigned int sblsbr_vol_in : 2;
unsigned int l_r_vol_in : 2;
unsigned int input_sub : 4;
unsigned int input_main : 4;
unsigned int filler8 : 8;
} DA ;
struct ui1 { uint32_t ui; } UI1 ;
} regA ;
typedef union {
struct Db {
unsigned int address : 3; // 010
unsigned int fillerA : 2;
unsigned int treble : 4;
unsigned int flch_vol_hi : 7;
unsigned int flch_vol_lo : 8;
unsigned int filler8 : 8;
} DB ;
struct ui1 { uint32_t ui; } UI1 ;
} regB ;
typedef union {
struct Dc {
unsigned int address : 3; // 011
unsigned int recm_s : 1;
unsigned int rec5 : 1;
unsigned int rec4 : 1;
unsigned int rec3 : 1;
unsigned int rec2 : 1;
unsigned int rec1 : 1;
unsigned int frch_vol_hi : 7;
unsigned int frch_vol_lo : 8;
unsigned int filler8 : 8;
} DC ;
struct ui1 { uint32_t ui; } UI1 ;
} regC ;
typedef union {
struct Dd {
unsigned int address : 3; // 100
unsigned int ATT : 2;
unsigned int c_sw_vol : 1;
unsigned int swch_vol : 9;
unsigned int cch_vol : 9;
unsigned int filler8 : 8;
} DD ;
struct ui1 { uint32_t ui; } UI1 ;
} regD ;
typedef union {
struct De {
unsigned int address : 3; // 101
unsigned int fillerA : 1;
unsigned int sl_sr_vol_i : 2;
unsigned int srch_vol : 9;
unsigned int slch_vol : 9;
unsigned int filler8 : 8;
} DE ;
struct ui1 { uint32_t ui; } UI1 ;
} regE ;
typedef union {
struct Df {
unsigned int address : 3; // 110
unsigned int fillerB : 1;
unsigned int mix : 1;
unsigned int bypass : 1;
unsigned int sbrch_vol : 9; // Громкость SBR
unsigned int sblch_vol : 9; // Громкость SBL
unsigned int filler8 : 8;
} DF ;
struct ui1 { uint32_t ui; } UI1 ;
} regF ;
typedef union {
struct Dg {
unsigned int address : 3; // 111
unsigned int fillerA : 21;
unsigned int filler8 : 8;
} DG ;
struct ui1 { uint32_t ui; } UI1 ;
} regG ;
class R2A15220FP {
private:
uint8_t _d;
uint8_t _c;
int _front_balance; // left - right volume difference
regA Aregister;
regB Bregister;
regC Cregister;
regD Dregister;
regE Eregister;
regF Fregister;
regG Gregister;
public:
R2A15220FP(uint8_t, uint8_t);
void dump (uint8_t addr);
void send (uint32_t s);
void set_front_vol(int16_t v);
void set_center_vol(int16_t v);
void set_subwoof_vol(int16_t v);
void set_surround_vol(int16_t v);
void set_surround_back_vol(int16_t v);
void set_main_input (uint8_t which);
void set_sub_input (uint8_t which);
void set_bass (int16_t bv);
void set_treble (int16_t tv);
void set_LR_vol_input (uint8_t v);
void set_SLSR_vol_input (uint8_t v);
void set_att_out_level (uint8_t v);
void set_tone_bypass (bool v);
void set_mix_plus_tone_bypass (bool v);
void set_cent_subw_vol_input (bool v);
void set_rec_input_main_sub (bool v);
void set_recN (uint8_t n, bool v);
void set_rec_i_o_bypass (bool v);
void set_SBLSBR_vol_input (uint8_t v);
void set_front_to_surround_input (bool b);
void set_enable_rec_out(bool b);
void set_mystery_A_v(uint8_t v);
void set_mystery_B_v(uint8_t v);
void set_mystery_F_v(uint8_t v);
void set_mystery_F_b(bool b);
void set_mystery_G_v(uint8_t v);
void set_front_balance(int v);
};
#endif#include "r2a15220fp.h"
#include <Arduino.h>
#define BIT_DELAY 2
static const uint8_t tone_lookup[16] = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0 };
R2A15220FP::R2A15220FP(uint8_t data, uint8_t clock) {
this->_d = data;
this->_c = clock;
this->_front_balance = 0;
this->Aregister.DA.address = 1;
this->Bregister.DB.address = 2;
this->Cregister.DC.address = 3;
this->Dregister.DD.address = 4;
this->Eregister.DE.address = 5;
this->Fregister.DF.address = 6;
this->Gregister.DG.address = 7;
// Автоматически направляем сигнал с входов SBLCIN/SBRCIN
this->Aregister.DA.sblsbr_vol_in = 2;
pinMode(this->_c, OUTPUT);
pinMode(this->_d, OUTPUT);
digitalWrite(this->_c, LOW);
digitalWrite(this->_d, LOW);
// Сразу отправляем настройку входа в чип
send(Aregister.UI1.ui);
}
void R2A15220FP::dump (uint8_t address) {
uint32_t ui32;
switch(address) {
case 1 : ui32 = Aregister.UI1.ui; break;
case 2 : ui32 = Bregister.UI1.ui; break;
case 3 : ui32 = Cregister.UI1.ui; break;
case 4 : ui32 = Dregister.UI1.ui; break;
case 5 : ui32 = Eregister.UI1.ui; break;
case 6 : ui32 = Fregister.UI1.ui; break;
case 7 : ui32 = Gregister.UI1.ui; break;
}
Serial.printf("%c: ", ('A' - 1) + address);
for(int i = 0 ; i < 24 ; i++) {
Serial.printf("%1d ", (unsigned int)((ui32 & 0x800000) >> 23));
if(!((i+1) % 8)) Serial.printf(" ");
ui32 <<= 1;
}
Serial.printf("\n");
}
void R2A15220FP::send (uint32_t s) {
for(int i = 0 ; i < 23 ; i++) {
digitalWrite(_d, (s & 0x800000) >> 23);
delayMicroseconds(BIT_DELAY);
digitalWrite(_c, HIGH);
delayMicroseconds(BIT_DELAY);
digitalWrite(_d, LOW);
delayMicroseconds(BIT_DELAY);
digitalWrite(_c, LOW);
delayMicroseconds(BIT_DELAY);
s <<= 1;
}
digitalWrite(_d, (s & 0x800000) >> 23);
delayMicroseconds(BIT_DELAY);
digitalWrite(_c, HIGH);
delayMicroseconds(BIT_DELAY);
digitalWrite(_d, HIGH);
delayMicroseconds(BIT_DELAY);
digitalWrite(_c, LOW);
delayMicroseconds(BIT_DELAY);
digitalWrite(_d, LOW);
}
void R2A15220FP::set_front_vol(int16_t v) {
int16_t lv = v + (_front_balance >> 1);
int16_t rv = v - (_front_balance >> 1);
if(lv <= 0) {
Bregister.DB.flch_vol_hi = 0;
if(lv < -190) { lv = -190; };
Bregister.DB.flch_vol_lo = 0 - lv;
}
else {
Bregister.DB.flch_vol_lo = 0;
if(lv > 84) { lv = 84; }
Bregister.DB.flch_vol_hi = lv;
}
if(rv <= 0) {
Cregister.DC.frch_vol_hi = 0;
if(rv < -190) { rv = -190; };
Cregister.DC.frch_vol_lo = 0 - rv;
}
else {
Cregister.DC.frch_vol_lo = 0;
if(rv > 84) { rv = 84; }
Cregister.DC.frch_vol_hi = rv;
}
send(Bregister.UI1.ui);
send(Cregister.UI1.ui);
}
void R2A15220FP::set_subwoof_vol(int16_t v) {
if(v <= 0) {
if(v < -190) { v = -190; };
Dregister.DD.swch_vol = 0 - v;
}
else {
if(v > 84) { v = 84; }
Dregister.DD.swch_vol = v + 384;
}
send(Dregister.UI1.ui);
}
void R2A15220FP::set_center_vol(int16_t v) {
if(v <= 0) {
if(v < -190) { v = -190; };
Dregister.DD.cch_vol = 0 - v;
}
else {
if(v > 84) { v = 84; }
Dregister.DD.cch_vol = v + 384;
}
send(Dregister.UI1.ui);
}
void R2A15220FP::set_surround_vol(int16_t v) {
if(v <= 0) {
if(v < -190) { v = -190; };
Eregister.DE.srch_vol = 0 - v;
Eregister.DE.slch_vol = 0 - v;
}
else {
if(v > 84) { v = 84; }
Eregister.DE.srch_vol = v + 384;
Eregister.DE.slch_vol = v + 384;
}
send(Eregister.UI1.ui);
}
void R2A15220FP::set_main_input (uint8_t which) {
Aregister.DA.input_main = --which;
Aregister.DA.rec_i_o = (which == 0x0b || which == 0x0c) ? 1 : 0;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_SBLSBR_vol_input (uint8_t v) {
Aregister.DA.sblsbr_vol_in = v;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_front_to_surround_input (bool b) {
Aregister.DA.frt_to_sur = b;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_mystery_A_v(uint8_t v) {
Aregister.DA.fillerA = v;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_enable_rec_out(bool b) {
Aregister.DA.enable_rec_out = b;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_sub_input (uint8_t which) {
Aregister.DA.input_sub = --which;
Aregister.DA.rec_i_o = (which == 0x0b || which == 0x0c) ? 1 : 0;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_bass (int16_t bv) {
if(bv > 14) { bv = 14; }
if(bv < -14) { bv = -14; }
bv += 14;
Aregister.DA.bass = tone_lookup[bv/2];
send(Aregister.UI1.ui);
}
void R2A15220FP::set_treble (int16_t tv) {
if(tv > 14) { tv = 14; }
if(tv < -14) { tv = -14; }
tv += 14;
Bregister.DB.treble = tone_lookup[tv/2];
send(Bregister.UI1.ui);
}
void R2A15220FP::set_mystery_B_v(uint8_t v) {
Bregister.DB.fillerA = v;
send(Bregister.UI1.ui);
}
void R2A15220FP::set_LR_vol_input (uint8_t v) {
v &= 0x03;
if(v == 2) return;
Aregister.DA.l_r_vol_in = v;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_SLSR_vol_input (uint8_t v) {
v &= 0x03;
Eregister.DE.sl_sr_vol_i = v;
send(Eregister.UI1.ui);
}
void R2A15220FP::set_att_out_level (uint8_t v) {
v &= 0x03;
Dregister.DD.ATT = v;
send(Dregister.UI1.ui);
}
void R2A15220FP::set_tone_bypass (bool b) {
Fregister.DF.bypass = b;
send(Fregister.UI1.ui);
}
void R2A15220FP::set_mix_plus_tone_bypass (bool b) {
Fregister.DF.mix = b;
send(Fregister.UI1.ui);
}
void R2A15220FP::set_mystery_F_v(uint8_t v) {
send(Fregister.UI1.ui);
}
void R2A15220FP::set_mystery_F_b(bool b) {
Fregister.DF.fillerB = b;
send(Fregister.UI1.ui);
}
void R2A15220FP::set_mystery_G_v(uint8_t v) {
send(Gregister.UI1.ui);
}
void R2A15220FP::set_cent_subw_vol_input (bool b) {
Dregister.DD.c_sw_vol = b;
send(Dregister.UI1.ui);
}
void R2A15220FP::set_rec_input_main_sub (bool v) {
Cregister.DC.recm_s = v;
send(Cregister.UI1.ui);
}
void R2A15220FP::set_recN (uint8_t n, bool v) {
switch(n) {
case 1 : Cregister.DC.rec1 = v; break;
case 2 : Cregister.DC.rec2 = v; break;
case 3 : Cregister.DC.rec3 = v; break;
case 4 : Cregister.DC.rec4 = v; break;
case 5 : Cregister.DC.rec5 = v; break;
}
send(Cregister.UI1.ui);
}
void R2A15220FP::set_rec_i_o_bypass (bool v) {
Aregister.DA.rec_i_o = v;
send(Aregister.UI1.ui);
}
void R2A15220FP::set_front_balance(int v) {
_front_balance = v;
}
// ИСПРАВЛЕНО: Громкость для SBL/SBR со смещением +256 (согласно даташиту)
void R2A15220FP::set_surround_back_vol(int16_t v) {
if(v <= 0) {
if(v < -190) { v = -190; };
Fregister.DF.sbrch_vol = 0 - v;
Fregister.DF.sblch_vol = 0 - v;
}
else {
if(v > 84) { v = 84; }
// Используем 256 как бит Gain
Fregister.DF.sbrch_vol = v + 256;
Fregister.DF.sblch_vol = v + 256;
}
// Выключаем mix/bypass, чтобы сигнал 100% шел на выход
Fregister.DF.mix = 0;
Fregister.DF.bypass = 0;
send(Fregister.UI1.ui);
}Я не могу найти этот параметр sbl_sbr_vol_input в библиотеке
блин звук серавно нету я не знаю что за проблема или написать библиотеку с нуля
Вроде как нашел ошибку в библиотеке, в файле .cpp
найдите строки
if (l_r_vol_input == 0) var4 = 0b00000000;
if (l_r_vol_input == 1) var4 = 0b00000010;
if (l_r_vol_input == 2) var4 = 0b00000011;
замените на
if (l_r_vol_input == 0) var4 = 0b00000000;
if (l_r_vol_input == 1) var4 = 0b00000001;
if (l_r_vol_input == 2) var4 = 0b00000011;
должно быть 00 01 11, а в библиотеке 00 10 11
ок вечером буду изменить
Вроде как нашел ошибку в библиотеке, в файле .cpp
найдите строки
if (l_r_vol_input == 0) var4 = 0b00000000;
if (l_r_vol_input == 1) var4 = 0b00000010;
if (l_r_vol_input == 2) var4 = 0b00000011;замените на
if (l_r_vol_input == 0) var4 = 0b00000000;
if (l_r_vol_input == 1) var4 = 0b00000001;
if (l_r_vol_input == 2) var4 = 0b00000011;
![]()
должно быть 00 01 11, а в библиотеке 00 10 11
forum.rcl-radio.ru → Аудиопроцессоры → M61541fp + PT2323 на Microlab H-600
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|
|