難しく考えすぎなんだよなぁ。50個/2min作るだけならそんなに大変じゃないのに。
***
いよいよ、AC-16に手を出しました。/* 対地攻撃機みたいな名前だ。「オーケー、そこのいけ好かないロボットに2000ポンドをお見舞いしてやれ!」 */

手を出したと言っても、いわゆる「hello world」的な、組み込みで言えば「Lチカ」的な、「一定時間ONにする」だけの機能ですが。
注文リーダーでも「一定時間ONにする」はできますが、注文が入らないとトリガされない上に、最大20秒しか指定できません。50個/2minステージでは、ステージ開始前に注文された状態なので、注文リーダーでは正常に処理できません。
サンプルプログラムとして、「85秒間ONにする」プログラムは、以下のような感じになります。ちなみに、AC-16の開発画面はコメントは入力できないので、予め削除しておいてください。
;###
add 1 V0 V0
cmp V0 2550
jgt off ; if (V0 > 2550) { goto off; }
on:
out O0 1
out O1 1
out O2 1
out O3 1
jmp endprogram
off:
out O0 0
out O1 0
out O2 0
out O3 0
endprogram:
;###
1秒にキッチリ30回呼び出されるので、85*30=2550で、これがcmpのマジックナンバーです。レジスタは16bitなので、8bitマイコンみたいにインクリメントして0なら次のレジスタをインクリメント、みたいな七面倒臭いことをする必要がないのは楽ですね。0以外とも比較できるので、ソコソコ扱いやすい気もします。
出力接点は操作しなければ保持されるので、ドキュメントのサンプルだと、equalで一致した場合にのみnotで反転させる、といったこともやっています。もっとも、出力接点に直接書き込むことはできないので、適当なレジスタをnotで反転したあとにoutで書き込む、という手順ですが。
この開発環境は大文字・小文字を区別するので、ある程度統一感を持って開発する必要があります。少なくとも、レジスタ類は大文字で書く必要がありますし、命令は小文字で書く必要があります。ドキュメントのサンプルはラベルを小文字で表記しますが、ラベルは大文字で統一したほうがいい気もします。入力が面倒なのが難点ですが。
movは第1オペランドを第2オペランドに移動する命令ですが、outは第1オペランドに第2オペランドを移動する命令です。ふざけんな
さて、AC-16のドキュメントの日本語版では、「全プログラムは毎秒50回、確実に実行されます」と書かれています。一方で、サンプルプログラムでは1秒の定数に30を使用していますし、33ミリ秒という定数も時々出てきます。
英語版のドキュメントを読んでみると、"The entire program is executed exactly 30 times per second"と書かれています。
STM32の日本語版ドキュメントに、「必ず最新の英語版を確認しろ」と書いてありますが、なるほどなぁ、こういうことか。
AC-32のドキュメントを読んでみると、レジスタが4x16bit→8x16bitと倍増、cal,mul命令が追加、コードページの追加、という感じです。
ROMは32ワードで代わりありませんが、コードページという概念が追加され、メインのROM以外に4本のROMのコードを実行できるような機能のようです。
mulの機能は言わずもがなですね。
キャンペーンは、ようやく半分を超えたかな、という感じですが、ところどころ効率100%未満な部分もあるので、もうしばらくは遊べそうです。
0 件のコメント:
コメントを投稿