Страница 1 из 1
Управление микросхемой M62446AFP
Добавлено: Чт авг 07, 2014 20:30:43
Explorer200
Здравствуйте!
Есть сабвуфер Sven HT-485, но нет к нему ПДУ, что делает его полностью бревном. (да, купить пульт проще... но не интересно и затратно )
Так то он работает, но было решено срезать часть мозгов (можно сказать основных) это микроконтроллер, который управляет кодеком и 6-ти канальным регулятором громкости/баса/тембра, и собственно сам кодек! Но суть вопроса не в этом.
Имеется Arduino Mega2560, микросхема M62446AFP (выводы управления имеют названия CLK, DATA, LATCH), а так же даташит к микросхеме.
Помогите разобраться, что означают буквы с цифрами D01,D11,D21,D31 и т.д. (стр. 8-12)
если возможно, напишите кусок кода с примером установки значения, например для установки басса +0dB
П.С. как я понимаю данные передаются по интерфейсу i2c...
Re: Управление микросхемой M62446AFP
Добавлено: Пт авг 08, 2014 17:39:41
kalobyte
Explorer200 писал(а):П.С. как я понимаю данные передаются по интерфейсу i2c..
по спи
Explorer200 писал(а):что означают буквы с цифрами D01,D11,D21,D31 и т.д.
там же написано на 8й странице
д0... отвечают за уровень высоких частот
Explorer200 писал(а):напишите кусок кода с примером установки значения, например для установки басса +0dB
лень писать код, это очень большие мозговые затраты
алгоритм такой:
мелкасхема управляется одной посылкой 16 бит, т.е. тебе нужна рабочая переменная типа инт
есть 4 вида посылок и отличаются они ключом из пары первых 2х бит де и дф
возьмем самый простой пример регулировки громкости стереовхода (диаграмма 2, стр 7)
тебе нужна маска из первых 2х бит, которая будет определять режим
#define VOLUME_RL 1
так же тебе нужны 2 переменные volume_l volume_r
в них загоняеш значение от 0 до 80, что будет соответствовать регулировке громкости от 0 до -80дб, что должно хватать
все просто
потом делаеш магию
data = data | (volume_l<<8)
data = data | (volume_r<<2)
data = data | VOLUME_RL
так формируеш переменну и посылаеш ее в регистр аппаратного спи контроллера и все
то же самое для других режимов, только маски надо задать дефайном, сдвинуть на нужное количество бит и наложить маску по ИЛИ
Re: Управление микросхемой M62446AFP
Добавлено: Сб авг 09, 2014 11:31:40
Explorer200
kalobyte писал(а):Explorer200 писал(а):П.С. как я понимаю данные передаются по интерфейсу i2c..
по спи
немного не ожиданно, так как SPI использую в основном для внутрисхемного программирования, к тому же имеет 4 вывода, а в моем случае всего 3
kalobyte писал(а):
Explorer200 писал(а):что означают буквы с цифрами D01,D11,D21,D31 и т.д.
там же написано на 8й странице
д0... отвечают за уровень высоких частот
это то я понял, почему то когда увидел эти таблицы, вспомнилось рисование символов для LCD, но на него есть готовая библиотека...
kalobyte писал(а):
Explorer200 писал(а):напишите кусок кода с примером установки значения, например для установки басса +0dB
лень писать код, это очень большие мозговые затраты
алгоритм такой:
мелкасхема управляется одной посылкой 16 бит, т.е. тебе нужна рабочая переменная типа инт
есть 4 вида посылок и отличаются они ключом из пары первых 2х бит де и дф
возьмем самый простой пример регулировки громкости стереовхода (диаграмма 2, стр 7)
тебе нужна маска из первых 2х бит, которая будет определять режим
#define VOLUME_RL 1
так же тебе нужны 2 переменные volume_l volume_r
в них загоняеш значение от 0 до 80, что будет соответствовать регулировке громкости от 0 до -80дб, что должно хватать
все просто
потом делаеш магию
data = data | (volume_l<<8)
data = data | (volume_r<<2)
data = data | VOLUME_RL
так формируеш переменну и посылаеш ее в регистр аппаратного спи контроллера и все
то же самое для других режимов, только маски надо задать дефайном, сдвинуть на нужное количество бит и наложить маску по ИЛИ
уже становится более понятно, это понятно data = data | (volume_r<<2), пропускаются два правых разряда, которые выбирают режим для настройки.
а вот это не понятно data = data | (volume_l<<8) почему на 8 сдвиг, а не на 9, ведь правые два разряда +7 разрядов настройки правого канала = 9
осталось по шарить как работать по SPI
Re: Управление микросхемой M62446AFP
Добавлено: Сб авг 09, 2014 20:12:19
Explorer200
вот только остается не понятно что делать с портами latch и clk оставить в покое?
Код: Выделить всё
int latchPin = 8;
int dataPin = 11;
int clockPin = 12;
int volume_l = 20;
int volume_r = 20;
int data;
#define VOLUME_RL 1
void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
data = data | (volume_l<<8);
data = data | (volume_r<<2);
data = data | VOLUME_RL;
digitalWrite(dataPin, data);
}
что то на калякал, надо будет проверить, а пока так компилировалось
пока что в статичном варианте, дабы мозг сильно не насиловать
п.с. делаю для ардуины
Re: Управление микросхемой M62446AFP
Добавлено: Сб авг 09, 2014 23:50:42
kalobyte
Explorer200 писал(а): так как SPI использую в основном для внутрисхемного программирования
спи используется для синхронной последовательной передачи в 2 направления на много устройств
и2ц может передавать только на 127 и только в одном направлении
протоколы не привязаны ни к чему
Explorer200 писал(а):а в моем случае всего 3
сигнал выборки устройства се, данные и тактовый
4й данные в обратную сторону, но в твоем случае мс не передает ничего
Explorer200 писал(а):почему на 8 сдвиг, а не на 9,
может и 9, сейчас не помню и вполне мог протупить
я ж говорю, что надо писать код на живом примере
Explorer200 писал(а):осталось по шарить как работать по SPI
на сцайте быдлодуиды же есть мануал и там точно есть железный спи
если хочеш софтовый, то у меня на сцайте смотри посты про регистры, там готовый код
алгоритм такой
выставить сигнал разрешения в 1 или 0 по даташиту
выставить 1 или 0 на выводе данных
дернуть клок 1 раз
сдвинуть на 1 бит ту переменную, что хранит 16 бит данных для посылки в мс
и так 16 раз в цикле
подробности у меня на сцайте расписаны проще некуда
Re: Управление микросхемой M62446AFP
Добавлено: Вс авг 10, 2014 08:35:10
Explorer200
kalobyte писал(а):
алгоритм такой
выставить сигнал разрешения в 1 или 0 по даташиту
выставить 1 или 0 на выводе данных
дернуть клок 1 раз
сдвинуть на 1 бит ту переменную, что хранит 16 бит данных для посылки в мс
и так 16 раз в цикле
подробности у меня на сцайте расписаны проще некуда
чего я и боялся, это усложняет дело
Re: Управление микросхемой M62446AFP
Добавлено: Вс авг 10, 2014 23:49:54
kalobyte
ну так проще использовать аппаратный спи
правда он там вроде бы 8 битный, так что придется порезать
Re: Управление микросхемой M62446AFP
Добавлено: Пн авг 11, 2014 09:17:29
Explorer200
Код: Выделить всё
#include <LiquidCrystal.h>
LiquidCrystal lcd(52, 50, 48, 46, 44, 42);
//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
int volume_l = 20;
int volume_r = 20;
int nastr=1;
int data;
int govno;
int rez;
void setup() {
lcd.begin(16, 2);
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
data = data | (volume_l<<9);
data = data | (volume_r<<2);
data = data | nastr;
govno=data;
for (int i = 0; i < 16; i++) {
rez=!!(govno&(1<<i+2));
delay(50);
lcd.print(rez);
lcd.setCursor(0, 1);
lcd.print(i);
lcd.setCursor(5, 1);
lcd.print(govno);
delay(300);
lcd.clear();
}
}
пока что пытаюсь вывести результат действий цикла на лсд
выходит так, data = 10321, с подобранным (методом тыка) сдвигом вылазит это: 0010100001010000
как видно, съедает один последний бит (или больше...). Должно быть : 0010100001010001
п.с. пример использовал от сдвигового регистра
Re: Управление микросхемой M62446AFP
Добавлено: Пн авг 11, 2014 14:36:27
kalobyte
rez=!!(govno&(1<<i+2));
херня какая-то
лучше передавай в консоль вывод