Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

ПБ для PT2322 и PT2323

Создаем свой блок. Вопросы, помощь знатоков.
kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Разработка пользовательского блока для звукового процессора 5.1 на PT2322

#21

Сообщение kalobyte » 04.09.2018{, 19:42}

#define MASTER_VOLUME_10STEP 0xe0#define SYSTEM_RESET 0xff
перенести на новую строку #define SYSTEM_RESET 0xff

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Разработка пользовательского блока для звукового процессора 5.1 на PT2322

#22

Сообщение kalobyte » 04.09.2018{, 19:57}

void PT2322::rightVolume(unsigned charr frv)
ошибка в charr , одну букву р убери

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#23

Сообщение Sancho » 17.09.2018{, 14:12}

av, Думаю, библиотека лишнее. Используй функции.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#24

Сообщение kalobyte » 05.10.2018{, 16:51}

у тебя 2 раза повторяется
void pt2323(byte command);

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#25

Сообщение Sancho » 05.10.2018{, 17:16}

av, Я думал, даже уверен, что всё можно сделать намного проще!
Сейчас сделаю макетик/набросок... Может завтра - смена заканчивается.

Отправлено спустя 16 минут 7 секунд:
kalobyte писал(а):
05.10.2018{, 16:51}
у тебя 2 раза повторяется
void pt2323(byte command);
Согласен, и последняя точно лишняя вместе с содержимым!

Отправлено спустя 3 минуты :

Код: Выделить всё

byte input, enhancement, mix6db, mute, mode;
это IDE напрямую "проглотит", а блок FLProg - нет, надо каждую переменную объявлять отдельно:

Код: Выделить всё

