mikecatのアイコン画像
mikecat 2022年12月03日作成 © CC BY 4+
製作品 製作品 閲覧数 653
mikecat 2022年12月03日作成 © CC BY 4+ 製作品 製作品 閲覧数 653

【CalicoCPU】ラーメンタイマー

【CalicoCPU】ラーメンタイマー

自作CPU Advent Calendar 2022 3日目

CalicoCPU でラーメンタイマーを作った。
実行を開始してから約180クロック (正確には182クロック) でPORT1のビット0が1になるので、
1Hzのクロックで実行すれば約3分を計ることができる。

2-way Buzzer Board

今回は1Hzという遅いクロックで実行するため、CPUでブザー音を鳴らすことができない。
そこで、HIGHを入力するだけでブザー音が鳴る装置を作った。
それがこの「2-way Buzzer Board」である。

2-way Buzzer Board 2-way Buzzer Board 回路図

基板設計データ

ON/OFFのみの制御でブザーを鳴らす「auto」と、音声信号を入力してブザーを鳴らす「manual」の2種類の端子を用意した。
余った端子には、とりあえずLEDをつけておいた。

今回は、この「auto」の端子をPORT1のビット0に接続して用いる。

プログラム

MikeAssembler 用のプログラムを以下に示す。
ちょうど16バイトに収まった。

target calico

	ADDI A, -1
	DRIVE 0, A
	OUT 0, A
	MOVI B, 1
	DRIVE 1, B
loop1:
	MOVI C, 8
	MOVI D, loop2
loop2:
	ADDI C, -1
	JNZ C, D
	SHR A, 1
	OUT 0, A
	MOVI D, loop1
	JNZ A, D
	OUT 1, B
	MOVI D, end_loop
end_loop:
	JNZ D, D

機械語を追加すると、以下のようになる。

00111111     ADDI A, -1
00010110     DRIVE 0, A
00010010     OUT 0, A
01100001     MOVI B, 1
01011110     DRIVE 1, B
         loop1:
10101000     MOVI C, 8
11100111     MOVI D, loop2
         loop2:
10111111     ADDI C, -1
10011111     JNZ C, D
00001011     SHR A, 1
00010010     OUT 0, A
11100101     MOVI D, loop1
00011111     JNZ A, D
01011010     OUT 1, B
11101111     MOVI D, end_loop
         end_loop:
11011111     JNZ D, D

残り時間を表すため、最初にPORT0の8ビットを全て1にする。
内側のループで時間を稼ぎながら、外側のループでPORT0で1になっているビットを減らしていく。
PORT0の全てのビットが0になると、JNZ 命令でジャンプせず、ループから抜けてブザーを鳴らす処理に移行する。

実行の様子

PORT0に Pmod 8LD を、PORT1の下位ビットに 2-way Buzzer Board を接続してプログラムを実行した。

ここに動画が表示されます

点灯しているLEDの数が減っていき、実行を開始してから約3分後にブザーが鳴った。

1
  • mikecat さんが 2022/12/03 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する