2023.3.2
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第190回]



●PICUSBIO用BASIC説明書(5)BASIC命令

今回はBASIC説明書の第5回です。

5章  BASIC命令(ステートメント)

命令(ステートメント)はBASICプログラム中でそれぞれの動作を指定するのに使われます。
この命令と次章で説明する関数がBASICの主要な構成要素です。
したがってこの命令と関数の働きを理解すればBASICプログラムは自由に使いこなすことができます。
命令はコマンドモードでダイレクトに実行することもできます。

CLOSE #n

ファイルをクローズするための命令です。
オープンしたファイルは最後にクローズして終る必要があります。
CLOSE命令を実行しないでプログラムを終了するとオープンしているファイルは破棄されてしまいます。
BASICを/EXITかまたは[Ctrl]+[C]で終了するとそのときオープンしているファイルに対しては強制的にCLOSE命令が実行されます。
使用例や使い方については[第7回][第8回]を参照してください。

DATA

READ文で読み込まれる数値を定義します。
READ文より前にあっても後ろにあっても構いません。
複数のDATA文を書いても構いません。
READ文は小さい行番号のDATA文から順に読んで行きます。
整数および文字定数をカンマ( ,)で区切って複数個記述できますがその型がREAD文の変数の型と一致しない場合は実行時にエラーになります(数値を文字型変数に読み込むことはできますが文字を整数型変数に読み込むことはできません)。
文字定数は” ”でくくらないでそのまま表記します(” ”を使うと” ”は無視されます)。

[使用例]
10 DATA 123,ABCDE,4567

50 READ A,Y$

90 READ Z
100 PRINT A,Y$,Z

>RUN
123 ABCDE 4567

[注意]DATA文はマルチステートメント記述(複数の命令を:で区切って同じ行に続けて書くこと)はできません。
ただしその行にラベルをつけて下のように記述することは許されます。

[許される使用例]
100 *ABC:DATA 123,ABCDE,4567

DIM

配列変数を定義します。
3次までの整数型の配列を使うことができます。
普通の変数はLET文で値を入れるときに変数名の定義も同時に行ってしまうのですが配列はまずDIM文で配列名とその配列の大きさを定義してからでないと使うことができません。
DIM文では名前と大きさ(1次〜3次の別、要素の数)を定義するだけで個々の配列要素には初期値は入りません。
各配列要素にはDIM文で定義したあとでLET文で値をセットします。
DIM文はプログラム中のどこにあっても構いませんがプログラムの途中に置くのはプログラムミスのもとにもなりますからできるだけプログラムの始めの部分に書いておく方がよいでしょう。
一つのDIM文の中で複数の配列名を定義することもできますし一つのプログラムの中で何回DIM文を使用しても構いません。

[使用例]
10 DIM AKA(3,5,2),KI(6,3)

上の文によって整数型配列AKA(a,b,c)(a=0〜3、b=0〜5、c=0〜2)整数型配列KI(d,e)(d=0〜6、e=0〜3)が定義されます。
DIM文で定義しない配列名を他の文の中で使用したりあるいは添字(カッコ内の要素を示す数値)の値としてDIM文で定義した数よりも大きい数を用いたりするとエラーコードが出されます。

[注意1]普通の変数名と配列名とで同じ名前を使用してはいけません。
[注意2]DIM命令はダイレクトモードでは使用できません。

FOR〜NEXT

[書式]
FOR 変数名(または配列名)=開始値 TO 終了値 STEP 増分
    :
NEXT 変数名(または配列名)

FOR文からこれに対応するNEXT文までの間の命令を指定条件が満たされるまで繰り返し実行します。
変数名(または配列名)には開始値がセットされて、FOR文とNEXT文の間にある文が実行され、次にその変数名(または配列名)の値に増分が加算されて、またFOR文とNEXT文の間にある文が実行されます。
繰り返し実行された結果変数名(または配列名)の値が終了値を越えるとこのループから抜け出てNEXT文の次の文が実行されます。

[使用例]
10 FOR A=3 TO 16 STEP 2
20 PRINT A,;
30 NEXT A
40 PRINT ”END”,A

>RUN[Enter]
3 5 7 9 11 13 15 END 17

この例ではA=3からはじまって2ずつ増加しながら10〜30の文を繰り返し実行し16を越えたら、つまり17になったところでNEXTの次の文に移ります。
A=17のときにはループの中の処理は行われないで外に出ます(A=15までしか実行されていないことに注意して下さい)。

