Go Down

Topic: YMZ284 Sound IC (Read 800 times) previous topic - next topic

tomcee

Has anyone successfully interfaced this IC?

If so, would you please elaborate on the process?  That is, is the address first sent, then the data?

Thank you,
TomC

grgtrpp

I have.  Yes, you write the address first. The A0 line on the YMZ284 is the key.

For every byte written to the YMZ284:

1) load the address to the 8 lines
2) A0 set to LOW
3) load the data to the 8 lines
4) A0 set to HIGH

This is the minimal setup.  For quieter operation you might want to use the /WR (enable = LOW) also.

grgtrpp

#2
Jan 10, 2011, 07:04 pm Last Edit: Jan 10, 2011, 07:35 pm by grgtrpp Reason: 1
Here is some sample code that includes wiring notes:

/* Yamaha YMZ284-D Test 1
Pin connections between Arduino and YMZ384
Arduino    YMZ284
Data
9            16
8            15
7            14
6            13
5            12
4            11
3            10
2            9
Control
10            3
11            1

Pin  7 (clock) of YMZ284 connected to OUT pin of 1MHz oscillator
Pin 5 (SO) of YMZ284 connected to audio jack
Pin 4 of YMZ284 goes to +5V
Pin 6 of YMZ284 is ground
Pin 8 (IC/) of YMZ284 is set to ground (LOW)
*/

// The YMZ284 data pins mapped to Arduino pins
#define D0  9
#define D1  8
#define D2  7
#define D3  6
#define D4  5
#define D5  4
#define D6  3
#define D7  2

// address/data mode line AO
#define AO  10


// some Addresses
// $00, $01  Channel A Frequency
// $02, $03  Channel B Frequency
// $04, $05  Channel C Frequency
// $06       Noise Frequency
// $07       Mixer Setting
// $08       Channel A level
// $09       Channel B level
// $0A       Channel B level
// $0B, $0C  Envelope Frequency
// $0D       Envelope shape
// $0F       Control power

// Register Array
#define frequencyAfine 0
#define frequencyAcourse 1
#define frequencyBfine 2
#define frequencyBcourse 3
#define frequencyCfine 4
#define frequencyCcourse 5
#define noiseFrequency 6
#define mixerSetting 7
#define levelA 8
#define levelB 9
#define levelC 10
#define envelopeFrequencyFine 11
#define envelopeFrequencyCourse 12
#define envelopeShape 13

int f=0;
int e=0;
int freq;
int dly=300;

void setup()
{
 int i;
 for (i = 2; i < 10; i = i+1) {
 pinMode(i, OUTPUT);
 }
pinMode(A0, OUTPUT);
digitalWrite(A0, LOW);
pinMode(13, OUTPUT);
randomSeed(analogRead(0));
Serial.begin(9600);
}

void loop()
{

// set the Envelope Frequency
 writeAddress(envelopeFrequencyFine);
 writeData(B11111111);
 writeAddress(envelopeFrequencyCourse);
 writeData(B00000001);
// select the volume register for channel A & set to
// envelope controlled
 writeAddress(levelA);
 writeData(B00010000);
// select the volume register for channel B & set to high
 writeAddress(levelB);
 writeData(B00010000);
// select the volume register for channel C & set to high
 writeAddress(levelC);
 writeData(B00001111);  

// set the mixer setting to mask out noise
 writeAddress(mixerSetting);
 writeData(B00111000);
 
// Choose a random envelope shape
 writeAddress(envelopeShape);
 e = random(15);
 Serial.print("Envelope: ");
 Serial.println(e);
 writeData(e);
 
Serial.println("Now the fine tuning...");
// cycle from 1 to 255 for fine frequency
for (int i=1; i <= 15; i++) {
// select the course register for channel A
 freq = i * 16;
 writeAddress(frequencyAfine);  
 writeData(freq);
 writeAddress(frequencyBfine);  
 writeData(freq);
 writeAddress(frequencyCfine);  
 writeData(freq);
 f = 1048576/(32*freq);
 Serial.println(f);
 delay(dly);
}

Serial.println("Now the course tuning...");
// cycle 0 to 15 for course tune frequency
 for (int i=1; i < 3; i++) {
// select the course register for channel A
 freq = 2 * i;
 writeAddress(frequencyAcourse);  
 writeData(freq);
 writeAddress(frequencyBcourse);  
 writeData(freq);
 writeAddress(frequencyCcourse);  
 writeData(freq);
 f = 1048576/((256*32*freq) + 255);
 Serial.println(f);
 delay(dly * 2);
}
Serial.println("Cleaning up...");
// clean up course registers
 writeAddress(frequencyAcourse);  
 writeData(0);
 writeAddress(frequencyBcourse);  
 writeData(0);
 writeAddress(frequencyCcourse);  
 writeData(0);
 delay(dly);
}

void writeAddress(byte b) {
//delay(10);
// setup for address write mode
digitalWrite(A0, LOW);
// write the address
writeByte(b);
}

void writeData(byte b) {
// setup for address write mode
digitalWrite(A0, HIGH);
// write the data
writeByte(b);
}

void writeByte(byte b) {
// set all data pins to 0
int i;
 for (int i=2; i < 10; i++) {
 digitalWrite(i, LOW);
 }
 // convert byte value to data pins on YMZ284
byte t;
t = b & B00000001;
if ( t == B00000001) {
 digitalWrite(D0, HIGH);
}
t = b & B00000010;
if ( t == B00000010) {
 digitalWrite(D1, HIGH);
}
t = b & B00000100;
if ( t == B00000100) {
 digitalWrite(D2, HIGH);
}
t = b & B00001000;
if ( t == B00001000) {
 digitalWrite(D3, HIGH);
}
t = b & B00010000;
if ( t == B00010000) {
 digitalWrite(D4, HIGH);
}
t = b & B00100000;
if ( t == B00100000) {
 digitalWrite(D5, HIGH);
}
t = b & B01000000;
if ( t == B01000000) {
 digitalWrite(D6, HIGH);
}
t = b & B10000000;
if ( t == B10000000) {
 digitalWrite(D7, HIGH);  
}
}

Go Up