Image: 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のドキュメントにある説明が正しいことが分かった。

Image: uPD 7220 H Sync

なお、垂直同期はどうかというと、Vertical Back Porchは約1.01ミリ秒となり、これは両者の記載通りであることが確認できた。

Image: uPD 7220 V Sync

コード

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
}

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!