mikecat が 2022年12月03日09時13分06秒 に編集
初版
タイトルの変更
【CalicoCPU】ラーメンタイマー
タグの変更
CalicoCPU
タイマー
発振回路
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(CC BY 4+) Creative Commons Attribution CC BY version 4.0 or later
本文の変更
++[自作CPU Advent Calendar 2022](https://qiita.com/advent-calendar/2022/diycpu) 3日目++ [CalicoCPU](https://elchika.com/article/f38275fc-1f46-4e77-bc30-c172971ecf0f/) でラーメンタイマーを作った。 実行を開始してから約180クロック (正確には182クロック) でPORT1のビット0が1になるので、 1Hzのクロックで実行すれば約3分を計ることができる。 # 2-way Buzzer Board 今回は1Hzという遅いクロックで実行するため、CPUでブザー音を鳴らすことができない。 そこで、HIGHを入力するだけでブザー音が鳴る装置を作った。 それがこの「2-way Buzzer Board」である。 |![2-way Buzzer Board](https://camo.elchika.com/5cbcc9030945724b7e58ce8e56b78009d4a2ff82/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34323336376365652d363839362d346364612d396134612d3433343133383638326635342f36376461306339332d376131372d343566642d383064632d393436396638383937333331/)|![2-way Buzzer Board 回路図](https://camo.elchika.com/6a2d5393c85900d7ecb3ae59ae3cd50001a6d6c8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34323336376365652d363839362d346364612d396134612d3433343133383638326635342f65303934383965332d316139302d343537612d616464632d623235323665303530303536/)| |---|---| [基板設計データ](https://github.com/mikecat/hardware_cpu/releases/tag/20220310-boards-v1.0) ON/OFFのみの制御でブザーを鳴らす「auto」と、音声信号を入力してブザーを鳴らす「manual」の2種類の端子を用意した。 余った端子には、とりあえずLEDをつけておいた。 今回は、この「auto」の端子をPORT1のビット0に接続して用いる。 # プログラム [MikeAssembler](https://mikecat.github.io/mike_assembler/) 用のプログラムを以下に示す。 ちょうど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](https://digilent.com/reference/pmod/pmod8ld/start) を、PORT1の下位ビットに 2-way Buzzer Board を接続してプログラムを実行した。 @[youtube](https://www.youtube.com/watch?v=km8gMLQISn8) 点灯しているLEDの数が減っていき、実行を開始してから約3分後にブザーが鳴った。