[注記1]開始値、終了値、増分ともにマイナス値を入れることもできます。
増分にマイナス値を指定するとカウンタの値は順に減って行きます。
増分にマイナス値を指定した場合には変数の値が終了値よりも小さくなった時点でループから抜け出します。
[注記2]STEPを省略することもできますがこのときは増分は1になります。
[注記3]FOR〜NEXT文の中に別のFOR〜NEXT文を多重に使用することができます。
多重使用(ネスティング)はシステムのスタックエリアをそれだけ多く使用するため限度を越えるとエラーコードが表示されます。
GOSUB文でも使用されるためFOR〜NEXT文を何重に使用できるかはそのプログラムによって異なります。
FOR〜NEXT文を多重使用する場合には内側のループ文は外側のループ文に完全に含まれていなければなりません。
         (正)                              (誤)                 
10 FOR A=1 TO 20                 10 FOR A=1 TO 20
    :                                  :
50 FOR B=3 TO 60                 50 FOR B=3 TO 60
    :                                  :
120 NEXT B                        120 NEXT A
    :                                  :
200 NEXT A                        200 NEXT B
    :                                  :
誤って使用した場合にはエラーコードが表示されます。
次の例は外にまたがっているようですがまた戻って来ているので、誤りではありません。

10 FOR A=1 TO 20
    :
50 FOR B=3 TO 60
    :
70 GOTO 260
    :
100 X=X+1
    :
200 NEXT A
    :
220 STOP
    :
260 PRINT A
    :
280 NEXT B
    :
300 GOTO 100

GOSUB〜RETURN

サブルーチンの呼び出し、及びサブルーチンからの戻りを制御します。
GOSUB文で指定する行から始まるサブルーチンを実行しRETURN文でさきほどのGOSUB文の次の文に戻ります。
行番号の指定は正の整数のほか*マーク付のラベル名も許されます。
指定した行番号、ラベル名が存在しないときはエラーコードが表示されます。
GOTO文と似ていますが、GOSUB文の場合にはRETURN文をみつけると先程のGOSUB文の場所に戻ってその次の文から実行を続けます。
サブルーチンはこのように呼ばれた先へまた戻って行くので同じ処理を違う場所で何回も行いたいときに使うと便利です。

[使用例1]
  10 GOSUB 300  ………行番号300から始まるサブルーチンに行く
  50 GOSUB *ABC  ………ラベル名*ABCの書かれたサブルーチンに行く
[使用例2]
  10 GOSUB 100
  20 A=A+1
      :
  50 GOSUB 100
  60 B=A
      :
  90 STOP ……忘れないように!
 100 PRINT A,B
      :
 150 RETURN

1つのプログラムの中でサブルーチンはいくつ使っても構いません。
またサブルーチンの中で別のサブルーチンを呼び出すサブルーチンの多重使用も許されますがFOR〜NEXTと同様にGOSUBとRETURNがペアになっている必要があります。
サブルーチンの中でGOTO(特に IF GOTOが間違いやすい)を多用するとRETURN文を実行しないでまたもとのGOSUB文を実行してしまうようなプログラムになってしまうことがあります。
このような場合には急速にスタックを消費するためやがてエラーになってしまいます。
またGOSUB文を実行していないのにGOTO文でサブルーチンの途中に入ってしまいRETURN文を実行してしまうようなプログラムになることがあります。
この場合もエラーコードが表示されます。

GOTO

指定する行にジャンプしてそこから実行を続けます。
行番号の指定は正の整数のほか*マーク付のラベル名も許されます。
指定した行番号、ラベル名が存在しないときはエラーコードが表示されます。

[使用例]
  10 GOTO 300  …………行番号300にジャンプする
  50 GOTO *ABC …………ラベル名*ABCの行にジャンプする
 
IF… THEN

IFの後に続く式(関係式または論理式)の結果が真であればTHENより後ろの文を実行し偽であればその次の行が実行されます。
IF THEN ELSEの形はありません。

[例]
10 IF A<10 PRINT ”YES”:GOTO 100
20 PRINT ”END”

Aが10以下の場合はPRINT ”YES”とGOTO 100の文が実行され10以上の時は20行が実行されます。
IF ... THEN GOTO の場合はIF ... GOTOのように書くこともできます。
[23.3.6 注記]この項を訂正しました。
経緯については[第192回]を参照してください。


