1 (2025-03-23 10:59:46 отредактировано Alex8674)

Тема: M61541fp + PT2323 на Microlab H-600

Восстановление Microlab H-600.
Отсутствие основного пульта, привело к изготовлению на основе Ардуино.
драйвера на процессор  M61541 не нашел на просторах нета. Даташит на этот процессор  сложный  вроде 24 битный
Помогите в создании M61541.cpp &M61541.h.

2

Re: M61541fp + PT2323 на Microlab H-600

На следующей неделе постараюсь написать библиотеку, Вам необходимо будет ее протестировать.

3 (2025-03-23 17:54:46 отредактировано Alex8674)

Re: M61541fp + PT2323 на Microlab H-600

пытаюсь переложить с  кода на примере
разработчик собрал на М61540 они схожи с М61541

https://forum.arduino.cc/t/interface-au … ata/922377

4

Re: M61541fp + PT2323 на Microlab H-600

Тестовый скетч

// M61541FP
// указываем пины подключения M61541FP
#define DATA    3
#define CLK     4

// treb and bass int -7...+7 === -14...+14 dB
int bass = 0, treb = 7;
// volume int 0...99 === 0...-99 dB
int volume_L = 15, volume_R = 0, volume_C = 0, volume_SW = 0, volume_SL = 0, volume_SR = 0;
// gain int 0 1 2 3 === 0 6 12 18 dB
int gain_L = 0, gain_R = 0, gain_C = 0, gain_SW = 0, gain_SL = 0, gain_SR = 0; 

void setup() {
  Serial.begin(9600);
  delay(100);
}

void loop() {
  byte_1(bass,treb);
  byte_2(gain_L, volume_L, gain_R, volume_R);
  byte_3(gain_C, volume_C, gain_SW, volume_SW);
  byte_4(gain_SL, volume_SL, gain_SR, volume_SR);
  
  delay(1000);
}

void byte_1(unsigned long bass_reg,unsigned long treb_reg){
  bass_reg = bass_treb(bass_reg);
  treb_reg = bass_treb(treb_reg);
  write_byte((bass_reg << 12) + (treb_reg << 8));
  }
void byte_2(unsigned long gain_L,unsigned long volume_L,long gain_R,long volume_R){
  write_byte((gain_L << 22) + (volume_L << 15) + (gain_R << 13) + (volume_R << 6) + 1);
  }  
void byte_3(unsigned long gain_C,unsigned long volume_C,long gain_SW,long volume_SW){
  write_byte((gain_C << 22) + (volume_C << 15) + (gain_SW << 13) + (volume_SW << 6) + 2);
  }    
void byte_4(unsigned long gain_SL,unsigned long volume_SL,long gain_SR,long volume_SR){
  write_byte((gain_SL << 22) + (volume_SL << 15) + (gain_SR << 13) + (volume_SR << 6) + 3);
  }    
  

int bass_treb(int data_tone){
  switch(data_tone){
    case 7: data_tone = 0b1111; break; // +14 dB
    case 6: data_tone = 0b1110; break; // +12 dB
    case 5: data_tone = 0b1101; break; // +10 dB
    case 4: data_tone = 0b1100; break; // +8 dB
    case 3: data_tone = 0b1011; break; // +6 dB
    case 2: data_tone = 0b1010; break; // +4 dB
    case 1: data_tone = 0b1001; break; // +2 dB
    case 0: data_tone = 0b1000; break; // 0 dB
    case -1: data_tone = 0b0001; break; // −2 dB
    case -2: data_tone = 0b0010; break; // −4 dB
    case -3: data_tone = 0b0011; break; // −6 dB
    case -4: data_tone = 0b0100; break; // −8 dB
    case -5: data_tone = 0b0101; break; // −10 dB
    case -6: data_tone = 0b0110; break; // −12 dB
    case -7: data_tone = 0b0111; break; // −14 dB
    }  
  return data_tone;
  }

void write_byte(unsigned long data){
    // 0-22 bit
    digitalWrite(CLK, LOW); delayMicroseconds(3);
    for (int i = 23; i >= 1; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);Serial.print((data >> i) & 1);
        digitalWrite(CLK, HIGH); delayMicroseconds(3);
        digitalWrite(CLK, LOW); delayMicroseconds(3);
    }
    // 23 bit  
    digitalWrite(DATA,(data << 0)& 1); delayMicroseconds(3);Serial.print((data << 0) & 1);
    digitalWrite(CLK, HIGH);delayMicroseconds(3);
    digitalWrite(DATA, HIGH);delayMicroseconds(1);// CLOCK
    digitalWrite(DATA, LOW);
    digitalWrite(CLK, LOW);delayMicroseconds(2);
    digitalWrite(CLK, HIGH);delayMicroseconds(3);
    Serial.println();
  }

