Pages: [1]   Go Down
Author Topic: YMZ284 Sound IC  (Read 679 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 1
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Toronto, Ontario, Canada
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Toronto, Ontario, Canada
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);  
}
}
« Last Edit: January 10, 2011, 01:35:04 pm by grgtrpp » Logged

Pages: [1]   Go Up
Jump to: