The PCを自作する。 その6: クロックを入れてみる
The PCを自作するシリーズ。
今回はとりあえず、クロックを入力してみる。
前回までの記事でHOLDがCPUからの出力って書いちゃってたけど、入力だった。 あと、TESTは出力だと思ったら入力だった。 修正した。
ソース
とりあえず、CPUからの出力をシリアルポートにダンプしながら、 クロックを与えてどう変わるか見てみた。 何も変わらなかったので、RESETも入れてみた。
#define ADDR9 PB11
#define ADDR8 PB10
#define ADDR7 PB9
#define ADDR6 PB8
#define ADDR5 PB7
#define ADDR4 PB6
#define ADDR3 PB5
#define ADDR2 PB4
#define ADDR1 PB3
#define ADDR0 PA15
#define CLK PB0
#define SSO PB12
#define RD PB13
#define HOLD PB14
#define WR PB15
#define DT PA8
#define DEN PA9
#define ALE PA10
#define READY PB1
#define RESET PA7
void setup() {
// put your setup code here, to run once:
Serial.begin();
pinMode(ADDR9, INPUT);
pinMode(ADDR8, INPUT);
pinMode(ADDR7, INPUT);
pinMode(ADDR6, INPUT);
pinMode(ADDR5, INPUT);
pinMode(ADDR4, INPUT);
pinMode(ADDR3, INPUT);
pinMode(ADDR2, INPUT);
pinMode(ADDR1, INPUT);
pinMode(ADDR0, INPUT);
pinMode(CLK, OUTPUT);
pinMode(SSO, INPUT);
pinMode(RD, INPUT);
pinMode(HOLD, OUTPUT);
pinMode(WR, INPUT);
pinMode(DT, INPUT);
pinMode(DEN, INPUT);
pinMode(ALE, INPUT);
pinMode(READY, OUTPUT);
pinMode(RESET, OUTPUT);
delay(3000);
Serial.println("setup");
}
void dump() {
Serial.print("ADDR: ");
Serial.print(digitalRead(ADDR9) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR8) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR7) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR6) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR5) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR4) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR3) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR2) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR1) == HIGH ? "1" : "0");
Serial.print(digitalRead(ADDR0) == HIGH ? "1" : "0");
Serial.println("");
Serial.print("SSO RD WR DT DEN ALE: ");
Serial.print(digitalRead(SSO) == HIGH ? "1" : "0");
Serial.print(digitalRead(RD) == HIGH ? "1" : "0");
Serial.print(digitalRead(WR) == HIGH ? "1" : "0");
Serial.print(digitalRead(DT) == HIGH ? "1" : "0");
Serial.print(digitalRead(DEN) == HIGH ? "1" : "0");
Serial.print(digitalRead(ALE) == HIGH ? "1" : "0");
Serial.println("");
}
void clock() {
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("loop");
dump();
clock();
digitalWrite(RESET, HIGH);
Serial.println("RESET");
clock();
dump();
clock();
digitalWrite(RESET, LOW);
Serial.println("UNRESET");
digitalWrite(RESET, HIGH);
clock();
for (int i=0;i<100;i++) {
dump();
clock();
}
while(1);
}
結果
ALEだけLOWで、あとはHIGHで変わらない。 何が間違ってるんだろう。 あと、8088がかなり暖かくなってるんだけど、大丈夫か?
setup
loop
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
RESET
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
UNRESET
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
(以下同じ)
原因考察
データシートを読んだり、指摘された事がいくつかある。
- 普通の入力は2.0Vあればいいが、クロックだけは3.9V必要
- 最低クロックが2Mhz必要
あとミスがあるかもしれない
- 良くみたらTESTピンに何もつないでない。5Vじゃないとマズい?
- 他の入力ピンの設定はこれでいいのか?
- リセットの仕方はこれでいいのか?
- 配線にミスはないか?
つづく
まず、配線のチェックをしたい。 TESTをなおしたり、レベルコンバーターを入れたい。
20円ぐらいの、i2c用のレベルコンバータなら沢山あるけど、これでいけるかな?
次回はその辺をやりたい。
と思ってたけど、別の事をすすめた。
この記事へのご意見、ご感想、コメントは、
twitter
か下のフォーム(実験的)へどうぞ。