Пример скетча для Arduino для параллельной отправки данных на эмулятор.
Для новой версии AY-Player (обновление 30.11.2015)
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; //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); //inactive mode digitalWrite(pinBC1, LOW); digitalWrite(pinBDIR, LOW); //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()); } }
Для старой версии AY-Player
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; //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 //const int ledPin = 13; byte buf[16]; byte buf2[16]; void setup(){ //init pins for( int i=0; i < 8; i++) pinMode(ad[i], OUTPUT); pinMode(pinBC1, OUTPUT); pinMode(pinBDIR, OUTPUT); //pinMode(ledPin, OUTPUT); //inactive mode digitalWrite(pinBC1, LOW); digitalWrite(pinBDIR, LOW); memset(buf,0,16); memset(buf2,0,16); //serial init Serial.begin(19200); } void send_data(unsigned char address, unsigned char data) { //write address to pins PORTB |= address & 0x03; PORTD |= address & 0xFC; delayMicroseconds(1); //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; delayMicroseconds(1); //validate data SET(__BCPORT__,__BDIR__); delayMicroseconds(1); CLR(__BCPORT__,__BDIR__); PORTB &= ~(data & 0x03); PORTD &= ~(data & 0xFC); } byte bufcnt = 0; byte prev = 0; void loop() { while(1) { while(Serial.available() < 1) { delayMicroseconds(1); } byte data = Serial.read(); buf[bufcnt] = data; if(bufcnt > 13 && data==0x7F && prev == 0x80) { bufcnt=0; break; } else { if(bufcnt<16) bufcnt++; } prev = data; } //digitalWrite(ledPin, HIGH); //PORTB |= (1<<5); for (int i = 0; i < 14; i++) { if( buf[i]!=buf2[i]) { if(!(i==13 && buf[i] == 0xFF)) send_data(i, buf[i]); } } memcpy(buf2,buf,16); //digitalWrite(ledPin, LOW); //PORTB &= ~(1<<5); }
Контакты для параллельной отправки (Arduino) 8,9,2,3,4,5,6,7
BC1 контакт 10
BDIR контакт 11
Соедините данные контакты в соответствии с рисунком выше
[ad name=»HTML»]
Не могу понять как реализовать параллельную загрузку с ардуины на эмулятор, по какой схеме подключать, через что отсылать с плеера(даже если без ардуины — то через какой девайс необходимо отправлять данные с плеера?)? Не могли бы вы более подробно описать эти нюансы? Заранее благодарен.
Пересылка с проигрывателя идет через переходник COM->TTL или USB->TTL, у переходника берется +5v, GND и TX, подключается к эмулятору, далее в проигрывателе выбирается COM порт и всё
параллельная загрузка, тут всё аналогично AY-3-89XX, т.е. используются BC1/BDIR и шина данных, в скетче приведена функция отправки байта в определенный регистр
Как я понял, с новой версией avr-ay player данный скетч уже не подойдет? Просто есть девайсина, построенная по этому принципу, но с использованием реального YM2149F, и хочется заставить её работать с новой версией плеера.
Не могли бы вы подсказать как сего можно добиться?
Добавил вариант для новой версии проигрывателя, отпишитесь потом работает или нет
Да, заработало, спасибо.
Плеер у Вас обалденный! Классная разработка! Слушаю через реальный YM2149F.
Звук восхитительный! Снял видео : https://youtu.be/iMv-pLgDepI
Спасибо! Пойду сравню заодно звучание эмулятора с YM 🙂
Добавлю ссылку на ваше видео в группу в ВК
Ничего не имею против эмулятора, но как-то ламповей и теплее YM2149 😉
Да и сравнение будет немного не корректное. По скорости воспроизведения будет отличаться, у меня генератор на 1.84 МГц работает. 😉
Добавил скетч со встроенным генератором на 2МГц, может будет чем-то полезен, да и вообще там скетч гораздо производительнее, генератор можно отключить, если не нужен 🙂