Параллельная загрузка

Пример скетча для 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);
}

pinmap3ch

Контакты для параллельной отправки (Arduino) 8,9,2,3,4,5,6,7
BC1 контакт 10
BDIR контакт 11

Соедините данные контакты в соответствии с рисунком выше

[ad name=»HTML»]

Параллельная загрузка: 10 комментариев

  1. Не могу понять как реализовать параллельную загрузку с ардуины на эмулятор, по какой схеме подключать, через что отсылать с плеера(даже если без ардуины — то через какой девайс необходимо отправлять данные с плеера?)? Не могли бы вы более подробно описать эти нюансы? Заранее благодарен.

  2. Пересылка с проигрывателя идет через переходник COM->TTL или USB->TTL, у переходника берется +5v, GND и TX, подключается к эмулятору, далее в проигрывателе выбирается COM порт и всё

    параллельная загрузка, тут всё аналогично AY-3-89XX, т.е. используются BC1/BDIR и шина данных, в скетче приведена функция отправки байта в определенный регистр

  3. Как я понял, с новой версией avr-ay player данный скетч уже не подойдет? Просто есть девайсина, построенная по этому принципу, но с использованием реального YM2149F, и хочется заставить её работать с новой версией плеера.
    Не могли бы вы подсказать как сего можно добиться?

        1. Добавил скетч со встроенным генератором на 2МГц, может будет чем-то полезен, да и вообще там скетч гораздо производительнее, генератор можно отключить, если не нужен 🙂

Добавить комментарий

Ваш адрес email не будет опубликован.