byte input;
byte enhancement;
//....
Отправлено спустя 5 минут :
Микруха - просто селектор и ещё чуть чуть...
Посмотрел код- всё очень даже красиво!
Я бы дискретные сигналы, enhancement, mix6db, mute, привёл к типу bool, что-бы не путаться.
переменную mode не нашёл, кроме объявления :(
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#26

Сообщение kalobyte » 05.10.2018{, 19:45}

av писал(а):
05.10.2018{, 18:09}
Так же никак не врубаюсь как создать функции отправки в шину только при изменении значений переменных. Вроде понимаю,что нужно сравнивать промежуточную переменную с переменной входа а вот как организовать все это не хватает знаний.
очень просто, но как я обычно говорю - программировать под веб это одно, программировать под линупс это другое, писать под виндовс это третье, а под флпрог это сооовсем другая концепция написания кода для блоков

ты наверное работал с блоком епром? для записи там есть вход enable и он позволяет однократно записать в пзу
для этого сначала выставляем данные и потом дергаем тт триггером вход разрешения записи

с точки зрения твой код будет выглядеть так
if (enable){
все функции твоего кода
}

в флпрог при нажатии какой кнопки тебе надо еще подавать сигнал на вход разрешения

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#27

Сообщение Sancho » 05.10.2018{, 20:13}

av, Функцию не сделаешь - гиморно, но можно. Массив придётся собрать и цикл вставлять.
Для начала просто, по условию, писали раньше, сравниваешь xxx с old_xxx, если не совпадают - шлёшь, и заодно old_xxx присваиваешь значение xxx.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#28

Сообщение Sancho » 05.10.2018{, 20:24}

av писал(а):
05.10.2018{, 20:19}
а как быть при инициализации
Как угодно - шли что хочешь, заодно этим инициализируй old_xxx
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#29

Сообщение Sancho » 05.10.2018{, 20:29}

av писал(а):
05.10.2018{, 20:28}
насчет библиотеки для PT2323 в 50-ом посте, что скажете ?
Не сегодня, завтра на работе гляну.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#30

Сообщение kalobyte » 05.10.2018{, 20:30}

ты не понял
вход разрешения записи в пзу это абстгактный вход
с точки зрения кода для записи в пзу надо вызвать одну функцию и передать ей адрес и данные
в лупе эта функция будет вызываться постоянно, если код сгенерить флпрогом
поэтому чтобы этв функция выполнилась когда нужно, то ее _оборачивают_ в конструкцию вида if (enable){}

и когда в схеме уже будет enable == true, только тогда выполнится запись или передача команд
это оверхед, который можно было бы избежать, если бы ты писал руками код
но флпрог дает тебе скорость и простоту написания, но платиш ты за это ресурсами типа памяти и скорости

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#31

Сообщение kalobyte » 05.10.2018{, 21:23}

av писал(а):
05.10.2018{, 20:35}
Вы уж извините !
да я это не к тому, а что когда вообще код пишется руками, то там концепция построения каркаса проги совсем другая
кстати в этом и заключается умение писать код - знать паттерны программирования и уметь их применять

я тут порылся, может эта инфа будет полезной для понимания теории конечных автоматов и как одна из концепций написания прошивок
http://popayaem.ru/konechnye-avtomaty-k ... parok.html
http://easyelectronics.ru/avr-uchebnyj- ... tomat.html

еще есть операционные системы реального времени
там еще проще, но оверхед больше и надо потратить время на изучение ее

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#32

Сообщение kalobyte » 05.10.2018{, 23:34}

av писал(а):
05.10.2018{, 21:54}
Даже простейшая функция мне непонятна.
ну это как в математике
y = f(x), где f(x) = x+2
такое же решал?

в коде это записывается такъ
int y;
---
int f(int x) { return x+2;}

вызывается так
y = f(2);
printf(y);
на экране получим 4

объясняю на примере дихальтовской статьи
СпойлерПоказать

Код: Выделить всё

void Blink(void)
{
if (Blink_State == 1)
	{
	Led_On();
	Blink_State = 0;
	Return;
	}
if (Blink_State == 0)
	{
	Led_Off();
	Blink_State = 1;
	Return;
	}
}
у нас есть переменная Blink_State
в зависимости от ее состояния выполняются какие-то действия + обязательно изменить состояние этой переменной на нужное

если мы выключили диод, то в следущий раз его надо включить (т.е. состояние Blink_State должно быть уже 1, т.к. включение светодиода у нас вызывается в блоке, где условие в круглых скобках Blink_State == 1

в флпроге такое не предусмотрено, зато на многих блоках есть вход разрешения
подав туда единицу, мы разрешаем выполнять код, который сгенерирует этот блок
т.е. мы так же делаем условие if (enable == true) { led_on();}

тут возникает второй вопрос: у меня много кнопок и значит будет много состояний, как тогда действовать?
для этого есть другой вид записи

сначала мы делаем перечисления всех состояний автомата
enum function {FMasterVolume, FFrontLeftVolume, FFrontRightVolume,
FCenterVolume, FRearLeftVolume, FRearRightVolume, FSubVolume,
FBass, FMiddle, FTreble, F3D, FToneDefeat, FEnd};

задаем начальное состояние автомата
// startup state
int currentFunction = FMasterVolume; // вот эта строчка
int mute = false;
int mode = DISPLAYMODE;

дальше там есть кнопка функций мелкасхемы этой
когда мы ее нажимаем, то каждый раз на экране загорается новый режим
void loop()
{
// read function button
int functionButton = deBounceRead(FUNCTIONPIN);
if (functionButton == HIGH){
currentFunction++;
if (currentFunction == FEnd) // если мы достигли конца, то выставляем дефолтный режим FMasterVolume
currentFunction = FMasterVolume;
displayFunction();
mode = EDITINGMODE;
}
в таком режиме регулируется громкость кнопками +-
в других режимах регулируется какой-то другой параметр

что происходит, когда мы нажимаем кнопку вверх?
// read up button
int upButton = deBounceRead(UPPIN);
if (upButton == HIGH && mode == EDITINGMODE){
if (currentFunction > FTreble)
functionValues[currentFunction] = !functionValues[currentFunction];
else{
if (functionValues[currentFunction] < maxValues[currentFunction])
functionValues[currentFunction] += 1;
}
displayFunction();
}
вот интересная строчка
if (upButton == HIGH && mode == EDITINGMODE){

у нас тут при нажатии кнопки проверяется не просто ее нажатие, но одновременно еще состояние машины
а их 2
#define DISPLAYMODE 0
#define EDITINGMODE 1
&& это логическое И, только не побитовое, а именно логическое для frue/false

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

в флпрог это делается путем посылки данных + сигнала запись этих данных в виртуальный блок

как вариант - можно сделать блок, у которого будет вход инт и каждое число это будет режим мелкасхемы
регулировка громкости 1, баланс 2, тембр 3
и еще входы +-

после последнего нажатия ждем пару секунд и сбрасывает вход на 1, который отвечает за регулировку громкости используется чаще всего

Отправлено спустя 5 минут 25 секунд:
вот еще почитай теорию
http://easyelectronics.ru/avr-uchebnyj- ... gramm.html
вот так, генерируемый флпрогом код это и есть суперцикл
т.к. код сгенерен прогой для проги, то нам нет смысла разбираться в этом наборе букв, для нас он не имеет смысла, важно чтобы компилятор переварил это

а когда мы делаем сложные ветвления, то тут применются все остальные методы конструкции проги

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#33

Сообщение Sancho » 06.10.2018{, 09:43}

kalobyte писал(а):
05.10.2018{, 23:39}
в коде это записывается такъ
int y;
---
int f(int x) { return x+2;}

вызывается так
y = f(2);
printf(y);
на экране получим 4
av писал(а):
06.10.2018{, 00:05}
Вот даже здесь не понятно. Если это математика, то как вы получили х+2 если f умножено на (х), и откуда взята 2.

Код: Выделить всё

int y; // объявляем переменную y
---  // другие действия: объявы, loop , setup,...
int f(int x) { return x+2;} // описываем функцию:  возвращаемые данные типа int, называется f,
// (аргумент х с типом данных int), может быть несколько
// { тело функции: вернём принятый аргумент, предварительно прибавив 2}

// вызывается так в секции loop
y = f(2); // вызываем функцию f и передаём ей аргумент 2, то что вернёт - присвоим y
printf(y); // печатаем y
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#34

Сообщение Sancho » 06.10.2018{, 10:26}

av писал(а):
06.10.2018{, 10:05}
вот так можно записать функцию mode
Да, но я стараюсь не использовать одни и те-же имена снаружи и внутри функций.
Если, к примеру, отправляю address, то внутренний аргумент называю _address, или нарочно неправильно adres, т.е.

Код: Выделить всё

myfunction(address_reg, value); // вызываю функцию, адрес регистра и значение, в секции loop

void myfunction( uint16_t adres_reg, uint8_t znachen) // описываю аргументы
{
    Wire.beginTransmission(0x4F);
    Wire.write((int)( adres_reg >> 8));
    Wire.write((int)( adres_reg & 0xFF));
	Wire.write(  znachen );
	Wire.endTransmission();
}
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#35

Сообщение kalobyte » 06.10.2018{, 11:03}

av писал(а):
06.10.2018{, 00:05}
Вот даже здесь не понятно.
как я тебя понимаю :D
когда-то давно я так же в школе сидел и не мог понять, что за функции, откуда х+2, зачем она что-то возвращает
я их понял только когда стал заниматься программированием, а там вполне наглядно показали смысл функций
av писал(а):
06.10.2018{, 00:05}
Если это математика, то как вы получили х+2 если f умножено на (х), и откуда взята 2.
х+2 это я взял из головы как самый простой пример
и ф не умножено на (х), в математике это читается как ф от х

в твоем примере это может быть
n = getButton();
нажимаеш на какую-то кнопку, а в переменную н у тебя помещается какое-то число по номеру кнопки

в данном случае функция без аргументов, но выдает результат работы
есть просто функция, которая без входа и без выхода
void initPT2323() { // Функция инициализации PT2323
setMute();
delay(300);
setInput();
setSurroundEnhancement();
setMixerChannel6Db();
pt2323();
}

смысл ее скорее в разделении кода для понятливости
мы видим название функции и по нему понимаем ее смысл
мы видим другие название и тоже понимаем, что происходит

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

так например управлять мелкасхемами не трудно, весь смысл в их управлении - слать правильные байты туда или получать от туда
трудность как раз в понимании даташита и принципа работы сложных мелкасхем типа трансиверов 2401 или подобных, где куча регистров

Отправлено спустя 8 минут 36 секунд:
av писал(а):
06.10.2018{, 10:55}
Sancho, а зачем вы указали для аргумента "adres_reg" двух байтный размер и в последствии сдвигаете его на 8. Ведь эта переменная восьми разрядная. И далее вы применяете логическое "И". Все это пока для меня сложновато.
скачай калькулятор
http://www.speqmath.com/
без него такие конструкции действительно непонятны и пока не попробуеш, то ничего не поймеш
воткак пример
0 << 3
Ans = 0

(2 & 7) << 3
Ans = 16
и вот еще калькулятор
https://sites.google.com/site/bincalc/
http://www.jpuhlmann.net/software_bitcalc.html

они помогут разобраться в этих сдвигах и пригодятся при написании прог в любом случае

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#36

Сообщение Sancho » 06.10.2018{, 11:30}

av писал(а):
06.10.2018{, 10:55}
Sancho, а зачем вы указали для аргумента "adres_reg" двух байтный размер
Это пример, касается микросхем, у которых адреса регистров двух-байтные, пример посылки:
2018-10-06_11-29-37.png
поэтому сначала из адреса достаю старший байт, сдвинув исходное вправо на восемь байт - как раз в младшем байте окажется старший, а в старших разрядах нули, потом побитно делаю "И" исходного с восьмью нулями и восьмью единицами - результат тот-же, только остаётся "голый" младший байт.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#37

Сообщение kalobyte » 06.10.2018{, 13:00}

av писал(а):
06.10.2018{, 11:52}
они что просто отбрасываются ?
он наверное ошибся в коде
что-то этот код как-то не для 2323, в даташите нет никакого регистра адреса
или этот код не для 2323?

Отправлено спустя 5 минут 54 секунды:
вот кусок для 2323
там всего один байт команды
void pt2323(byte command)
{
Wire.beginTransmission(74); // transmit to device 0x94(hex) -> 148(dec)(addressing is 7-bit) -> 148/2
switch(command)
{
case 0:
Wire.send(0xc7); // 6-ch input
break;
case 4:
Wire.send(0xc8); // stereo 4 input
break;
case 3:
Wire.send(0xc9); // stereo 3 input

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#38

Сообщение kalobyte » 06.10.2018{, 13:16}

av,
а для какой мс этот пример? такие операции с битами часто встречаются
например есть регистр адреса и он 3 бита всего
это 2 в 3 степени - 8 и еще остается 5 бит на данные

как запаковать в 1 байт и адрес, и данные из переменной, которая всегда 8 бит?
вот тут и применяются сдвиги и маски типа 0xFF или можно обрезать полбайта 0x0F

попробуй на тех калькуляторах, что я тебе дал, так словами это не объяснить, обязательно практика нужна
av писал(а):
06.10.2018{, 13:10}
чтобы отправка была только по изменению значения на входах блока
сделать вход enable для всего блока, как это сделано для блока запись в епром
я тебе вчера же показывал пример

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#39

Сообщение Sancho » 06.10.2018{, 13:37}

av, Мне кажется, идея, предложенная kalobyte, с + и -, но и вход управления режимами сделать не int, а также +-, добавив несколько выходов: какой режим, какое текущее значение, может ещё что.
Это позволит упростить код, создав массивы, уменьшит количество функций, как в первоисточнике.
А меню - дело поправимое...
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

kalobyte
Лейтенант
Сообщения: 422
Зарегистрирован: 22.10.2016{, 14:22}
Репутация: 28

Пользовательские блоки аудиопроцессоров на PT2322 и PT2323

#40

Сообщение kalobyte » 06.10.2018{, 13:57}

av писал(а):
06.10.2018{, 13:47}
Возможно я до сих пор не понимаю концепцию такого построения.
да все просто
ic.png
ic.png (4.54 КБ) 824 просмотра
вот типа модуль
у него есть кнопки прибавить и убавить
и есть вход инт, куда подается число с модуля меню, когда ты выбираеш там регулировать громкость, тембр, баланс или еще чего

если стоит 0, то модуль не реагирует никак

av,
а что на практике показывает, если в мелкасхему будут отправляться данные каждый раз одинаковые? сказывается ли это как-то на звучании? типа там щелчки какие есть?
если нет, то и пускай шлет :D

Ответить

Вернуться в «Разработка пользовательских блоков»