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

【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 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する