前回、前々回により、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に正しく書き直しました。