
■ BASCOM-AVR (DEMO) の使用方法 ■ |
進行制御命令 |
● ジャンプとサブルーチンの命令です。 |
GOTO |
指定されたラベルの行に、プログラムの進行を移します。 (ジャンプします) |
GOSUB |
指定されたラベル行の、サブルーチンを実行します。 |
RETURN |
サブルーチンまたは割り込み処理ルーチンを終了し、元のプログラムへ戻ります。 |
DECLARE SUB |
変数や値を受け渡す機能を持った、サブルーチンを宣言します。 |
CALL |
変数や値を受け渡す機能を持った、サブルーチンを呼び出します。 |
SUB |
変数や値を受け渡す機能を持った、サブルーチンの手続きを定義します。 |
DECLARE FUNCTION |
ユーザーが作成する関数を宣言します。 |
CONFIG SUBMODE |
サブルーチンやユーザー関数が、新しいモードで動作するように指示します。 |
END |
プログラムの実行を、すべて終了します。 |
STOP |
プログラムの実行を、中断します。 |
BREAK |
シミュレータまたはデバッガを使用してプログラムを中断させます。 |
MACRO |
プログラム内で使用するマクロを定義します。 |
● ループ処理の命令です。 |
DO-LOOP |
指定した条件が成立するまで、プログラムのブロックを繰り返し実行します。 |
WHILE-WEND |
指定した条件が成立している間、プログラムのブロックを繰り返し実行します。 |
FOR-NEXT |
変数をカウンターとして使用し、プログラムのブロックを繰り返し実行します。 |
EXIT |
ループ処理やサブルーチンから、強制的に抜け出します。 |
CONTINUE |
DOやFOR命令などのループ内での処理を、ループの終わりまでスキップします。 |
REDO |
DOやFOR命令などのループ内での処理を、ループの初めまで戻します。 |
● 条件判定による分岐命令です。 |
IF-THEN-ELSE |
式の条件を判定し、結果により処理や分岐を行います。 |
SELECT-CASE |
指定した変数の値により、任意の条件で処理を分けます。 |
ON value |
変数の値に合わせて、指定されたラベルの命令行に分岐します。 |
● ソフトウェア・タイマーによる遅延命令です。 |
WAIT |
指定された時間の間、プログラムの進行を停止させます。 (秒単位で設定) |
WAITMS |
指定された時間の間、プログラムの進行を停止させます。 (mS単位で設定) |
WAITUS |
指定された時間の間、プログラムの進行を停止させます。 (μS単位で設定) |
DELAY |
1msの間、プログラムの進行を停止させます。 |
NOP |
何も処理しないコードを挿入します。 |
GOTO |
一覧へ戻る |
指定されたラベルの行に、プログラムの進行を移します。 (ジャンプします)
・無条件に、プログラムの流れを変える命令です。
|
(例) ポートCピン0の状態を、500mSごとに反転し続けます。 |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
' |
' |
Mainprg: |
' |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Waitms 500 |
' 500mSの期間、待ちます。 |
Goto Mainprg |
' 指定したラベルの行にジャンプします。 |
|
|
GOSUB |
一覧へ戻る |
指定されたラベル行の、サブルーチンを実行します。
・プログラムは指定されたラベル行に移行(ジャンプ)し、実行を続けます。
・そして、RETURN命令があるとサブルーチンを終了し、プログラムはGOSUB命令の後の命令に戻り、
実行を続けます。
・サブルーチンの中から、別のサブルーチンを実行することもできますが、リターンアドレスを
ハードウェア・スタック領域に保存するため、領域の広さにより、制限を受ける場合があります。
|
(例) ポートCピン0の状態を反転する、サブルーチンを実行します。 |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
Gosub Subtog |
' サブルーチンを実行します。 |
End |
' プログラムの終了。 |
' |
' |
Subtog: |
' |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Return |
' サブルーチンの終了。 |
|
|
RETURN |
一覧へ戻る |
サブルーチンまたは割り込み処理ルーチンを終了し、元のプログラムへ戻ります。
・サブルーチンの終わりに、RETURN命令を記述することで、プログラムはGOSUB命令の後の命令に
戻り、実行を続けます。
・サブルーチン内に、複数のRETURN命令を記述することは可能ですが、必ずGOSUB命令から
呼び出される形をとる必要があります。
・割り込み処理ルーチンも同様に、RETURN命令を記述したところで、割り込み処理を終えて、
メインプログラムへ戻ります。
|
DECLARE SUB |
一覧へ戻る |
変数や値を受け渡す機能を持った、サブルーチンを宣言します。
書式 |
Declare Sub name (BY variable As type , ・・・・・) |
注釈 |
|
BY = |
byval
byref |
−定数または変数の値をコピーしたものを受け渡します。(値渡し)
−変数の値を示すアドレスを受け渡します。(参照渡し) デフォルト |
|
variable = |
サブルーチン内で使用する、変数や配列の名前。 |
type = |
変数や配列の型式。 (Byte, Word, Integer, Long, Single, String) |
|
・少々難解な命令なので、初心者の方は、通常の変数宣言(DIM)とGOSUB命令の組み合わせを
お勧めします。
・サブルーチンを呼び出すCALL命令を使用する場合は、必ずDECLARE SUB命令で、サブルーチンの
名前と、サブルーチンに受け渡されて内部で使用する、変数の形式を宣言しなければなりません。
・byvalは、数値定数や変数の値を受け渡しますが、サブルーチン内でこの変数の値が変更されても、
サブルーチン終了時に、変更された値は戻されません。
・byrefを記述または何も記述しない場合は、変数の値を示すアドレスが受け渡され、こちらは、
サブルーチン内で使用した変数の値を、受け渡した変数に戻します。 ・変数は、Byte、Word、Dword、Integer、Long、Single、Double、String のいずれかで、Bitはサポート
されていません。 ・byvalまたはbyrefを指定しない場合、変数は参照渡し(byref)されます。
・ラベルのアドレスを渡すには、Bylabelを使用します。
・配列は、参照(byref)によってのみ渡すことができます。
・変数の後に空白の括弧()をつけて、配列を渡すことを示す必要があります。
・また、サブルーチンや関数内部で変数にアクセスする際には()を使用する必要があります。
・Config Submode = New で新しいモードを指定すると、これらの動作が下記のように変わります。
・サブルーチンやユーザー関数を呼び出す前に、DECLARE命令で宣言する必要がなくなります。
・詳細はCONFIG SUBMODE命令を参照してください。
|
(例) byvalを使用 |
|
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
$baud = 9600 |
' ボーレートを9600ボーに設定。 |
' |
' |
Dim A As Byte |
' 使用する変数を宣言。 |
Declare Sub Test(byval B As Byte) |
' サブルーチンを宣言。 |
A = 2 |
' テスト用の数値を代入。 |
Call Test(A) |
' サブルーチンを呼び出し。(数値を受け渡し) |
' Call Test(2) |
' 上記の記述と同じ働き。 |
Print A |
' 戻りの数値を出力。 (2が出力されます) |
End |
' プログラムの終了。 |
' |
' |
Sub Test(byval B As Byte) |
' サブルーチンの手続きを定義。 |
B = B + 1 |
' 受け渡された数値に1を足す。 |
Print B |
' 計算結果を出力。 (3が出力されます) |
End Sub |
' サブルーチンの終了。 |
|
|
(例) byrefを使用 |
|
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
$baud = 9600 |
' ボーレートを9600ボーに設定。 |
' |
' |
Dim A As Byte |
' 使用する変数を宣言。 |
Declare Sub Test(byref B As Byte) |
' サブルーチンを宣言。 |
A = 2 |
' テスト用の数値を代入。 |
Call Test(A) |
' サブルーチンを呼び出し。(アドレスを受け渡し) |
Print A |
' 戻りの数値を出力。 (3が出力されます) |
End |
' プログラムの終了。 |
' |
' |
Sub Test(byref B As Byte) |
' サブルーチンの手続きを定義。 |
B = B + 1 |
' 受け渡された数値に1を足す。 |
Print B |
' 計算結果を出力。 (3が出力されます) |
End Sub |
' サブルーチンの終了。 |
|
|
CALL |
一覧へ戻る |
変数や値を受け渡す機能を持った、サブルーチンを呼び出します。
書式 |
Call name (variable , ・・・・・) |
注釈 |
name = |
サブルーチンの名前。 |
variable = |
サブルーチンに受け渡す、変数名または数値定数。 |
|
・サブルーチンを呼び出すCALL命令を使用する場合は、必ずDECLARE SUB命令で、サブルーチンを
宣言しなければなりません
・プログラムは、指定された名前のサブルーチンを実行します。
・そして、END SUB命令があるとサブルーチンを終了し、プログラムはCALL命令の後の命令に戻り、
実行を続けます。
・CALL命令を使用せずに、サブルーチンを呼び出す書式も使用できます。
Call Routine(x , y , z) は、Routine x , y , x と、括弧を外し記述できます。
|
SUB |
一覧へ戻る |
変数や値を受け渡す機能を持った、サブルーチンの手続きを定義します。
書式 |
Sub name (BY variable As type , ・・・・・) |
注釈 |
|
BY = |
byval
byref |
−定数または変数の値をコピーしたものを受け渡します。(値渡し)
−変数の値を示すアドレスを受け渡します。(参照渡し) デフォルト |
|
variable = |
サブルーチン内で使用する、変数や配列の名前。 |
type = |
変数や配列の型式。 (Byte, Word, Integer, Long, Single, String) |
|
・CALL命令で呼び出される、サブルーチンの名前と手続きを定義します。 (ラベルと同意)
・この手続きの後に、サブルーチンのプログラムを記述し、最後にEND SUB命令を記述します。
・nameから後の記述は、DECLARE SUB命令で宣言された、受け渡される変数などと同じ物を記述
しますが、省略することも可能です。 (受け渡しが明確になるので、記述しておくことが大事です)
・簡単かつ正確に記述するには、DECLARE SUB命令行をコピーし、サブルーチンの冒頭に貼り付け、
「DECLARE」の文字を取り除きます。
|
DECLARE FUNCTION |
一覧へ戻る |
ユーザーが作成する関数を宣言します。
書式 |
Declare Function name (BY variable As type , ・・・・・) |
注釈 |
|
BY = |
byval
byref |
−定数または変数の値をコピーしたものを受け渡します。(値渡し)
−変数の値を示すアドレスを受け渡します。(参照渡し) デフォルト |
|
variable = |
ユーザー関数内で使用する、変数や配列の名前。 |
type = |
変数や配列の型式。 (Byte, Word, Integer, Long, Single, String) |
|
・関数を作成する前、または関数を呼び出す前に、必ずDECLARE FUNCTION命令で、関数の名前と、
関数に受け渡されて内部で使用する、変数の形式を宣言しなければなりません。
・byvalは、数値定数や変数の値を受け渡しますが、関数内でこの変数の値が変更されても、
関数終了時に、変更された値は戻されません。
・byrefを記述または何も記述しない場合は、変数の値を示すアドレスが受け渡され、こちらは
関数内で使用した変数の値を、受け渡した変数に戻します。
・変数は、Byte、Word、Dword、Integer、Long、Single、Double、String のいずれかで、Bitはサポート
されていません。
・byvalまたはbyrefを指定しない場合、変数は参照渡し(byref)されます。
・ラベルのアドレスを渡すには、Bylabelを使用します。
・配列は、参照(byref)によってのみ渡すことができます。
・変数の後に空白の括弧()をつけて、配列を渡すことを示す必要があります。
・また、サブルーチンや関数内部で変数にアクセスする際には()を使用する必要があります。
・Config Submode = New で新しいモードを指定すると、これらの動作が下記のように変わります。
・サブルーチンやユーザー関数を呼び出す前に、DECLARE命令で宣言する必要がなくなります。
・詳細はCONFIG SUBMODE命令を参照してください。
|
(例) |
|
Function Myfunc(b as byte) as Byte |
' ユーザー関数を宣言する。 |
Local Bdummy As Byte |
' ローカル変数を宣言する。 |
・・・・・ |
' ユーザーのコード記述する。 |
Myfunc = 3 |
' 結果を代入する。 |
End Function |
' ユーザー関数の終了。 |
|
|
CONFIG SUBMODE |
一覧へ戻る |
サブルーチン(DECLARE SUB、SUB)やユーザー関数(DECLARE FUNCTION)が新しいモードで
動作するようにコンパイラーに指示します。
書式 |
Config Submode = mode |
注釈 |
mode = |
New : サブルーチンやユーザー関数の取り扱いが新しくなったモード。
Old : バージョン2.0.7.0までの互換モード。 |
|
・初期状態では、古い動作の(Old)が使用されます。
・これはバージョン2.0.7.0まで使用されていた古いモードです。
・この古いモードでは、サブルーチンやユーザー関数を呼び出す(使用する)前に、DECLARE命令で
それらを宣言する必要があります。
・また、DECLARE命令による宣言は、サブルーチンやユーザー関数と同じプログラム内に配置する
必要があります。
・しかし、BASIC言語はプログラムの冒頭から順に処理が進むため、プログラムの最初に
サブルーチンやユーザー関数が記述されていると、それがサブルーチンとして呼び出されずに、
メインプログラムの流れとして直接実行されてしまうため問題が生じます。
・これを回避するには、END命令の後にサブルーチンやユーザー関数を配置する必要があります。
・このため、$include命令を使用してサブルーチンやユーザー関数をプログラム内に組み込む場合、
それらが記述された$includeファイルをプログラム・コードの最後に挿入し、DECLARE命令が
記述された$includeファイルをコードの最初に挿入する必要があります。 (これは非効率的)
・または、GOTO命令を使用して、サブルーチンやユーザー関数を飛び越すように、メインプログラムの
流れを作る方法もあります。
・つまり、DECLARE命令とサブルーチンやユーザー関数を1つのファイルにまとめて、プログラムの
最初に組み込む場合は、それらのコードをGOTO命令を使用してジャンプさせる工夫が必要です。
・Config Submode = New で新しいモードを指定すると、これらの動作が下記のように変わります。
・サブルーチンやユーザー関数を呼び出す前に、DECLARE命令で宣言する必要がなくなります。
・ただし、実際のサブルーチンやユーザー関数のコードは、呼び出しを行う処理の前に置かれなければ
なりません。
・それは、使用されるサブルーチンやユーザー関数のみの記述です。
・コンパイルされたサブルーチンやユーザー関数のコードは、コンパイラによってメインプログラムの
後に配置されます。
・これはユーザーが考慮や心配をする必要はありません。
・サブルーチンやユーザー関数のコードは自動的にEND命令の後に格納されるので、それらのコードを
飛び越えるためのGOTO命令は必要なく、プログラムの最初にモジュールを$includeすることが
可能です。
・サブルーチンやユーザー関数はマクロのように動作して、使用される場合にのみ組み込まれます。
・動作しないコードや未使用のコードはコンパイルされません。
・これにより、サブルーチンやユーザー関数を集めたファイルを$Includeすれば、コンパイラが
コンパイル時にどのアイテムを使用するかを判断してくれるので、フラッシュのスペースの無駄な
浪費を省くことができます。
|
END |
一覧へ戻る |
プログラムの実行を、すべて終了します。
・プログラムがEND命令に到達すると、割り込みはすべて禁止となり、その場所で永久のループが
実行されます。
・通常のアプリケーションで使用することはありませんが、周辺機器の故障等により、プログラムの
停止が必要となる様な、特別な場合に使用します。
・また、メインプログラムの最後に、END命令を記述する習慣をつけることで、記述のミスにより
メインプログラムがサブルーチンに入り込むような事態も、防ぐことができます。
|
STOP |
一覧へ戻る |
プログラムの実行を、中断します。
・プログラムがSTOP命令に到達すると、その場所で永久のループが実行されます。
・END命令との違いは、割り込みが禁止されないことです。
|
BREAK |
一覧へ戻る |
シミュレータまたはデバッガを使用してプログラムを中断させます。
・多くの新しいチップがアセンブラの[BREAK]命令をサポートしています。
・BascomのBREAK命令は、シミュレータの実行を中断させます。
・これは、Bascomのシミュレータだけでなく、Atmels Studioでもサポートされています。
・[BREAK]命令をサポートしていないチップは、[BREAK]命令を[NOP](無操作)として解釈します。
・そのため、すべてのチップで安全に使用できます。
・[BREAK]命令は、アセンブラの[NOP]命令と同じように1サイクルを使用します。
|
MACRO |
一覧へ戻る |
プログラム内で使用するマクロを定義します。
書式 |
Macro label |
注釈 |
label = |
マクロの名前。 (各マクロには他で使用しないラベル名が必要です) |
|
・マクロは、使用する前に定義する必要があります。 ・コンパイラは、定義されたマクロの名前を検出すると、定義されたマクロのコードをその場所に
挿入します。
・マクロが定義されていてもプログラムのコードで使用されていない場合、マクロはコンパイル
されません。
・$INCLUDE命令を使用して、多数のマクロを組み込むことができます。
・サブルーチンに似ていますが違いがあり、例えばサブルーチンには呼び出された終わりに
RETURN(RET)命令が必要です。
・マクロの終わりには[End Macro]を記述します。
|
(例) |
Dim Data1 As Byte , Data2 As Byte |
' 使用する変数を宣言。 |
Macro Reset_data |
' マクロの名前を定義する。 |
Data1 = 12 |
' プログラムに組み込みたい命令群を記述する。 |
Data2 = 34 |
' |
End Macro |
' マクロの終わりを示す。 |
' |
' |
Main: |
' メインプログラム。 |
Reset_data |
' マクロを挿入する。 |
Print Data1 ; Data2 |
' 結果を出力する。 |
|
|
DO-LOOP |
一覧へ戻る |
指定した条件が成立するまで、プログラムのブロックを繰り返し実行します。
書式 |
Do
(プログラムのブロック)
Loop [ Until condition] |
注釈 |
condition = |
終了条件を指定する式。 (オプション) |
|
・まず、DOからLOOP間のプログラムを1度実行し、指定した条件を判定します。
・条件が成立していなければ、DOからLOOP間のプログラムを実行し続け、成立するとLOOPの
次の命令に実行が移ります。
・DOからLOOP間で、EXIT DO命令を使用すると、いつでもループを抜け出すことができます。
・DOからLOOPの間に、さらにDO-LOOPを記述する、入れ子構造も可能です。
・Until conditionを省略すると、永久にDOからLOOP間のプログラムを実行し続けます。
・GOTO命令でも、同じ動作ができますが、プログラムのブロックが小さい場合にはDO-LOOPを使用し、
大きい場合にはGOTOを使用すると、プログラムの流れが判別しやすくなります。
|
(例) |
|
Dim A As Byte |
' 使用する変数を宣言。 |
A = 0 |
' テスト用の数値を代入。 |
Do |
' 繰り返しループ。 |
A = A + 1 |
' Aに1を加算。 |
Print A |
' 結果を出力。 |
Loop Until A = 10 |
' 条件を判定。 |
End |
' プログラムの終了。 |
|
|
WHILE-WEND |
一覧へ戻る |
指定した条件が成立している間、プログラムのブロックを繰り返し実行します。
書式 |
While condition
(プログラムのブロック)
Wend |
注釈 |
|
・まず始めに、指定した条件を判定し、条件が成立しているならば、WHILEからWENDまでの
プログラムを実行し続けます。
・条件が成立しなくなった場合に、WENDの次の命令へ実行が移ります。
・したがって、DO-LOOPとは違い、初めから条件が成立していなければ、一度もWHILEからWEND
までのプログラムを、実行することはありません。
・WHILEからWEND間で、EXIT WHILE命令を使用すると、いつでもループを抜け出すことができます。
・WHILEからWENDの間に、さらにWHILE-WENDを記述する、入れ子構造も可能です。
|
(例) |
|
Dim A As Byte |
' 使用する変数を宣言。 |
A = 0 |
' テスト用の数値を代入。 |
While A < 10 |
' 条件を判定。 |
A = A + 1 |
' Aに1を加算。 |
Print A |
' 結果を出力。 |
Wend |
' 繰り返しループ。 |
End |
' プログラムの終了。 |
|
|
FOR-NEXT |
一覧へ戻る |
変数をカウンターとして使用し、プログラムのブロックを繰り返し実行します。
書式 |
For variable = start To end [Step value]
(プログラムのブロック)
Next variable |
注釈 |
variable = |
カウンターとして使用する、数値変数の名前。 |
start = |
カウンターの初期値を設定する、定数または数値変数。 |
end = |
カウンターの終了値を設定する、定数または数値変数。 |
value = |
カウンターの増減値を設定する数値。 デフォルトは1 (オプション) |
|
・プログラムブロックの実行回数を指定したり、カウンターの値をプログラム中で使用する場合に
便利な命令です。
・カウンターの値はstart値から始められ、Stepオプションを使用しなければ、プログラムブロックを
一度実行するごとに、1が足されます。
・そして、カウンターの値がend値を越えると、繰り返しを終了し、Nextの次の命令へ実行が移ります。
・Stepオプションを使用した場合は、その値がカウンターの増減値として使用されるので、start値が
大きくend値を小さく設定し、Step値をマイナスにすることもできます。
・FORからNEXT間で、EXIT FOR命令を使用すると、いつでもループを抜け出すことができます。
・FORからNEXTの間に、さらにFOR-NEXTを記述する、入れ子構造も可能ですが、必ずFORとNEXTが
対になっていて、カウンターの変数名も別の名前にする必要があります。
・Nextの後にあるvariableは記述の必要がありませんが、入れ子構造にした場合の覚え書きに
利用することもできます。
|
(例) |
|
Dim A As Byte |
' 使用する変数を宣言。 |
For A = 0 To 10 Step 2 |
' FOR-NEXTの条件を設定。 |
Print A |
' 結果を出力。 (0, 2, 4, 6, 8, 10が出力されます) |
Next A |
' 繰り返しループ。 |
End |
' プログラムの終了。 |
|
|
EXIT |
一覧へ戻る |
ループ処理やサブルーチンから、強制的に抜け出します。
書式 |
EXIT statement |
注釈 |
statement = 抜け出す命令語。 ( FOR , DO , WHILE , SUB , FUNCTION ) |
・通常のプログラムで、ループ処理やサブルーチンから、途中で抜け出す様な処理をさせることは、
少ないと思いますが、エラー処理などの緊急の中断が必要な場合に使用すると良いでしょう。
|
(例) |
|
A = 1 |
|
Do |
' ループの処理。 |
Incr A |
' |
If A = 10 Then |
' 条件分岐。 |
Exit Do |
' 変数Aが10になると、処理はDO-LOOPを抜け出します。 |
End If |
' |
Loop |
' |
Print "Loop terminated" |
|
|
|
CONTINUE |
一覧へ戻る |
DO命令やFOR命令などのループ内での処理を、ループの終わりまでスキップします。
・ループ内で処理の流れを変えるジャンプは、常にそのループの内側にあります。
・ループ内で、いくつかのコードをスキップしたい場合があります。
・このような場合、ラベルとGOTO命令を使用することで解決できますが、GOTO命令を使用すると
理解しにくいコードになります。
・CONTINUE命令は、それ以降の処理を飛ばして、ループの終わりの位置まで処理を進めます。
※ CONTINUE命令は、DO-LOOP、WHILE-WEND、FOR-NEXT命令のループ内で使用する必要が
あります。
|
(例) |
|
For B = 1 To 10 |
' ループの処理。 |
Print B |
' REDO命令を使用すると、処理はこの位置に戻ります。 |
If B = 3 Then |
' 条件分岐。 |
Continue |
' 変数Bが3になると、処理はNEXTの位置までスキップします。 |
End If |
' |
If B = 8 Then |
' 条件分岐。 |
Redo |
' 変数Bが8になると、処理はFORの位置まで戻ります。 |
End If |
' 変数は増加しません。 |
Next |
' CONTINUE命令を使用すると、処理はこの位置まで進みます。 |
End |
' プログラムの終了。(このプログラムは永遠に終わらない) |
|
|
REDO |
一覧へ戻る |
DO命令やFOR命令などのループ内での処理を、ループの初めまで戻します。
・ループ内で処理の流れを変えるジャンプは、常にそのループの内側にあります。
・ループ内で、いくつかのコードを繰り返したい場合があります。
・このような場合、ラベルとGOTO命令を使用することで解決できますが、GOTO命令を使用すると
理解しにくいコードになります。
・REDO命令は、それ以降の処理を中断して、ループの初めの位置まで処理を戻します。
※ REDO命令は、DO-LOOP、WHILE-WEND、FOR-NEXT命令のループ内で使用する必要があります。
|
(例) |
|
For B = 1 To 10 |
' ループの処理。 |
Print B |
' REDO命令を使用すると、処理はこの位置に戻ります。 |
If B = 3 Then |
' 条件分岐。 |
Continue |
' 変数Bが3になると、処理はNEXTの位置までスキップします。 |
End If |
' |
If B = 8 Then |
' 条件分岐。 |
Redo |
' 変数Bが8になると、処理はFORの位置まで戻ります。 |
End If |
' 変数は増加しません。 |
Next |
' CONTINUE命令を使用すると、処理はこの位置まで進みます。 |
End |
' プログラムの終了。(このプログラムは永遠に終わらない) |
|
|
IF-THEN-ELSE |
一覧へ戻る |
式の条件を判定し、結果により処理や分岐を行います。
書式 |
If expression Then
Elseif expression2 Then
Else
End If |
注釈 |
|
・条件を判定する式は、こちらを参照して下さい。 → 式と演算子
・式には、変数のビットを判定する書式や、ポートピンを調べるPINも使用できます。
(Dat.1 = 0 , PINC.7 = 1 など)
・Then以降には、条件が成立した場合の処理を記述します。
・条件を追加する場合は、Elseifを使用します。
・成立しなかった場合にも処理を行うには、Elseを使用します。
・各種の書式が可能なので、下記例を参考にして下さい。
|
(例) Elseを使用しない判定。 (条件が成立した時の処理が少ない場合) |
If A = 1 Then B = 1 |
' Aが1ならば、Bに1を代入。 |
|
' Aが1以外ならば何もしない。 |
If A = 1 Then Goto Label1 |
' Aが1ならば、Label1へジャンプ。 |
|
|
(例) Elseを使用しない判定。 (条件が成立した時の処理が多い場合) |
If A = 1 Then |
' |
B = 1 |
' Aが1ならば、Bに1を代入。 |
End If |
' Aが1以外ならば何もしない。 |
|
|
(例) Elseを使用する判定。 (判定後の処理が少ない場合) |
If A = 1 Then B = 1 Else B = 0 |
' Aが1ならばBに1を代入。 |
|
' Aが1以外ならばBに0を代入。 |
|
|
(例) Elseを使用する判定。 (判定後の処理が多い場合) |
If A = 1 Then |
' |
B = 1 |
' Aが1ならば、Bに1を代入。 |
Else |
' |
B = 0 |
' Aが1以外ならばBに0を代入 |
End If |
' |
|
|
(例) 多重の判定。 |
If A = 1 Then |
' |
If B = 1 Then |
' |
C = 1 |
' Aが1でBも1ならば、Cに1を代入。 |
End If |
' |
End If |
' |
|
|
(例) 条件の追加。 |
If A = 1 Then |
' |
C = 1 |
' Aが1ならば、Cに1を代入。 |
Elseif B = 1 Then |
' |
C = 2 |
' Aが1以外で、Bが1ならば、Cに2を代入。 |
Else |
' |
C = 3 |
' Aが1以外で、Bも1以外ならば、Cに3を代入。 |
End If |
' |
|
|
SELECT-CASE |
一覧へ戻る |
指定した変数の値により、任意の条件で処理を分けます。
書式 |
Select Case variable
Case value : 処理
Case value : 処理
:
Case Else : 処理
End Select |
注釈 |
variable = |
条件を判定する数値変数名。 |
value = |
判定する数値または式。 |
|
・判定をする変数の値が、条件と一致した場合に、[ : ] 以降の命令を実行し、END SELECTの次の
命令へ実行が移ります。
・CASE ELSEはオプションですから、必ずしも記述の必要はありません。
・判定値のvalueには、数値の他に下記の式も使用できます。
|
1 , 2 , 3 などの数値 |
その数値に確答した場合。 |
IS > 2 |
2より大きい場合。 (ISに対して関係演算子を記述します) |
2 TO 5 |
2から5の値の場合。 |
Else |
すべての条件以外の場合。 (オプション) |
|
|
(例) |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
$baud = 9600 |
' ボーレートを9600ボーに設定。 |
Dim D As Byte |
' 使用する変数を宣言。 |
Do |
' 繰り返し処理。 |
Input "Input (0-100) ? " , D |
' 変数Dに、数値を入力。 |
Select Case D |
' 変数Dの値を判定。 |
Case 1 : Print "Input data is 1." |
' 1の場合。 |
Case 2 : Print "Input data is 2." |
' 2の場合。 |
Case 3 To 9 : Print "Input data is 3-9." |
' 3〜9の場合。 |
Case Is > 9 : Print "Input data
is 9 Over." |
' 10以上の場合。 |
Case Else : Print "Input data is 0." |
' 上記以外の場合。 |
End Select |
' |
Loop |
' |
|
|
ON value |
一覧へ戻る |
変数の値に合わせて、指定されたラベルの命令行に分岐します。
書式 |
On variable statement label0 , label1 , ・・・・・ [, check ] |
注釈 |
|
statement = |
Goto
Gosub |
- 分岐先へジャンプします。
- 分岐先のサブルーチンを呼び出します。 |
|
label = |
分岐先のラベル名。 (label0 = 値が0の場合、label1 = 値が1の場合) |
|
check = |
変数の値とラベルの数が合わない場合に、エラーを防ぎます。(オプション) |
|
・変数の値が0ならば1番目のラベル、1ならば2番目のラベルのように、値によってラベルを選択し、
statementがGotoならばジャンプを、Gosubならばサブルーチンを実行した後、ON value命令の
次の行へ実行が戻ります。
・変数の値よりラベルの数が少ないと、プログラムが暴走する恐れがありますので、注意が必要です。
・これを防ぐには、Checkオプションを付けます。
・このオプションを付けると、ラベルの数が不足した場合に、何も実行せずに、ON value命令の次の
行へ実行が移ります。
|
(例) |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
$baud = 9600 |
' ボーレートを9600ボーに設定。 |
Dim D As Byte |
' 使用する変数を宣言。 |
Mainprg: |
' |
Input "Input (0-10) ? " , D |
' 変数Dに、数値を入力。 |
On D Goto Lab0 , Lab1, Lab2 , Check |
' 変数Dの値を判定。 |
Print "Error." |
' エラーを出力。 |
Goto Mainprg |
' Mainprgへジャンプ。 |
' |
' |
Lab0: |
' 0の場合。 |
Print "Input data is 0." : Goto Mainprg |
' 結果を出力。 |
Lab1: |
' 1の場合。 |
Print "Input data is 1." : Goto Mainprg |
' 結果を出力。 |
Lab2: |
' 2の場合。 |
Print "Input data is 2." : Goto Mainprg |
' 結果を出力。 |
|
|
WAIT |
一覧へ戻る |
指定された時間の間、プログラムの進行を停止させます。 (秒単位で設定)
書式 |
Wait value |
注釈 |
value = |
停止させる時間。 (秒単位) 整数の数値 ( 1 〜 65535 ) または 変数。 |
|
・ソフトウェアによるタイマーなので、時間の精度は高くありません。
・また、停止中も割り込みは許可されているので、割り込みが多く発生するようなプログラムでは、
さらに精度が悪くなります。
・精度を求めるタイマー処理は、ハードウェアタイマーを使用して下さい。
|
(例) 2秒ごとに、ポートCピン0の状態を反転します。 |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
Do |
' ループ処理。 |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Wait 2 |
' 2秒間停止。 |
Loop |
' |
|
|
WAITMS |
一覧へ戻る |
指定された時間の間、プログラムの進行を停止させます。 (mS単位で設定)
書式 |
Waitms value |
注釈 |
value = |
停止させる時間。 (mS単位) 整数の数値 ( 1 〜 65535 ) または 変数。 |
|
・ソフトウェアによるタイマーなので、時間の精度は高くありません。
・また、停止中も割り込みは許可されているので、割り込みが多く発生するようなプログラムでは、
さらに精度が悪くなります。
・精度を求めるタイマー処理は、ハードウェアタイマーを使用して下さい。
|
(例) 10mSごとに、ポートCピン0の状態を反転します。 (50Hzの方形波を出力) |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
Do |
' ループ処理。 |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Waitms 10 |
' 10mSの間停止。 |
Loop |
' |
|
|
WAITUS |
一覧へ戻る |
指定された時間の間、プログラムの進行を停止させます。 (μS単位で設定)
書式 |
Waitus value |
注釈 |
value = |
停止させる時間。 (μS単位) 整数の数値 ( 1 〜 65535 ) または 変数。 |
|
・ソフトウェアによるタイマーなので、時間の精度は高くありません。
・また、停止中も割り込みは許可されているので、割り込みが多く発生するようなプログラムでは、
さらに精度が悪くなります。
・AVRのクロック周波数により、1〜20μSあたりの精度が、極端に変わります。
・精度を求めるタイマー処理は、ハードウェアタイマーを使用して下さい。
|
(例) 50μSごとに、ポートCピン0の状態を反転します。 (10KHzの方形波を出力) |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
Do |
' ループ処理。 |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Waitus 50 |
' 50μSの間停止。 |
Loop |
' |
|
|
DELAY |
一覧へ戻る |
1mSの間、プログラムの進行を停止させます。
・WAIT命令とは違い、1mSの固定時間タイマーです。
・ソフトウェアによるタイマーなので、時間の精度は高くありません。
・また、停止中も割り込みは許可されているので、割り込みが多く発生するようなプログラムでは、
さらに精度が悪くなります。
・精度を求めるタイマー処理は、ハードウェアタイマーを使用して下さい。
|
(例) 1mSごとに、ポートCピン0の状態を反転します。 (500Hzの方形波を出力) |
$regfile = "m8535.DAT" |
' AVRデバイスを"ATmega8535"に設定。 |
$crystal = 12800000 |
' クロック周波数を12.8MHzに設定。 |
Config PORTC = Output |
' ポートCを出力に設定。 |
Do |
' ループ処理。 |
Toggle PORTC.0 |
' ポートCピン0の状態を反転します。 |
Delay |
' 1mSの間停止。 |
Loop |
' |
|
|
NOP |
一覧へ戻る |
何も処理しないコードを挿入します。
・NOP命令は、アセンブラ命令のNOPを1つ作成します。
・NOP命令は1マシンサイクルを要するので、ごくわずかな遅延を発生させるために使用できます。
・例えば、AVRの動作クロックが1MHzの場合、1つのNOP命令を実行するのに1uSかかります。
・アセンブラのNOP命令を使用するには[!NOP]の記述も使用できますが、NOPの使用は多くの
プログラマーに人気があるため、BASCOMのBASIC命令としても導入しました。
|
|