YM2149f+Atmega328. Две программы в одном контроллере

Начало.
Подарил мне приятель в начале 2000-х синтезатор YM2149f и на днях попался он мне на глаза и решил я с ним заморочиться. Нагуглил вот этот проект:
https://electronicfields.wordpress.com/2012/05/02/ym2149-and-midi/

Большой…, древний, скомпилировался только в Arduino IDE 1.0.6. Должен был получиться чиптюновый MIDI-синтезатор. Не работает. Нашел проект попроще:

const int ad[8] = { 8, 9, 2, 3, 4, 5, 6, 7 }; // connect to DA0,1,...,7

const int pinBC1 = 10;
const int pinBDIR = 11;
const int pinRES = 12;

//Fast pin switching macros
#define CLR(x,y) (x&=(~(1<<y)))
#define SET(x,y) (x|=(1<<y))
#define __BCPORT__ PORTB
#define __BC1__ 2
#define __BDIR__ 3

void setup() {
//init pins
for( int i=0; i < 8; i++)
pinMode(ad[i], OUTPUT);

pinMode(pinBC1, OUTPUT);
pinMode(pinBDIR, OUTPUT);
pinMode(pinRES, OUTPUT);

//inactive mode
digitalWrite(pinBC1, LOW);
digitalWrite(pinBDIR, LOW);
digitalWrite(pinRES, HIGH);

//serial init
Serial.begin(57600);
}

void send_data(unsigned char address, unsigned char data) {
//write address to pins
PORTB |= address & 0x03;
PORTD |= address & 0xFC;
//validate addess
__BCPORT__ |= (1 << __BDIR__) + (1 << __BC1__);
delayMicroseconds(1);
__BCPORT__ &= ~((1 << __BDIR__) + (1 << __BC1__));
PORTB &= ~(address & 0x03);
PORTD &= ~(address & 0xFC);

//write data to pins
PORTB |= data & 0x03;
PORTD |= data & 0xFC;
//validate data
SET(__BCPORT__,__BDIR__);
delayMicroseconds(1);
CLR(__BCPORT__,__BDIR__);
PORTB &= ~(data & 0x03);
PORTD &= ~(data & 0xFC);
}
void loop() {
byte reg;
while(1) {
do {
while(Serial.available() < 1) { delayMicroseconds(1); }
reg = Serial.read();
}
while( reg > 15 );

while(Serial.available() < 1) { delayMicroseconds(1); }
send_data(reg, Serial.read());
}
}

Работает по UART с софтовым плеером AYPlayer. Пока сравнивал распайку (она один к одному) нашел косяк на плате. Перерезал дорожку от MIDI, подпаял USB-UART на CH340, залил код - работает. Залил код MIDI-синтезатора - работает.

Хочу объединить два этих кода в один. Первая идея - сделать это через case. Механический переключатель входов для порта UART и он же поднимает-опускает флаг для case, но… Проблема с древним кодом синтезатора, который не компилируется в современной IDE (плеер компилируется), и еще, Serial инициализируется в setup с разными скоростями. Я застрял…
Какие есть идеи, коллеги?

Переписать древний код? Нет?

ну, если задача стоит

То это, обычно, делается примерно так же, как готовится типичный “русский коктейль”. Я как-то объяснял это американцу, который хотел удивить всех на вечеринке “русским коктейлем”.

  1. Наливаешь в ёмкость для смешивания 50% водки и ещё 50% водки;
  2. тщательно перемешиваешь;
  3. перед подачей на стол можно добавить водки по вкусу.

Само главное и в коктейле и в коде - это тщательно перемешать. Если тут схалтрурить, то ничего не получится.

3 лайка

Переписать древний код?

Ну… не то чтобы переписать весь, а посмотреть, где нестыковки для современного компилятора…

“Современный компилятор” скорее всего не при чем.
Проблема думаю в том, что состав и синтаксис пакета Ардуино изменился за годы.

Что или кто мешает?

Наверняка так и есть, но у меня не хватает знаний анализировать ошибки компилятора в IDE и исправлять синтаксис и переписывать старые функции на новые. Точно знаю, что надо переделать Progmem (гугл подсказал), но на этом и все…

Ну, разметите заказ в “Ищу исполнителя”. Кто-нибудь сделает.

Ну тогда, хотя бы, подскажите - как Serial в одном коде грамотно на разных скоростях использовать?

Переключение Сериал на другую скорость:

Serial.end();
Serial.begin(new_baud);

Хорошо, а в каком месте это сделать? Обычно инициализация происходит в setup, а я буду делать case в loop… Один для плеера, другой для синтезатора. Прямо в цикле? Остановить в конце кейса, запустить с нужной скоростью - вначале. Так?

Вопщем, забей, пока теорию не подкачаешь, ничего не получится.

Теория без практики - ноль и ни один учебник не сделает то, что сделает наставник…, а это вы…

Вы сначала код с выбором двух вариантов напишите - а тогда и ответить можно будет.

Потому как вот это вызывает сомнение:

Вы хотите прямо в ходе работы переключать один синтезатор на другой? Или делать выбор только при старте устройства - и потом работать в выбранном режиме до выключения? - это два разных варианта

если б ты теорию знал, то подключил бы их на 2 разных Сериала, и не имел наставникам мосх.

3 лайка

нет, это не мы. Это НЕ обучающая площадка, ты здесь как скудент - заочник, будешь сам заниматься - защитишь диплом, если нет, ну штош, на нет и суда нет. За тебя никто ничего делать не будет.

2 лайка

А нафига, если все равно всегда работать будет только один? Понятно, что если эти два Сериала УЖЕ есть (например, автор взял Мегу) - то это самый простой вариант.
Но если нет, то менять, например, Уно на Мегу из-за этого я бы не стал.

Дружище, От тебя на форуме никакого толка. Или ты местный Троль на зарплате?..

1 лайк

да, юродивый

1 лайк

Да хоть Уно. Один софт сериал, другой хард, и сё. Тем более, если у него 3 железяки на одних и тех же пинах, ты уверен, что ему под силу разделить их так, чтоб они друг другу не мешали? Я - нет.