NEC 7220A (GDC)の同期信号フォーマットを調べる
前回→ NEC 7220A (GDC) SYNCコマンドに関する説明の矛盾
昨日は横着してブレッドボードにディップスイッチを付けてμPD7220A (GDC)を制御できないかと試してみたが、残念ながらできなかったので、Arduino Uno R3を使うことにした。
用意したもの
- Arduino Uno R3 : マイコンボード
- Hanmatek HO52 : オシロスコープ 2チャネル 50 MHz
- TDK-Lambda HK-25A-5 : AC-DCスイッチング電源 5 V 25 W
- NEC μPD7220AD (GDC)
- Toyocom 711S 21.0526 MHz : オシレーター GDC・ピクセルクロック供給用
- Motorola MC74F74N : クロック分周用
- フィルムコンデンサー 0.1 μF
- USBケーブル (A-B)
- ブレッドボード
- ジャンパー線 多数
Arduinoとオシロは購入。それ以外は手持ちのものを使用。7220は基板上の電池液漏れで故障したPC-98の部品を取って保管していたので、オシレーターや7474も揃っていた。
Arduino Unoの電源レギュレーターは最大800mAとマイコンの駆動だけで精一杯なので、ブレッドボード用の外部電源が必要。7220単独でも1.5 W (270 mA) の電力を消費するため、この時点でレギュレーターの容量を超えている。
7220の初期化方法
7220はRESETコマンドでディスプレイ信号フォーマットを初期化して、VSYNCコマンドでマスター動作を指定。STARTコマンドで同期信号の出力を開始する。初期値は0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65
を使用。
オシロのプローブを7220の3ピン (HSYNC) と5ピン (BLANK) に接続する。
結果
Horizontal Front Porchは約3.80マイクロ秒、Horizontal Back Porchは約3.04マイクロ秒となり、PC-98テクニカルデータブックの記載は間違いで、7220のドキュメントにある説明が正しいことが分かった。
なお、垂直同期はどうかというと、Vertical Back Porchは約1.01ミリ秒となり、これは両者の記載通りであることが確認できた。
コード
ArduinoのD2からD9ピンを7220の19から12ピンに接続。D10, D11, D12を7220の11から9ピンに接続。デジタル入出力のリターン用にGNDをブレッドボードへ接続することを忘れずに。
#define GDCnRD 12
#define GDCnWR 11
#define GDCA0 10
void tglPDOutput() {
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
}
void tglPDInput() {
pinMode(9, INPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
pinMode(6, INPUT);
pinMode(5, INPUT);
pinMode(4, INPUT);
pinMode(3, INPUT);
pinMode(2, INPUT);
}
void waitGDCReady() {
tglPDInput();
delay(1);
digitalWrite(GDCA0, LOW);
delay(1);
digitalWrite(GDCnRD, LOW);
delay(1);
while(digitalRead(8) == 1) {//wait FIFO Full = 0
}
digitalWrite(GDCnRD, HIGH);
delay(1);
digitalWrite(GDCA0, HIGH);
delay(1);
}
void outData(byte data) {
tglPDOutput();
digitalWrite(2, bitRead(data, 7));
digitalWrite(3, bitRead(data, 6));
digitalWrite(4, bitRead(data, 5));
digitalWrite(5, bitRead(data, 4));
digitalWrite(6, bitRead(data, 3));
digitalWrite(7, bitRead(data, 2));
digitalWrite(8, bitRead(data, 1));
digitalWrite(9, bitRead(data, 0));
}
void writeGDCCommand(byte data) {
waitGDCReady();
digitalWrite(GDCA0, HIGH);
outData(data);
delay(1);
digitalWrite(GDCnWR, LOW);
delay(1);
digitalWrite(GDCnWR, HIGH);
delay(1);
}
void writeGDCData(byte data) {
digitalWrite(GDCA0, LOW);
outData(data);
delay(1);
digitalWrite(GDCnWR, LOW);
delay(1);
digitalWrite(GDCnWR, HIGH);
delay(1);
}
void setup() {
tglPDInput();
pinMode(GDCnRD, OUTPUT);
pinMode(GDCnWR, OUTPUT);
pinMode(GDCA0, OUTPUT);
digitalWrite(GDCnRD, HIGH);
digitalWrite(GDCnWR, HIGH);
digitalWrite(GDCA0, HIGH);
delay(1000);
writeGDCCommand(0x00);//RESET
writeGDCData(0x10);
writeGDCData(0x4e);
writeGDCData(0x07);
writeGDCData(0x25);
writeGDCData(0x07);
writeGDCData(0x07);
writeGDCData(0x90);
writeGDCData(0x65);
writeGDCCommand(0x6f);//VSYNC
writeGDCCommand(0x6b);//START
}