●文字型の比較
関係演算子(=、<、>、<=、>=、#)を使って、文字の大小比較ができます。
文字型の比較は文字数の多い方が大になります。
同じ文字数の場合には先頭から1文字ずつキャラクタコードを比較していき最初に大きいキャラクタコードの文字があらわれた方が大になります。

INPUT

キーボードから変数または配列にデータを入力します。
入力データとして定数以外の変数名、配列名や式を入力することはできません。
PRINT文などと同じく要素を ,で区切って複数個記述することができます。

[使用例]
10 INPUT A,B,C
プログラムが実行されるとまず、A?と表示して入力待ちになります。
そしてこれに答えると次に、B?と表示して再び入力待ちになります。
このようにしてすべてのデータが入力されるまで繰り返し入力が行われます。

●INPUT文にはPRINT文と同じ文字列表示機能があります。
次のように文字列を” ”で囲んで記述することによりその文字列を表示させることができます。

[使用例]
10 INPUT”DATA”,A,”NINZU ”,C
>RUN[Enter]
DATAA?    ………これに入力すると、その次が表示される
NINZU C?

文字列と変数との間のカンマ( ,)を省略すると変数名及び?の表示が省略されます。
10 INPUT”DATA”A,”NINZU ”C
>RUN[Enter]
DATA   ………これに入力すると、その次が表示される
NINZU

[注記]INPUT文が実行されると、コマンドモードと同じようにカーソルマークが表示されますが、この時はコマンドモードとは別の入力方式になっているため[Insert][Delete][←][→][↑][↓]は使用できません。[Backspase]は使用できます。

LET

変数、配列に値を代入します
LET A=3
LET B=(C+D)/A
上記のように左辺は、変数、配列でなければなりませんが右辺は定数、式も許されます。
式の場合はその式を計算した結果が変数に格納されます。
LETは完全に省略することができ、例えば
        LET A=A+3 は
        A=A+3
と表記することができます。
これは数学的にはおかしいのですがこの=は等号ではなく代入記号として用いられていると考えて下さい。
つまり A=(イコール)A+3ではなくて、AにA+3の結果を代入する、の意味です。

[使用例]
10 LET A=1:LET B=0:LET C(D,5)=3+A:LET X$=”ABC”
LETは省略することができます
10 A=1:B=0:C(D,5)=3+A:X$=”ABC”
文字型の場合には=の右側には文字定数、文字変数を書くことができますが式としては次の例のように複数の文字変数、文字定数、文字関数を + でつないで書くことのみが許されます。

[使用例]
10 A$=”ABC”:B$=”XYZ”
20 C$=A$+”HIJK”+B$+CHR$($42)
30 PRINT C$
>RUN[Enter]
ABCHIJKXYZB

[注意]文字変数には最大39桁の文字列しか代入できません。
もしそれよりも大きい文字列を代入しようとするとエラーコードが表示されます。

ON ERROR GOTO

プログラムの実行中にエラーが発生した場合にこの文で指定する行番号の文が実行されます。
このときシステム変数ERLにはエラーが発生した行番号がセットされERCにはエラーの種類を示すコードがセットされます。
この文はエラーが発生するより前に実行されている必要があります。
したがってプログラムの一番先頭に書いておくようにします。
存在しない行番号を指定した場合エラーが発生してもエラー処理ルーチンは実行されずにエラーコードを表示してブレイクします。
エラー処理ルーチンの終わりはRESUME文かSTOP文である必要があります([注意](3)参照)。

[使用例]
10 ON ERROR GOTO 100
20 INPUT A,B
30 PRINT A/B
40 GOTO 20
100 PRINT ”ERROR!”,ERL,ERC
110 RESUME NEXT
上のプログラムを実行して、Bに0を入力すると下のように表示されます。
ERROR!     30     12     …エラーコード12は0除算エラーです
A?

[注意]エラー処理ルーチンには通常の命令文を自由に使用して構いません。
行数の制限はありません。
エラー処理ルーチンと普通のルーチンとはみかけ上は区別できませんが次の点が異なっています。
(1)エラー処理ルーチンの実行中に[Ctrl]Bによりブレイクした場合、CONTコマンドで実行を再開することはできません。
(2)エラー処理ルーチンの実行中にエラーが発生した場合には、ON ERROR GOTO文は実行されずエラーコードを表示してブレイクします。
この場合もブレイク後にCONTコマンドで実行を再開することはできません。
(3)RESUME文によりエラー処理ルーチンが終了しメインルーチンの実行継続に必要な情報がセットしなおされます。
たとえばFOR〜NEXTやGOSUB〜RETURN文の途中でエラーが発生して、ON ERROR GOTO文によりエラー処理が行われたあと、RESUME文によらずにGOTO文などでもとのルーチンに戻るとスタックの食い違いにより異常な動きになります。

BASIC命令の説明の途中ですが、長くなりましたので今回はここまでとします。
この続きは次回にいたします。

PIC−USBIO using BASIC[第190回]
2023.3.2upload

前へ
次へ
ホームページトップへ戻る