YMZ294をAVRで動かす(2)~さっそく動かしてみる~ | 電子楽器の夢をみるのか

電子楽器の夢をみるのか

電子楽器製作をつづる。

テーマ:
ちょっと久々に本編(?)を進めます。
前回、前々回により、YMZ294の気持ちがわかりました。早速音を出してみます。
その前に回路はこんな感じにしました。YMZ294のD0~7はtiny2313のポートB0~7に接続しています。D0はB0、D1はB1・・・・とそれぞれ接続します。また、/WRはtiny2313のPD0、/CSはPD1、A0はPD2、/ICはPD3に接続しています。

書いたプログラムがこちら。ちなみにC言語で書かれてます。

/*
*YMZ294のテストその1    単音を出力するだけ    22/04/2014
*Author: Longtail
*対応ポート
*Tiny2313            YMZ294
*PB0~7                D0~7
*PD0                /WR
*PD1                /CS
*PD2                A0
*PD3                /IC
*/
#define    F_CPU    1000000UL    // 1MHz
#include <util/delay.h>            // wait関数(_delay)を使えるようにする
#include <avr/io.h>

unsigned char ADR=0,DAT=0;        //変数の定義 ADR=アドレス DAT=データ
void InitHard(void);                //ポートの初期化,YMZ294の音量設定
void Output(unsigned char,unsigned char);                //アドレス・データをYMZ294に渡すためのサブルーチン

int main(void){                    //メイン
    InitHard();
    Output(0x01,0x02);//Ach A(440Hz)に設定
    Output(0x00,0x38);
    while(1){}
}
void InitHard(void) {            //ポート初期設定
    DDRB=0xff;                    //PORTB出力
    PORTB=0;                    //0を出力
    DDRD=0xff;                    //PORTD出力
    PORTD=0x08;                    //PD3以外0を出力

    _delay_ms(100);                //YMZ294が安定するまで待つ.
    Output(0x07,0x3e);            //ミキサー設定 Achのみ出力
    Output(0x08,0x0f);            //Ach 音量Max
}
void Output(unsigned char ADR,unsigned char DAT){
    PORTD=0x08;                   
    PORTB=ADR;                    //アドレスの出力
    PORTD=0x0b;
    PORTD=0x0c;
    PORTB=DAT;                    //データの出力
    PORTD=0x0f;
    PORTD=0x08;
}

と、まぁこんな感じ。とりあえずポイントはここ
void Output(unsigned char ADR,unsigned char DAT)の部分
ここでデータとアドレスの出力をしています。前回(YMZ294をAVRで動かす(1.5))で書いた内容をそのまま書いてます。ここさえしっかりしてればYMZ294に値を出力できます。

このプログラムを動かしてみると・・・音がでました。ラ(A=440Hz)の音です。出したい音を指定するのが結構面倒です。配列を使う必要がある?
ちなみに最初の数回は音がでませんでした。その原因はここ
    Output(0x07,0x3e);            //ミキサー設定 Achのみ出力
    Output(0x08,0x0f);            //Ach 音量はEGに依存

この二つの指定を間違えると全く音がでません。単音を出すだけならこのままでOK。EGを使う時はレジスタ$08のデータを0x1fに設定し、$0B~0Dも設定する必要があります。
レジスタに値をいろいろ入れると結構遊べます。とりあえず続く。

14/05/18 書き間違いを訂正。ポートAをすべてポートDに正しく書き直しました。