5 (2025-03-26 07:06:24 отредактировано Alex8674)

Re: M61541fp + PT2323 на Microlab H-600

код Рабочий.!!!

6

Re: M61541fp + PT2323 на Microlab H-600

http://forum.rcl-radio.ru/uploads/images/2025/03/83696ae69328e043585a4a9fec58424d.png

7

Re: M61541fp + PT2323 на Microlab H-600

Громкость регулируется? Регулировка тембра работает?

8 (2025-03-31 15:40:23 отредактировано Alex8674)

Re: M61541fp + PT2323 на Microlab H-600

Протестировал осциллографом только громкость, не работает. микруха не греется, хлостой ход < 60mA на всю плату.

9

Re: M61541fp + PT2323 на Microlab H-600

// M61541FP
// указываем пины подключения M61541FP
#define DATA    3
#define CLK     4

// treb and bass int -7...+7 === -14...+14 dB
int bass = 0, treb = 7;
// volume int 0...99 === 0...-99 dB
int volume_L = 15, volume_R = 0, volume_C = 0, volume_SW = 0, volume_SL = 0, volume_SR = 0;
// gain int 0 1 2 3 === 0 6 12 18 dB
int gain_L = 0, gain_R = 0, gain_C = 0, gain_SW = 0, gain_SL = 0, gain_SR = 0; 

void setup() {
  Serial.begin(9600);
  delay(100);
}

void loop() {
  byte_1(bass,treb);
  byte_2(gain_L, volume_L, gain_R, volume_R);
  byte_3(gain_C, volume_C, gain_SW, volume_SW);
  byte_4(gain_SL, volume_SL, gain_SR, volume_SR);
  
  delay(1000);
}

void byte_1(unsigned long bass_reg,unsigned long treb_reg){
  bass_reg = bass_treb(bass_reg);
  treb_reg = bass_treb(treb_reg);
  write_byte((bass_reg << 12) + (treb_reg << 8));
  }
void byte_2(unsigned long gain_L,unsigned long volume_L,long gain_R,long volume_R){
  write_byte((gain_L << 22) + (volume_L << 15) + (gain_R << 13) + (volume_R << 6) + 1);
  }  
void byte_3(unsigned long gain_C,unsigned long volume_C,long gain_SW,long volume_SW){
  write_byte((gain_C << 22) + (volume_C << 15) + (gain_SW << 13) + (volume_SW << 6) + 2);
  }    
void byte_4(unsigned long gain_SL,unsigned long volume_SL,long gain_SR,long volume_SR){
  write_byte((gain_SL << 22) + (volume_SL << 15) + (gain_SR << 13) + (volume_SR << 6) + 3);
  }    
  

int bass_treb(int data_tone){
  switch(data_tone){
    case 7: data_tone = 0b1111; break; // +14 dB
    case 6: data_tone = 0b1110; break; // +12 dB
    case 5: data_tone = 0b1101; break; // +10 dB
    case 4: data_tone = 0b1100; break; // +8 dB
    case 3: data_tone = 0b1011; break; // +6 dB
    case 2: data_tone = 0b1010; break; // +4 dB
    case 1: data_tone = 0b1001; break; // +2 dB
    case 0: data_tone = 0b1000; break; // 0 dB
    case -1: data_tone = 0b0001; break; // −2 dB
    case -2: data_tone = 0b0010; break; // −4 dB
    case -3: data_tone = 0b0011; break; // −6 dB
    case -4: data_tone = 0b0100; break; // −8 dB
    case -5: data_tone = 0b0101; break; // −10 dB
    case -6: data_tone = 0b0110; break; // −12 dB
    case -7: data_tone = 0b0111; break; // −14 dB
    }  
  return data_tone;
  }

void write_byte(unsigned long data){
    // 0-22 bit
    digitalWrite(CLK, LOW); delayMicroseconds(3);
    for (int i = 23; i >= 1; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLK, HIGH); delayMicroseconds(3);
        digitalWrite(CLK, LOW); delayMicroseconds(3);
    }
    // 23 bit  
    digitalWrite(DATA,(data << 0)& 1); delayMicroseconds(3);
    digitalWrite(CLK, HIGH);delayMicroseconds(3);
    
    digitalWrite(DATA, HIGH);delayMicroseconds(1);// CLOCK
    digitalWrite(CLK, LOW);delayMicroseconds(1);
    digitalWrite(DATA, LOW);delayMicroseconds(1);
    digitalWrite(CLK, HIGH);delayMicroseconds(10);
    
  }

