BASICスタンプコマンド解説2
フロー制御
END
文法
END
解説
このコマンドを実行することによりスタンプは低消費電力モードになります。スタンププログラミングソフトウェアは常にあなたのプログラムの最後にENDを入れますので、あなたのプログラムの最後にENDが実行されます。END実行後は全ての出力の状態はそのまま保持されます。
スタンプは一度低消費電力モードに入ると2.3秒後に自動的にリセットをかけます。この後、瞬間的に全てのI/Oが入力に設定され(約18ms間)、そののちに最後の出力状態に戻ります。もし、短いプログラムを作った場合は2.3秒毎にI/Oの設定が変わることになります。これを避けるには、プログラムを無限ループにすれば良いでしょう。
PAUSE
文法
PAUSE パラメータ
解説
パラメータで指定したm秒間、スタンプを休止させます。スタンプTの場合はこのパラメータは変数名か定数でなくてはいけません。スタンプUの場合には式も入れる事ができます。
パラメータは16ビットのため、最大値は65535、つまり65.535秒となります。これ以上の休止を行いたい場合はループを使用して下さい。スタンプは内蔵クロックを生じさせるのにセラミック共振器をつかっています。この共振器は誤差が±1%あります。また、スタンプTの場合はコマンドの実行に1msの時間が掛かるのでこのPAUSEコマンドの実行自体で1秒余分に時間がかかっています。スタンプUの場合は0.6ms、2SXの場合は約0.25msを一つのコマンドの実行に費やします。
サンプルプログラム
10分の休止
FOR B1=1 TO 10
PAUSE 60000 '60秒
NEXT
NAP
文法
NAP パラメータ
解説
2をパラメータ乗したのち1.8msを掛けた時間だけ低消費電力モードにします。パラメータ値は0−7。つまり、
パラメータ=0 2の0乗掛ける1.8 = 1.8ms
パラメータ=1 2の1乗掛ける1.8 = 3.6ms
・
・
パラメータ=7 2の7乗掛ける1.8 = 2300ms
となります。NAPはEND同様、その終了後に瞬間的に全てのI/Oが入力に設定され(約18ms間)、そののちに最後の出力状態に戻ります。
サンプルプログラム
top:
TOGGLE 0 :I/O0の1,0を切替(0なら1、1なら0)
NAP 7 :2.3秒の低消費電力モード
GOTO top
2.3秒ごとにP0の出力をHIgh/Lowに切替え、しかも低消費電力。
SLEEP
文法
SLEEP パラメータ
解説
パラメータで表した秒数だけ低消費電力モードにします。これはNAPとほぼ同じ動作ですが、時間が長いのと、休止時間の誤差が1%以下と低くなっています。パラメータは16ビットの定数か変数でなくてはならず、最大65535秒(18時間)の休止が行えます。他の低消費電力モードコマンド同様、その終了後に瞬間的に全てのI/Oが入力に設定され(約18ms間)、そののちに最後の出力状態に戻ります。
サンプルプログラム
top:
TOGGLE 0 :I/O0の1,0を切替(0なら1、1なら0)
SLEEP 10 :10秒間の低消費電力モード
GOTO top
GOTO
文法
GOTO ラベル
解説
ラベルで指定した行へプログラムをジャンプさせます。最近の高級言語ではGOTO文を使うのはよくないことだとされる風潮がありますがスタンプBASICの場合は必要不可欠なコマンドのひとつです。ジャンプ先を指定するのにラベルをつくります。ラベルは変数名のような任意の文字で指定し、最後にコロンをつけます
サンプルプログラム
top: ラベル
TOGGLE 0
PAUSE 500
GOTO top
INPUT 0
IF...THEN
文法
IF {NOT} 条件式 {条件式 {NOT} 条件式 ・・・・} THEN ラベル
解説
条件式には式が入り、この式が成り立つときにラベルのところへジャンプします。またNOTキーワードを入れることにより条件式の逆の結果の時にラベルへジャンプするようになります。また、2つ以上の条件式をANDまたはORでつなげることもできます。式は左から右へ評価されます。スタンプTの場合は条件式の左側は変数でなくてはならず、右側は変数か定数になります。Uの場合はどのようにでも表現することができます。条件の演算式は下記のとおり
= :イコール
< :よりちいさい
> :よりおおきい
<>:以外
<=以下
>=以上
サンプルプログラム
IF B1=0 THEN sub1 :B1の内容が0ならsub1へジャンプ
IF NOT B1<>0 THEN sub2 :0以外じゃなかったら(上の行と同じ意味)
IF B1<5 THEN sub3 :B1が0から4ならジャンプする
BRANCH
文法
スタンプT
BRANCH 変数,(ラベル1{,ラベル2・・・・})
スタンプU
BRANCH 変数,[ラベル1{,ラベル2}]
解説
変数の値が0ならラベル1、1ならラベル2、2ならラベル3・・・へジャンプします。変数がそれ以外の値の場合はこの行は無視されます。下記のIFで書かれた文とBRANCHで書かれた文は同じ動きをします。またスタンプTの場合は中カッコがふつうのカッコになります。
サンプルプログラム
BRANCH B1,[jump1,jump2,jump3]
上の一行は下記の3行と同じ
IF B1=0 THEN jump1
IF B1=1 THEN jump2
IF B1=2 THEN jump3
GOSUB
文法
GOSUB ラベル
解説
ラベルで指定したサブルーチンへジャンプし、サブルーチン中のRETURN命令で呼び出した行の次の行へ戻ります。
スタンプTはひとつのプログラムに16のGOSUB文しか書けません。また、GOSUBのネスト(GOSUBで行ったサブルーチンの中からさらにGOSUBで他のサブルーチンへいくこと)の最大は4つです。さらにスタンプTではGOSUBの制御用にW6レジスタを使うのでGOSUB文があるときはW6の使用を控えた方が良いでしょう。
スタンプUの場合は255のGOSUB文を一つのプログラムに書けますがネストは最大4つのままです。ただし、Tのように制御用にレジスタは使いません。
RETURN
文法
RETURN
解説
GOSUBでジャンプしたサブルーチンから戻ります。GOSUBを参照。
FOR
文法
FOR 変数=パラメータ1 TO パラメータ2 {STEP パラメータ3}
解説
プログラムループを作る文です。下記を見てください。
FOR B1=1 TO 10
SLEEP 1
NEXT
まずB1には1が代入され、次の行が実行されます。NEXTまでくるとプログラムはFORのところまで戻りますがこのときB1をインクリメント(B1の値に1を足す)します。もしB1の値がTOで指定した値、この場合は10になるとこのループを終了し、プログラムはNEXTの次の行へジャンプします。またステップキーワードを追加することにより、B1を1ずつ増やすのではなく、パラメータ3の値づつ増やして行き、B1がパラメータ2以上の数になった時点でループ終了となります。上記FOR文にSTEP5を追加すると3回目からのNEXTからのジャンプ時にB1の値は11となり、終了、SLEEP文は2回実行されることになります。これらのパラメータは16ビットのため、最大値は65535となります。
注意)STEPにマイナスの値を入れた場合はFOR−NEXT内を一回だけ実行してから終了します。(バグ?)また、終了値から65535より大きい値をSTEPに設定するとループが終わらないというバグもあります。たとえば下のプログラムで,
reps var word
FOR reps=0 to 65500 STEP 3000
debug dec ? reps
NEXT
とすると、値は・・・57000,60000,63000,464,3464・・・となりループが終わりませんので注意して下さい。
NEXT
文法
FOR文と組み合わせてループ文を作ります。
解説
FOR文を参照。
RUN
2SXのみ
文法
RUN プログラム番号
解説
2SXは16Kのプログラムエリアを持っていますが、一つのプログラムの最大は2Kまでとなっています。つまり2SXは同時に8個のプログラムを2Kづつもてるということになります。どのプログラムを動かすかをRUNで指令します。またRUN命令によって他のプログラムを起動することもできます。スタンプの電源を入れたときはプログラム0が実行され、プログラム0の中からRUN命令により他のプログラムを動かすことができます。プログラム番号は定数、変数または0−7の数字で表されます。RUN命令を実行したときに、RAMとI/Oレジスタを含むレジスタの値はそのまま保持されます。RAMの63番地には現在実行されているプログラムの番号が入ります。
サンプルプログラム
RUN 1 :プログラム1を実行
デジタルI/O
INPUT
文法
INPUT ピン番号
解説
ピン番号で指定した特定のピンをインプットモードに設定します。また、DIRSレジスタを設定しても同様の効果が得られます。DIRSレジスタの設定はいくつかのピンを一度に設定するときに便利です。通常、INPUT文につかうピン番号は定数ですが、スタンプUの場合は式や変数を入れることもできます。
サンプルプログラム
INPUT 0 :ピン0をインプットモードに設定
OUTPUT
文法
OUTPUT ピン番号
解説
ピン番号で指定した特定のピンをアウトプットモードに設定します。また、DIRSレジスタを設定しても同様の効果が得られます。DIRSレジスタの設定はいくつかのピンを一度に設定するときに便利です。通常、OUTPUT文につかうピン番号は定数か変数ですが、スタンプUの場合は式を入れることもできます。
サンプルプログラム
一秒ごとにピン0の値が変わる
OUTPUT 0 :ピン0をアウトプットに設定
PIN0=1
loop:
SLEEP 1
TOGGLE 0
GOTO loop
HIGH
文法
HIGH ピン番号
解説
ピン番号で指定したピンの出力を1(Highレベル)にします。
サンプルプログラム
一秒ごとにピン0の値が変わる
loop:
HIGH 0
SLEEP 1
LOW 0
GOTO loop
LOW
文法
LOW ピン番号
解説
ピン番号で指定したピンの出力を0(Lowレベル)にします。
サンプルプログラム
一秒ごとにピン0の値が変わる
loop:
HIGH 0
SLEEP 1
LOW 0
GOTO loop
TOGGLE
文法
TOGGLE ピン番号
解説
ピン番号で指定したピンの出力値を逆にします。実効前に1だった場合は0、0だった場合は1になります。
サンプルプログラム
一秒ごとにピン0の値が変わる
loop:
SLEEP 1
TOGGLE 0
GOTO loop
REVERSE
文法
REVERSE ピン番号
解説
ピン番号で指定したピンの設定を、インプットモードからアウトプットモードに、アウトプットモードからインプットモードに変えます。
サンプルプログラム
REVERSE 0 :ピン番号0の設定を逆に
PULSOUT
文法
PULSOUT ピン番号, パラメータ
解説
ピン番号で設定したピンをアウトプットモードにし、パラメータで指定した時間の間隔ごとに出力値を逆転(0なら1、1なら0)させます。パラメータの値1はスタンプTの場合10us、Uの場合2us、2SXの場合0.8usになります。つまり、
スタンプT: PULSOUT 0,10
スタンプU: PULSOUT 0,50
スタンプ2SX:PULSOUT 0,125
は同じ時間間隔のパルスとなります。スタンプTの場合はピン番号とパラメータは定数または変数ですが、Uの場合は式も使えます。パラメータの値は16ビットなので最大値は65535となります。ということでパルスの最大間隔はスタンプTが655ms、Uが131ms、2SXが52msとなります。
サンプルプログラム
PULSOUT 0, 100
PULSIN
文法
PULSIN ピン番号, ステート, 変数
解説
パルス幅を測定するコマンドです。ピン番号で指定したピンから入力されたパルスをステートで指定した状態から計測し、状態が変わったら(ステート=1の場合は1→0、ステート=0の場合は0→1)その時間を2uSの単位で変数へ書き込むプログラムです。
図BS3-1
ステートで指定した値にならないと測定を開始しませんが、コマンド実行後0.131秒以上経過すると時間切れとなり変数に0を入れてコマンドを終了します。測定したパルス幅は2uSごとに測定しますので、例えばパルス幅が6uSなら結果は3になります。」
サンプルプログラム
TIME VAR WORD
LOOP:
PULSIN 7, 1, TIME
IF THIME=0 THEN LOOP
DEBUG CLS,DEC ? TIME
GOTO LOOP
図BS3-2
スイッチを押すとコンデンサに充電された電流が開放されます。この時間は約120uSなので結果は約60前後(素子のバラツキがあるので”約60”)になります。
COUNT
U、2SXのみ
文法
COUNT ピン番号, パラメータ, 変数
解説
ピン番号で指定したピンをインプットモードに設定し、パラメータで指定した時間の間に何回周期があったか(0から1から0又は、1から0から1)を数え、変数に代入します。パラメータの単位はUが1ms、2SXが0.4msです。
スタンプUは入力パルス幅が4us以下だと測定できません。また、一周期は最低でも8uS(0→1又は1→0)必要なため、測定限界は8uS=125KHzとなります。
2SXは1.6us以下だと測定不可です。
交流波のゆっくりしたパルスを入力した場合はスタンプのスレッショルド電圧(0→1または1→0の境界線)1.5V付近で複数回カウントしてしまう(実際より多くカウントしてしまう)可能性があります。そのような入力波の場合はシュミットトリガ回路またはコンパレータで方形波に修正したほうがよいでしょう。
サンプルプログラム
COUNT 0, 1000, W1 :Uの場合は1秒間の測定。
BUTTON
文法
BUTTON ピン番号, ダウンステ−ト, リピートデレイ, リピートレート, ワーク変数, ターゲットステート, ラベル
解説
ループ文の中で使われ、外部に接続されたボタンが押されたかどうかの判定を行います。ライン0にプルアップ抵抗で5Vが接続されている(つねに1になっている)回路で、スイッチをおすとグランドにつながり0になるというが回路あったとします。
図SB2-1
ボタンが10回押されたかどうかのプログラムは一見
INPUT 0
B1=0
loop:
IF in0=1 THEN loop :ボタンが押されていなかったらloop
B1=B1+1
IF B1=10 THEN done
PAUSE 100 :ちょっと時間をおく
done:
END
となりそうですが、実際の機械式のボタンはスイッチを入れた瞬間に接点がバウンドしてONとOFFを何回か繰り返してから落ち着いた状態になるため、上記のIF文のループでは処理できません。(10回以内で終了してしまう確立が高い。)そこでこのボタンの判定専用のBUTTONコマンドを使います。
ピン番号(0〜15)で入力のピンを設定します。ダウンステート(0,1)は1か0どちらの状態で押されたと判定するかを決めます。また、BUTTONコマンドはPCのキーボードのようなオートリピート(ボタンを押しっぱなしにすると何回も入力があったようになる)機能があります。BUTTONコマンドはリピートディレイ(0〜255)で設定されたループ回数分ボタンがおされていると自動的にオートリピートをおこないます。但し、これは他の時間を制御する文とは違い、スタンプの種類またはBUTTON文を含んでいるループの長さによって待ち時間が変わります。0と255は特別な値で、0の場合はスイッチを入れた瞬間のバウンドを防止する機能をカットし、255の場合はオートリピートをしないモードになります。リピートレート(0〜255)はオートリピートのリピート周期を設定します。数値を低くするほどリピートは早くなります。ワーク変数はBUTTONコマンド用に変数を1つ用意する必要があり、使用前(ループの外)に値を0にする必要があります。ターゲットステート(0,1)は0にしたばあいはボタンが押されて無い場合にジャンプをし、1の場合は押されている場合にジャンプをします。ラベルはそのジャンプ先を表します。
サンプルプログラム
btnWk VAR BYTE
btnWk=0
LOOP:
BUTTON 11,0,255,250,btnWk,0,noPress
DEBUG"*"
noPress:
GOTO LOOP
上記回路を組んでこのプログラムを実行すると、ボタンを押したときに*マークが1個表示されます。リピートディレイやリピートレートを変えて実験して見てください。
XOUT
解説
家庭用のACラインからデータを送れるX−10規格用の信号を作り、出力します。日本では一般的でないため説明を割愛いたします。
ロボット作成教室のもくじへBack
つぎへ進む
Home