10

Re: M61541fp + PT2323 на Microlab H-600

не сработал 2й вариант. думаю чип паленый. хотя измеренные данные в норме
Input resistance Rin  4 to 7,26,27 pin 33 kΩ
Analog Supply Voltage (Positive) AVCC  6.9 V
Analog Supply Voltage (Negative) AVEE −6.9 V
Digital Supply Voltage DVDD 3.3 V

11

Re: M61541fp + PT2323 на Microlab H-600

Вроде нашел ошибку в коде

// M61541FP
// указываем пины подключения M61541FP
#define DATA    3
#define CLK     4

// treb and bass int -7...+7 === -14...+14 dB
int bass = 0, treb = 7;
// volume int 0...99 === 0...-99 dB
int volume_L = 15, volume_R = 0, volume_C = 0, volume_SW = 0, volume_SL = 0, volume_SR = 0;
// gain int 0 1 2 3 === 0 6 12 18 dB
int gain_L = 0, gain_R = 0, gain_C = 0, gain_SW = 0, gain_SL = 0, gain_SR = 0; 

void setup() {
  Serial.begin(9600);
  pinMode(DATA,OUTPUT);
  pinMode(CLK,OUTPUT);
  delay(100);
}

void loop() {
  byte_1(bass,treb);
  byte_2(gain_L, volume_L, gain_R, volume_R);
  byte_3(gain_C, volume_C, gain_SW, volume_SW);
  byte_4(gain_SL, volume_SL, gain_SR, volume_SR);
  
  delay(1000);
}

void byte_1(unsigned long bass_reg,unsigned long treb_reg){
  bass_reg = bass_treb(bass_reg);
  treb_reg = bass_treb(treb_reg);
  write_byte((bass_reg << 12) + (treb_reg << 8));
  }
void byte_2(unsigned long gain_L,unsigned long volume_L,long gain_R,long volume_R){
  write_byte((gain_L << 22) + (volume_L << 15) + (gain_R << 13) + (volume_R << 6) + 1);
  }  
void byte_3(unsigned long gain_C,unsigned long volume_C,long gain_SW,long volume_SW){
  write_byte((gain_C << 22) + (volume_C << 15) + (gain_SW << 13) + (volume_SW << 6) + 2);
  }    
void byte_4(unsigned long gain_SL,unsigned long volume_SL,long gain_SR,long volume_SR){
  write_byte((gain_SL << 22) + (volume_SL << 15) + (gain_SR << 13) + (volume_SR << 6) + 3);
  }    
  

int bass_treb(int data_tone){
  switch(data_tone){
    case 7: data_tone = 0b1111; break; // +14 dB
    case 6: data_tone = 0b1110; break; // +12 dB
    case 5: data_tone = 0b1101; break; // +10 dB
    case 4: data_tone = 0b1100; break; // +8 dB
    case 3: data_tone = 0b1011; break; // +6 dB
    case 2: data_tone = 0b1010; break; // +4 dB
    case 1: data_tone = 0b1001; break; // +2 dB
    case 0: data_tone = 0b1000; break; // 0 dB
    case -1: data_tone = 0b0001; break; // −2 dB
    case -2: data_tone = 0b0010; break; // −4 dB
    case -3: data_tone = 0b0011; break; // −6 dB
    case -4: data_tone = 0b0100; break; // −8 dB
    case -5: data_tone = 0b0101; break; // −10 dB
    case -6: data_tone = 0b0110; break; // −12 dB
    case -7: data_tone = 0b0111; break; // −14 dB
    }  
  return data_tone;
  }

void write_byte(unsigned long data){
    // 0-22 bit
    digitalWrite(CLK, LOW); delayMicroseconds(3);
    for (int i = 23; i >= 1; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLK, HIGH); delayMicroseconds(3);
        digitalWrite(CLK, LOW); delayMicroseconds(3);
    }
    // 23 bit  
    digitalWrite(DATA,(data << 0)& 1); delayMicroseconds(3);
    digitalWrite(CLK, HIGH);delayMicroseconds(3);
    
    digitalWrite(DATA, HIGH);delayMicroseconds(1);// CLOCK
    digitalWrite(CLK, LOW);delayMicroseconds(1);
    digitalWrite(DATA, LOW);delayMicroseconds(1);
    digitalWrite(CLK, HIGH);delayMicroseconds(10);
    
  }