■ BASCOM-AVR (DEMO) の使用方法 ■
命令文のリファレンス・マニュアル 使用方法のページへ戻る
I/O、メモリー、DATA行 関連の命令
● I/Oポートに関する命令です。
CONFIG PORT 入出力(I/O)ポートの、データ方向を設定します。
SET 出力ポートまたは数値変数の、指定されたピン(ビット)をセット(1)します。
RESET 出力ポートまたは数値変数の、指定されたピン(ビット)をリセット(0)します。
TOGGLE 出力ポートまたは数値変数の、指定されたピン(ビット)を反転します。
BITS 出力ポートまたはバイト型変数に、指定されたビットを1にした数値を入れます。
NBITS 出力ポートまたはバイト型変数に、指定されたビットを0にした数値を入れます。
BITWAIT 指定したポートピンが、ハイレベル(1)またはローレベル(0)になるまで待ちます。
PULSEIN 指定したポートピンに入力されたパルスを検出し、その間隔(時間)を変数に入れます。
PULSEOUT 指定したポートピンに、任意の幅のパルスを発生させます。
SOUND 指定したポートピンに、任意の間隔で任意の期間の、方形波を発生させます。
SHIFTIN I/Oポートを利用して、クロック同期のシリアルデータを入力します。
CONFIG
 SHIFTIN
SHIFTIN命令が、新しいモードで動作するようにコンパイラーに指示します。
SHIFTOUT I/Oポートを利用して、クロック同期のシリアルデータを出力します。
ALIAS ポート名などの、割り当て先が決まっている固有名を、別の名前で参照します。
● ポートピンのスイッチや、キーボードに関する命令です。
DEBOUNCE ポートピンのスイッチを検出し、チャタリング対策の遅延後、指定ラベルへ分岐します。
CONFIG
 DEBOUNCE
DEBOUNCE命令で使用される、スイッチのチャタリング防止の遅延時間を設定します。
CONFIG KBD キースイッチを、マトリックス(格子)状に接続した回路の、構成を設定します。
GETKBD キースイッチを、マトリックス(格子)状に接続した回路の、キー入力を検出します。
CONFIG
 KEYBOARD
PS/2(AT)キーボードを、ポートに接続する場合の、構成を設定します。
GETATKBD PS/2(AT)キーボードから、キーデータを入力します
GETATKBDRAW PS/2(AT)キーボードから、ASCIIコードに変換前の、キー・スキャンコードを取得します。
● メモリーへのアクセスに関する命令です。
READEEPROM EEPROMからデータを読み込み、変数に入れます。
WRITEEEPROM EEPROMへ、変数のデータを書き込みます。
INP AVRのレジスターやSRAM、およびXRAMのメモリー内容を、変数に読み込みます。
OUT AVRのレジスターやSRAM、およびXRAMのメモリーに、データを書き込みます。
PEEK AVRのレジスター・ファイルの内容を、変数に読み込みます。
POKE AVRのレジスター・ファイルに、データを書き込みます。
CPEEK コード・メモリー(プログラム用フラッシュ・メモリー)の内容を、変数に読み込みます。
CPEEKH mega103・128のLPM命令による、上位バンクのメモリー内容を、変数に読み込みます。
VARPTR 変数が割り当てられているメモリー・アドレスを、変数に入れます。
LOADADR 変数が割り当てられているアドレスを、ペアレジスタにロードします。 (アセンブラ支援命令)
LOADLABEL ラベルが割り当てられているメモリー・アドレスを、変数に入れます。
MEMCOPY 変数が割り当てられているメモリー内容を、ブロック・コピーします。
MEMFILL メモリーの任意の範囲を指定した値で埋めます。
SIZEOF 変数のメモリー上のサイズを調べます。 (バイト数で返します)
CONFIG XRAM 外部メモリー(XRAM)へのアクセス状態と、ウェイト・ステートを設定します。
● DATA行に関する命令です。
DATA あらかじめ用意された複数のデータ値を、プログラムに記述します。
RESTORE READ命令でデータを読み込む際に、DATA行の読み込みを開始する位置を指定します。
READ DATA行からデータを読み込み、変数に入れます。
LOOKUP 指定したDATA行の先頭から、任意の位置にある数値データを、変数に読み込みます。
LOOKUPSTR 指定したDATA行の先頭から、任意の位置にある文字データを、変数に読み込みます。
LOOKDOWN 指定したDATA行の中から、数値データを検索し、先頭からの位置を変数に入れます。



CONFIG PORT 一覧へ戻る
入出力(I/O)ポートの、データ方向を設定します。

書式 Config PORTX = direction
Config PINX.b = direction

Config PORTX.b = direction  (ヘルプには未記載ですが、これも可能です)
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号。 ( 0 〜 7 )
direction =   Input
Output

数値定数
 − 入力に設定。
 − 出力に設定。
 − 数値定数により設定。 ( 0 = 入力 , 1 = 出力 )

 
・1つのポート名に、入力と出力が混在する場合は、数値定数を使用します。
・ピン単位で、入出力を設定する場合は、Config PIN命令を使用します。
 
・入出力(I/O)ポートの使用方法は、こちらを参照して下さい。 → 入出力(I/O)ポートの使用方法
 
(例)
Config PORTA = Input ' ポートAをすべて入力ポートに設定します。
Config PORTB = Output ' ポートBをすべて出力ポートに設定します。
Config PORTC = &B00001111 ' ポートCのPin0〜3を出力、Pin4〜7を入力に設定します。
' '
Config PIND.3 = Output ' ポートDのPin3を出力に設定します。



SET 一覧へ戻る
出力ポートまたは数値変数の、指定されたピン(ビット)をセット(1)します。

書式 Set PORTX.b
Set varBit
Set variable.vb
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
varBit ビット型変数。
variable 数値変数。 (バイト、ワード、インテジャー、ロング型)
vb ビットの番号または数値変数。 (0〜7) , (0〜15) , (0〜31)

参照 RESET , TOGGLE

 
(例)
Set PORTC.1 ' ポートCのピン1をハイレベル(1)にします。
' '
Dim B As Byte ' 使用する変数を宣言。
B = 2 ' テスト用の数値を代入。
Set PORTC.B ' ポートCのピン2をハイレベル(1)にします。



RESET 一覧へ戻る
出力ポートまたは数値変数の、指定されたピン(ビット)をリセット(0)します。

書式 Reset PORTX.b
Reset varBit
Reset variable.vb
Reset Watchdog
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
varBit ビット型変数。
variable 数値変数。 (バイト、ワード、インテジャー、ロング型)
vb ビットの番号または数値変数。 (0〜7) , (0〜15) , (0〜31)
Watchdog ウォッチドッグ タイマーの再スタート。

参照 SET , TOGGLE , CONFIG WATCHDOG

 
(例)
Reset PORTC.1 ' ポートCのピン1をローレベル(0)にします。
' '
Dim B As Byte ' 使用する変数を宣言。
B = 2 ' テスト用の数値を代入。
Reset PORTC.B ' ポートCのピン2をローレベル(0)にします。



TOGGLE 一覧へ戻る
出力ポートまたは数値変数の、指定されたピン(ビット)を反転します。

書式 Toggle PORTX.b
Toggle varBit
Toggle variable.vb
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
varBit ビット型変数。
variable 数値変数。 (バイト、ワード、インテジャー、ロング型)
vb ビットの番号または数値変数。 (0〜7) , (0〜15) , (0〜31)

参照 SET , RESET

 
(例)
Toggle PORTC.1 ' ポートCピン1の状態を反転します。



BITS 一覧へ戻る
出力ポートまたはバイト型変数に、指定されたビットを1にした数値を入れます。

書式 PORTX = Bits(bn , bn , ・・・)
variable = Bits(bn , bn , ・・・)
注釈
X ポートの名前。 ( A , B , C , D , E , F )
bn 1にするピンの番号。 ( 0 〜 7 )
variable バイト型変数。
bn 1にするビットの番号。 ( 0 〜 7 )

参照 NBITS

 
・&B(2進表記)や、&H(16進表記)でも、同様に設定や代入ができますが、ビットを10進数で
 わかりやすくセットできる命令です。
BITS命令が使用できる変数は、バイト型のみです。
 
(例)
Config PORTC = Output ' ポートCを出力に設定。
' '
PORTC = &B10000010 ' ポートCへ出力。
PORTC = &H82 ' 上記と同じ動作です。
PORTC = Bits(1 , 7) ' 上記と同じ動作です。



NBITS 一覧へ戻る
出力ポートまたはバイト型変数に、指定されたビットを0にした数値を入れます。

書式 PORTX = Nbits(bn , bn , ・・・)
variable = Nbits(bn , bn , ・・・)
注釈
X ポートの名前。 ( A , B , C , D , E , F )
bn 0にするピンの番号。 ( 0 〜 7 )
variable バイト型変数。
bn 0にするビットの番号。 ( 0 〜 7 )

参照 BITS

 
・&B(2進表記)や、&H(16進表記)でも、同様に設定や代入ができますが、ビットを10進数で
 わかりやすくリセットできる命令です。
NBITS命令が使用できる変数は、バイト型のみです。
 
(例)
Config PORTC = Output ' ポートCを出力に設定。
' '
PORTC = &B01111101 ' ポートCへ出力。
PORTC = &H7D ' 上記と同じ動作です。
PORTC = Nbits(1 , 7) ' 上記と同じ動作です。



BITWAIT 一覧へ戻る
指定したポートピンが、ハイレベル(1)またはローレベル(0)になるまで待ちます。

書式 Bitwait PINX.b , state
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
state Set
Reset
 − ハイレベル(1)になるまで待つ。
 − ローレベル(0)になるまで待つ。

 
(例)
Bitwait PINC.7 , Reset ' ポートCのピン7がローレベル(0)になるまで待ちます。



PULSEIN 一覧へ戻る
指定したポートピンに入力されたパルスを検出し、その間隔(時間)を変数に入れます。

書式 Pulsein variable , PINX , b , edge
注釈
variable 間隔(時間)を入れる、ワード型変数。
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
edge パルスの極性。 (0 = H→L 立ち下がり , 1 = L→H 立ち上がり)

参照 PULSEOUT

 
・この命令の前に、パルスを検出するポートピンは、入力に設定しておく必要があります。
・指定したパルスのエッジが検出されるまで、待ち続けます。
・検出のタイミングを正確にするために、BITWAIT命令と組み合わせるのも良い方法です。
・内部のカウンターが、65535を越えるとタイムアウトになり、内部変数ERRに1が代入されて
 この命令の処理が中断されます。
・ハードウエア・タイマーは使用していないので、精度は不明です。
 
・パルス幅は、AVRのクロック周波数にかかわらず、variableの変数値の1カウントが、10μSに
 設定されています。
 
(例)
Dim T As Word ' 使用する変数を宣言。
Config PINC.7 = Input ' ポートCピン7を入力に設定。
Do ' 繰り返しループ。
Bitwait PINC.7 , Reset ' ポートCのピン7がローレベル(0)になるまで待つ。
Pulsein T , PINC , 7 , 1 ' 立ち上がりエッジを検出し、パルス幅を計測。
Print T ' 結果を出力。
Waitms 100 ' 100mSのウエイト。
Loop '



PULSEOUT 一覧へ戻る
指定したポートピンに、任意の幅のパルスを発生させます。

書式 Pulseout PORTX , b , period
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
period パルス幅。 ( 1 〜 65535 )

参照 PULSEIN , SOUND

 
・この命令の前に、パルスを出力するポートピンは、出力に設定しておく必要があります。
・パルスの発生は、指定のピンを2回反転することで行われるので、ピンの初期状態によりパルスの
 極性が決定されます。 (ピンの初期状態がL(0)ならば正極性、H(1)ならば負極性)
・ハードウエア・タイマーは使用していないので、精度は不明です。
 
・パルス幅は、AVRのクロックが4MHzの時に、period値の1カウントが、1μSに設定されています。
 (12.8MHzでは、1カウントが、0.3125μSです)
 
(例)
Config PORTC = Output ' ポートCを出力に設定。
Reset PORTC.7 ' ポートCのピン7をL(0)に設定。
Do ' 繰り返しループ。
Pulseout PORTC , 7 , 3200 ' クロック12.8MHzで、1mSのパルスを発生。
Waitms 10 ' 10mSのウエイト。
Loop '



SOUND 一覧へ戻る
指定したポートピンに、任意の間隔で任意の期間の、方形波を発生させます。

書式 Sound PORTX.b , duration , period
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
duration 出力する期間の、定数または数値変数。
( 1 〜 65535 ) (バイト、ワード、インテジャー型)
period パルス幅の、定数または数値変数。
( 1 〜 65535 ) (バイト、ワード、インテジャー型)

参照 PULSEOUT

 
・指定したポートピンに、圧電スピーカーやアンプ+スピーカーを接続すると、音を出すことができます。
・方形波の発生は、正極性のみです。 (出力が無い時は、L(0)レベルになります)
・ハードウエア・タイマーは使用していないので、精度は不明です。

・パルス幅の定数は、大まかに下記の式で計算できます。
 (AVRのクロック周波数によって、かなりの誤差が出ますので、目安として下さい)
 
period = AVRクロック周波数 ÷ (発振周波数 × 12)
 
  AVRクロック周波数が12.8MHzで、1KHzの方形波を出す場合、1066 = 12800000/(1000*12) 

・出力する期間の定数は、大まかに下記の式で計算できます。
 (AVRのクロック周波数によって、かなりの誤差が出ますので、目安として下さい)
 
duration = 出力する期間 × 発振周波数
 
  1KHzの方形波を100mS間出す場合、100 = 0.1*1000
 
(例)ポートCピン0に、1秒間隔で、 1KHzの方形波を100mS間出力する。
Do ' 繰り返しループ。
Sound PORTC.0 , 100 , 1066 ' 1KHzの方形波を100mS出す。
Wait 1 ' 1秒のウエイト。
Loop '



SHIFTIN 一覧へ戻る
I/Oポートを利用して、クロック同期のシリアルデータを入力します。

書式 Shiftin PINX.b , clock , variable , mode [, bits , width ]
注釈
PINX.b データを入力するポートピンの名前。 ( A , B , C , D , E , F ) ( 0 〜 7 )
clock PORTX.b
PINX.b
 - 内部クロック同期。 
 - 外部クロック同期。
 クロック用のポートピンの名前。
 ( A , B , C , D , E , F ) ( 0 〜 7 )
variable 入力したデータを入れる変数名。
mode 入力ビット方向と、クロックのエッジ。 ( 0 〜 7 )(下記別表を参照)
bits 入力するビット数。 (オプション) ( 1 〜 255)
width クロック幅。 (width+@ μS 動作クロックに影響) (オプション)

参照 SHIFTOUT , CONFIG SHIFTIN

 
 mode入力ビット方向と、クロックのエッジの別表。
クロックの選択とエッジ データ入力方向
0 内部クロック・立ち下がり MSBからLSB
1 内部クロック・立ち上がり MSBからLSB
2 内部クロック・立ち下がり LSBからMSB
3 内部クロック・立ち上がり LSBからMSB
クロックの選択とエッジ データ入力方向
4 外部クロック・立ち上がり MSBからLSB
5 外部クロック・立ち下がり MSBからLSB
6 外部クロック・立ち上がり LSBからMSB
7 外部クロック・立ち下がり LSBからMSB

 AVRクロック8MHz(125nS)での実測値
width Tw1(uS) Tw2(uS) Tsampl (uS)
なし 1.0 0.87 0.5
1 2.0 1.87 1.5
2 3.0 2.87 2.5
3 4.0 3.87 3.5

・Tw1はデフォルト(widthなし)で、AVR動作クロックの8クロック分です。
・Tw2はデフォルト(widthなし)で、AVR動作クロックの7クロック分です。
width値により、1μSずつ広げることができます。
・データは、クロックのエッジから4クロック後にサンプリングされます。(Tsampl)
 (width値により、1μSずつ後に遅れます)
 
・変数の型により、入力されるビット数は変わります。 (BYTE型:8ビット、WORD型:16ビット など)
 オプションのビット数を指定した場合は、その値が優先されます。
bitsは使用せずに、widthオプションのみを使用したい場合は、bits位置に(NULL)を記述します。
・クロックは、内部または外部同期のどちらでも使用可能で、エッジも選択可能です。

注意
・入力するビット数を、8,16,32・・・などのバイト単位以外に設定した場合、最上位または最下位
 バイトの内容が、端数ビット分しかシフトされませんので、SHIFTIN命令の後でデータを修正する
 必要があります。
・また、端数ビット以外の部分は内容が不確定となりますので、必ずマスクして下さい。
 (例)
 12ビットデータをLSBからMSBで受信した場合、下位バイトは正常ですが上位バイトの上位4ビットに
 データが入っていますので、上位バイトのみを右へ4ビットSHIFTして下さい。
 
Shiftin Pinb.0 , Portb.1 , Rxdata , 3 , 12 ' 12ビットデータをLSBからMSBで受信。
Temp1 = Low(rxdata) ' ワード変数から下位バイトを取り出す。
Temp2 = High(rxdata) ' ワード変数から上位バイトを取り出す。
Shift Temp2 , Right , 4 ' 上位バイトを右へ4bitシフトする。
Rxdata = Makeint(temp1 , Temp2) ' 上位バイトと下位バイトをワード変数に戻す。



− SHIFTINの新しい動作モード −
 
modeの「入力ビット方向とクロックのエッジ」に新しいオプションが追加されました。
・新しいオプションを使用する場合は、Config Shiftin = New 命令でSHIFTIN命令の動作モードを
 変更してください。
・動作モードを変更すると、すべてのSHIFTIN命令に対して機能します。
・SHIFTIN命令は、通常のSHIFT命令に近い動作をするようになります。
 
・ビットは左から右へ、または右から左へシフトされます。
・新しいSHIFTIN命令は、ビットのシフト時に元の変数の値(ビット)を保持することができます。
・例えば、元の変数の値が&B101で、入力する値が&B111の3ビットをシフトインすると、結果の値は
 &B101111 になります。
・変数の値を保持する必要がない場合は、modeのオプションとしてパラメータに[8]を加えてください。
 (変数の値を読み込まないので、残りのビットは不確定です。)
 (バイトで8ビットやワードで16ビットを満たす場合は、処理速度が上がりフラッシュの容量も減らせます)
 
modeのオプションとしてパラメータに[16]を加えると、変数の値は保持されませんが、その初期値が
 クリアされます。
 (シフトする前のデータをすべて0にするので、残りのビットは0になります)
・これは、8ビット以下のシフトを行う場合にのみ必要です。 (例えば、3ビットだけSHIFTINする)
 
・もう1つの重要な違いは、新しいSHIFTIN命令は最大8バイトまでしかSHIFTINできないことです。
 (最大8バイトで最大64ビットです)
・この制約は、迅速な処理を行うためで、レジスターR16〜R23が使用されます。
 
・SHIFTINするビット数は指定することができ、それを変数にすることも可能です。
・ワード変数に値をSHIFTINする場合は、ビット数が自動的に16ビットになります。
・それは、すべての数値データの型に当てはまります。
・SHIFTINを行うコードの一部は、MCSライブラリに格納されています。
・これは、SHIFTIN命令が複数回使用される場合にコードを減らすことができますが、そのコードが
 8バイト用に書かれているため、より少ないコード(例えばSHIFTINを1回だけ使用)でシフトするには、
 最適ではありません。
・そのため、ライブラリのコードを使用する代わりに、シフト部分のコードを別に生成するように選択
 することができます。
・代わりのコード生成が必要な場合は、modeのオプションとしてパラメータに[32]を加えてください。
 
・もう1つの新しいオプションは、クロックピンと入力ピンの初期状態を設定する必要がないことです。
・初期値では、クロックピンは外部クロックのオプションに応じて、入力または出力に設定されます。
・そして、外部クロックが使用されない場合は、クロックは初期状態に設定されます。
・SHIFTOUT後にSHIFTINを使いたい場合、レベルを変化させたくない場合があります。
・この場合は、modeのオプションとしてパラメータに[64]を加えてください。

記述例 : Shiftin Pind.3 , Portd.4 , Wdata , 2 + 16 + 32 , 3
 
mode = 2 に、[16][32]のオプションを追加します。



CONFIG SHIFTIN 一覧へ戻る
SHIFTIN命令が、新しいモードで動作するようにコンパイラーに指示します。

書式 Config Shiftin = mode
注釈
mode = New : 新しいモードで動作します。
Compatible : 古いモードで動作します。 (古いSHIFTIN命令と互換)

参照 SHIFTIN

 
・SHIFTIN命令は、いくつかの変更で拡張されており、古いSHIFTIN命令と互換性が無くなりました。
・古いプログラムのコードと互換性を持たせるために、この指示が追加され、どのモードで動作するかを
 選択できます。
 
・初期状態では、古い動作モードが使用されます。
・新しい動作モードを使用する場合は、Config Shiftin = New を指定してください。
・動作の詳細はSHIFTIN命令に追記されています。



SHIFTOUT 一覧へ戻る
I/Oポートを利用して、クロック同期のシリアルデータを出力します。

書式 Shiftout PORTX.b , clock , variable , mode [, bits , width ]
注釈
PORTX.b データを出力するポートピンの名前。 ( A , B , C , D , E , F ) ( 0 〜 7 )
clock PORTX.b  クロック用のポートピンの名前。 (A, B, C, D, E, F)  (0〜7)
variable 出力するデータを入れた変数名。
mode 出力ビット方向と、クロックのエッジ。 ( 0 〜 3 )(下記別表を参照)
bits 出力するビット数。 (オプション) ( 1 〜 255)
width クロック幅。 (width+@ μS 動作クロックに影響) (オプション)

参照 SHIFTIN

 
 mode出力ビット方向と、クロックのエッジの別表。
クロックのエッジ データ出力方向
0 立ち下がり MSBからLSB
1 立ち上がり MSBからLSB
クロックのエッジ データ出力方向
2 立ち下がり LSBからMSB
3 立ち上がり LSBからMSB

 AVRクロック8MHz(125nS)での実測値
width Tsu (uS) Tw (uS) Thold (uS)
なし 0.5 0.5 1.0
1 0.5 1.5 2.0
2 0.5 2.5 3.0
3 0.5 3.5 4.0

・Tsuは、AVR動作クロックの4クロック分です。
・Twはデフォルト(widthなし)で、AVR動作クロックの4クロック分です。
width値により、1μSずつ広げることができます。
・Tsuは一定で、TwとTholdがwidth値によって広くなります。
 
・変数の型により、出力されるビット数は変わります。
 オプションのビット数を指定した場合は、その値が優先されます。
bitsは使用せずに、widthオプションのみを使用したい場合は、bits位置に(NULL)を記述します。



ALIAS 一覧へ戻る
ポート名などの、割り当て先が決まっている固有名を、別の名前で参照できるようにします。

書式 newvar ALIAS oldvar
注釈
newvar 新たに使用する名前。
oldvar ポートピンなどの名前。 (PORTB.1等)

参照 CONST

 
・あるポートピンに、リレーやLEDなどを接続し、プログラムの随所でそれを制御するとします。
・もし、プリント基板などの制約で、ポートピンを変更する必要が出た場合、プログラム中のすべての
 ポートピン名を変更しなければなりません。
・この様な場合、プログラムの始めに、ALIAS命令でポートピンの名前を別の名前に置き換えておき、
 変更があった場合は、ALIAS行のみを修正することで、プログラム中のすべてのポートピン名が
 変更されます。
 
・CONST命令は、数値や文字列を参照させますが、ALIAS命令は、名前を参照させることができます。
 
(例)
Const On = 1 ' "On"と言う名前の記号定数に、数値1を割り当てます。
Const Off = 0 ' "Off"と言う名前の記号定数に、数値0を割り当てます。
Led1 Alias PORTC.1 ' PORTC.1を、Led1と言う名前で参照させます。
Led2 Alias PORTC.2 ' PORTC.2を、Led2と言う名前で参照させます。
Led3 Alias PORTC.3 ' PORTC.3を、Led3と言う名前で参照させます。
'
Set Led1 ' PORTC.1がH(1)になります。
Led2 = 0 ' PORTC.2がL(0)になります。
Led3 = On ' PORTC.3がH(1)になります。
Led3 = Off ' PORTC.3がL(0)になります。



DEBOUNCE 一覧へ戻る
ポートピンに接続したスイッチを検出し、チャタリング対策の遅延の後、指定ラベルへ分岐します。

書式 Debounce PINX.b , state , label [, SUB]
注釈
X ポートの名前。 ( A , B , C , D , E , F )
b ピンの番号または数値変数。 ( 0 〜 7 )
state 分岐条件。 (0 = ピンがL(0)で分岐 , 1 = ピンがH(1)で分岐)
label 分岐先のラベル名。 (GOTOと同じようにジャンプします)
SUB オプション (label 先を、サブルーチン コールします)

参照 CONFIG DEBOUNCE

 
・まず、ポートピンの状態を検出し、分技条件に当てはまらなければ、何も処理をせずに次の
 命令行へ移ります。
・スイッチの状態が分技条件と等しくなると、CONFIG DEBOUNCE命令で設定された、チャタリング
 防止期間分の遅延の後、再度スイッチの状態を確認し、分技条件が継続している場合は、ラベルで
 指定された行へ分岐します。 (チャタリング防止の遅延時間は、デフォルトで25mSです)
 
SUBオプションを付けた場合は、ラベルで指定された行が、サブルーチンコールされます。
 
・一度検出されたスイッチは、オフになるまで次回の検出を行いません。 (パスします)
 
(例)
Config PORTA = Input ' ポートAを入力に設定。
PORTA = &B11111111 ' ポートAを内部抵抗でプルアップ。
Do ' 繰り返しループ。
Debounce PINA.0 , 0 , Swon , SUB ' ポートAピン0のスイッチを検出。
Loop '
' '
Swon: ' スイッチがONになった場合のサブルーチン。
Print "Switch On!" ' スイッチONのメッセージを出力。
Return ' サブルーチンの終了。



CONFIG DEBOUNCE 一覧へ戻る
DEBOUNCE命令で使用される、スイッチのチャタリング防止の遅延時間を設定します。

書式 Config Debounce = time
注釈
time 遅延時間の数値定数。 ( mS )

参照 DEBOUNCE

 
・チャタリング防止の遅延時間は、デフォルトで25mSです。
 
(例)
Config Debounce = 50 ' 遅延時間を50mSに変更します。



CONFIG KBD 一覧へ戻る
キースイッチを、マトリックス(格子)状に接続した回路の、構成を設定します。

書式 Config Kbd = PORTX [, Debounce = valueDb] [, Delay = valueDl]
                 [, Rows = 6 , Row5 = PINP.b , Row6 = PINP.b]
注釈
X キースイッチを接続する、ポートの名前。 ( A , B , C , D , E , F )
valueDb = オプション チャタリング防止の遅延時間。 ( 1 〜 255 uS )
valueDl = オプション キー入力処理後の待ち時間。 ( 1 〜 255 mS)
P オプション 24キーの場合の、追加ポート名。 ( A , B , C , D , E , F )
b オプション 24キーの場合の、追加ピン番号。 ( 0 〜 7 )

参照 GETKBD

・4列×4行のマトリックス(格子)状に接続した、16個のキースイッチを
 走査するための設定を行います。
・16個までのキーの場合は、列と行を同一ポートに接続する必要があります。
 
Rows = 6 オプションを指定すると、24個のキーまで対応できるようになります。
 この場合は、任意のポートピンを追加行(Row5,Row6)として指定できます。
 (Rows は、6以外に指定できません)
 
Debounce チャタリング防止の遅延時間は、デフォルトで20uSです。
Delay は、実際にキーを走査する [GETKBD] 命令をループ処理する場合に、
 ノイズ等の誤動作を防ぐために使用します。
 
・使用するスイッチの接点間隔等によって、誤動作が起きる場合は、各ポートと
 スイッチ間に、470〜1KΩの抵抗を直列に入れて下さい。



GETKBD 一覧へ戻る
キースイッチを、マトリックス(格子)状に接続した回路の、キー入力を検出します。

書式 variable = Getkbd()
注釈
variable = キー入力の内容を読み込む変数の名前。 (バイト型)

参照 CONFIG KBD

 
・先に、CONFIG KBD 命令によって、キースイッチの接続ポート等の指定を行う必要があります。
 
・どのキーも押されていない場合は、変数に[16] が入ります。 (24キーの場合は[24] )
・キー入力があった場合は、列と行に対応して、0〜15の値が入ります。 (24キーの場合は0〜23 )
・キー入力値を、任意の値に変換したい場合は、LOOKUP 命令を使用します。
 
GETKBD 命令を実行時には、毎回キーの走査に必要なポート設定を行っているので、列または行の
 4ポートを、LCD等のデータポートと兼用することもできます。
 
(例)
Dim K As Byte ' 変数Kを宣言。
Config Kbd = PORTB ' ポートBに、キースイッチを16個接続する。
' '
Keyin: '
K = Getkbd() ' キー入力を検出する。
If K > 15 Then Goto Keyin ' キー入力の有無を確認する。
Print K ' キーの値を出力する。
Goto Keyin '



CONFIG KEYBOARD 一覧へ戻る
PS/2(AT)キーボードを、ポートに接続する場合の、構成を設定します。

書式 Config Keyboard = PINX.b , Data = PINY.c , Keydata = label
注釈
X [CLOCK] 入力を接続する、ポートの名前。 ( A , B , C , D , E , F )
b [CLOCK] 入力を接続する、ピンの番号。 ( 0 〜 7 )
Y [DATA] 入力を接続する、ポートの名前。 ( A , B , C , D , E , F )
c [DATA] 入力を接続する、ピンの番号。 ( 0 〜 7 )
label 「キー・スキャンコード → ASCIIコード」 変換テーブルのラベル名。

参照 GETATKBD , GETATKBDRAW

 
・PS/2(AT)キーボードは、 「CLOCK、DATA、VCC、GND」の、4本のラインで接続できます。
 
・キーボードからのキーデータは、ASCIIコードの代わりに、専用のキー・スキャンコードが
 送られてきますので、変換テーブルにより、データを変換する必要があります。
   「JIS配列PS/2 キーボードスキャンコード表」 を参照。
 
・実際の変換テーブルや接続回路は、グラフィックLCDで、RS-232Cターミナルの製作
 記事を参照して下さい。



GETATKBD 一覧へ戻る
PS/2(AT)キーボードから、キーデータを入力します。

書式 variable = Getatkbd()
注釈
variable = キー入力の内容を読み込む変数の名前。 (バイト型 または 文字列)

参照 CONFIG KEYBOARD , GETATKBDRAW

 
・先に、CONFIG KEYBOARD 命令によって、接続ポートの指定を行う必要があります。
・キーが押された場合は、変換テーブルにより、ASCIIコードに変換されたデータが変数に入ります。
 
・この命令は、割り込みを使用しないので、キーが押されるのを待ち続けます。
・他の処理と平行して動作させる場合は、[CLOCK] 入力を外部割り込みポートに接続するなどの
 工夫が必要です。
 
・実際の変換テーブルや接続回路は、グラフィックLCDで、RS-232Cターミナルの製作
 記事を参照して下さい。



GETATKBDRAW 一覧へ戻る
PS/2(AT)キーボードから、ASCIIコードに変換前の、キー・スキャンコードを取得します。

書式 variable = Getatkbdraw()
注釈
variable = キーコードの内容を読み込む変数の名前。 (バイト型 または 文字列)

参照 CONFIG KEYBOARD , GETATKBD

 
・先に、CONFIG KEYBOARD 命令によって、接続ポートの指定を行う必要があります。
・キーが押された場合は、ASCIIコードに変換前の、キー・スキャンコードが変数に入ります。
 
・この命令は、割り込みを使用しないので、キーが押されるのを待ち続けます。
・他の処理と平行して動作させる場合は、[CLOCK] 入力を外部割り込みポートに接続するなどの
 工夫が必要です。
 
・実際の変換テーブルや接続回路は、グラフィックLCDで、RS-232Cターミナルの製作
 記事を参照して下さい。



READEEPROM 一覧へ戻る
EEPROMからデータを読み込み、変数に入れます。

書式 Readeeprom variable , address
注釈
variable = データを読み込む変数の名前。
address = EEPROMのアドレス。 ( 0 〜 ) (変数やラベルも使用可能)

参照 WRITEEEPROM , DIM

 
・この命令は、BASCOM-8051との互換性のために、用意されています。
・アドレスは、接頭語に[ $ ]または[ &H ]を付けることで、どちらも16進表記になります。
・EEPROMのアドレスは、$00番地から始まります。
・ATMELのデータシートによると、EEPROMの最初のアドレス$00番地は、リセット中に書き込みが
 行われる可能性があるので、使用しないようにアドバイスされています。
 
・READEEPROM命令の代わりに、DIM命令でERAMに指定された、変数や配列を使うこともできます。
 
(例) 上と下は同じ動作をします。
Dim B As Byte ' 変数Bを宣言。
Readeeprom B , $01 ' EEPROMの$01番地から、データを変数Bへ読み込む。
' '
Dim A As Eram Byte At $01 ' 変数Aを、EEPROMの$01番地へ宣言。
Dim B As Byte ' 変数Bを宣言。
B = A ' EEPROMの$01番地から、データを変数Bへ読み込む。



WRITEEEPROM 一覧へ戻る
EEPROMへ、変数のデータを書き込みます。

書式 Writeeeprom variable , address
注釈
variable = 書き込むデータが入っている変数の名前。
address = EEPROMのアドレス。 ( 0 〜 ) (変数やラベルも使用可能)

参照 READEEPROM , DIM

 
・この命令は、BASCOM-8051との互換性のために、用意されています。
・アドレスは、接頭語に[ $ ]または[ &H ]を付けることで、どちらも16進表記になります。
・EEPROMのアドレスは、$00番地から始まります。
・ATMELのデータシートによると、EEPROMの最初のアドレス$00番地は、リセット中に書き込みが
 行われる可能性があるので、使用しないようにアドバイスされています。
・EEPROMに書き込みが行われる際は、全ての割り込みが禁止され、書き込み終了時に許可されます。
 
・WRITEEEPROM命令の代わりに、DIM命令でERAMに指定された、変数や配列を使うこともできます。
 
(例) 上と下は同じ動作をします。
Dim B As Byte ' 変数Bを宣言。
For B = 1 To 5 ' 5回の繰り返し。
Writeeeprom B , B ' EEPROMの$01から$05番地へ、01から05を書き込む。
Next '
' '
Dim A(5) As Eram Byte At $01 ' 配列Aを、EEPROMの$01番地から5個宣言。
Dim B As Byte ' 変数Bを宣言。
For B = 1 To 5 ' 5回の繰り返し。
A(B) = B ' EEPROMの$01から$05番地へ、01から05を書き込む。
Next '



INP 一覧へ戻る
AVRのレジスターやSRAM、およびXRAMに割り当てられたメモリー内容を、変数に読み込みます。

書式 variable = Inp(address)
注釈
variable = メモリー内容を読み込む変数の名前。
address = メモリーアドレス。 ( &H0 〜 &HFFFF ) (変数(ワード型)も使用可能)

参照 OUT , PEEK , POKE

 
・INP命令は、AVRのレジスターや内蔵SRAM、およびXRAM(外部メモリー)に割り当てられた、
 アドレス &H0000〜&HFFFF 全てのエリアから、メモリー内容を読み込めます。



OUT 一覧へ戻る
AVRのレジスターやSRAM、およびXRAMに割り当てられたメモリーに、データを書き込みます。

書式 Out address , value
注釈
address = メモリーアドレス。 ( &H0 〜 &HFFFF ) (変数(ワード型)も使用可能)
value = 書き込むバイト型データ。 (変数(バイト型)も使用可能)

参照 INP , PEEK , POKE

 
・OUT命令は、AVRのレジスターや内蔵SRAM、およびXRAM(外部メモリー)に割り当てられた、
 アドレス &H0000〜&HFFFF 全てのエリアのメモリーに、データを書き込めます。



PEEK 一覧へ戻る
AVRのレジスター・ファイルの内容を、変数に読み込みます。

書式 variable = Peek(address)
注釈
variable = レジスターの内容を読み込む変数の名前。
address = レジスターの番号。 ( 0 〜 31 ) (変数も使用可能)

参照 POKE , INP , OUT

 


POKE 一覧へ戻る
AVRのレジスター・ファイルに、データを書き込みます。

書式 Poke address , value
注釈
address = レジスターの番号。 ( 0 〜 31 ) (変数も使用可能)
value = 書き込むバイト型データ。 (変数(バイト型)も使用可能)

参照 PEEK , INP , OUT

 


CPEEK 一覧へ戻る
コード・メモリー(プログラム用フラッシュ・メモリー)の内容を、変数に読み込みます。

書式 variable = Cpeek(address)
注釈
variable = コード・メモリーの内容を読み込む変数の名前。
address = コード・メモリーのアドレス。 ( 0 〜 ) (変数も使用可能)

参照 POKE , INP , OUT , LOADLABEL

 
・コード・メモリーには、BASICプログラムから書き込みができないので、CPOKE命令は存在しません。



CPEEKH 一覧へ戻る
mega103・mega128のLPM命令による、上位バンクのメモリー内容を、変数に読み込みます。

書式 variable = Cpeekh(address [, page] )
注釈
variable = 上位バンク・メモリーの内容を読み込む変数の名前。
address = メモリーのアドレス。 ( 0 〜 ) (変数も使用可能)
page = 64KB毎のページアドレス。 ( 0 〜 ) (変数も使用可能) オプション

 


VARPTR 一覧へ戻る
変数が割り当てられている、メモリー・アドレスを、変数に入れます。

書式 variable = Varptr(target)
注釈
variable = アドレスを入れる変数の名前。 (ワード型)
target = アドレスを調べる変数の名前。

 


LOADLABEL 一覧へ戻る
ラベルが割り当てられているメモリー・アドレスを、変数に入れます。

書式 variable = Loadlabel(label)
注釈
variable = アドレスを入れる変数の名前。
label = アドレスを調べるラベル名。

参照 CPEEK

 


MEMCOPY 一覧へ戻る
変数が割り当てられているメモリー内容を、ブロック・コピーします。

書式 number = Memcopy(source , target , bytes , option)
注釈
number = コピーされた総数を入れる変数の名前。 (ワードまたはインテジャー型)
source = コピー元の変数。
target = コピー先の変数。
bytes = コピーするバイト数。
option = 1  - コピー元のアドレスだけインクリメントされる。
2  - コピー先のアドレスだけインクリメントされる。
3  - コピー元・先、共にアドレスがインクリメントされる。 (デフォルト)

 
・コピー元の変数が割り当てられているメモリー・アドレスの内容を、コピー先の変数が
 割り当てられているメモリー・アドレスへコピーします。



MEMFILL 一覧へ戻る
メモリーの任意の範囲を指定した値で埋めます。

書式 MEMFILL variable , bytes , value
注釈
variable = 埋め込みを開始する最初のアドレスとなる変数名。(数値変数、配列)
bytes = 埋めるバイト数。 (1〜65535)
value = メモリーに埋め込むASCII値を持った数値 または 任意の数値定数

参照 MEMCOPY

 
・MEMFILLの使用目的は、配列をクリアするか、配列をすばやく同じ値で埋めることです。
・埋め込みを開始する最初のアドレスとなる変数名は、通常の数値変数またはar(1)のような配列です。
・配列を全てクリアするには、埋め込む値に0を使用します。
 
※ 埋めるためのバイト数が0であるかどうかはチェックされません。
※ 変数を使用して埋めるバイト数の指定が0の場合は、その値が&HFFFFと受け取られるため、
  変数がゼロでないことを確認してください。


 
(例)
Dim Ar(100) As Byte ' 使用する配列を宣言。
Memfill Ar(1) , 10 , 65 ' 配列の先頭から10個を65(ASCII"A")で埋める。



CONFIG XRAM 一覧へ戻る
外部メモリー(XRAM)へのアクセス状態と、ウェイト・ステートを設定します。

書式 Config Xram = state , Waitstatels = Wls , Waitstatehs = Whs
注釈
state = Enabled  - 外部メモリーを有効にします。
disabled  - 外部メモリーを無効にします。
Wls = 外部メモリーの下位領域に設定する、ウェイト・ステートの数。 (オプション)
Whs = 外部メモリーの上位領域に設定する、ウェイト・ステートの数。 (オプション)

参照 $XRAMSIZE , $XRAMSTART

 
・外部メモリーへのアクセスは、デフォルトで無効になっています。
・ウェイト・ステートの数は、チップにより設定が変わります。 (0〜3などの数値)
・領域設定は、デフォルトで上位領域のみです。 (チップのマニュアルを参照)
・現在、BASCOM-AVRには、領域を変更する命令が見あたりません。
 
$XA$WAITSTATE命令の代わりに、この命令を使用するようにして下さい。
・メモリー容量や開始アドレスを設定する、$XRAMSIZE$XRAMSTART命令も参照して下さい。



DATA 一覧へ戻る
あらかじめ用意された複数のデータ値を、プログラムに記述します。

書式 Data value , value , ・・・
注釈 value = 数値 または "文字列"

参照 RESTORE , READ , $EEPROM , $DATA

 
・DATA命令の後に、数値または文字列を、カンマ[ , ]で区切り記述します。
・1行に記述する数は決められていませんが、10個程度が見やすいでしょう。
・DATA行を、複数の行に分けて記述しても、1連のデータとして扱われます。
・DATA行は、通常END命令の後に記述します。
・DATA行の冒頭と、任意の行に、ラベルを付けておく必要があります。
 
Testdata: ' データ行のラベル。
Data 12 , 56 , &H10 ' バイト型の数値データ。
Data "Test1" , "Test2" ' 文字列のデータ。
Data $34 ' [$]はASCII文字のデータ。 (用途不明)
Data 1000% , &H1234% ' ワード型のデータは、末尾に[ % ]を付けます。
Data -32768% , 32767% ' インテジャー型のデータも、末尾に[ % ]を付けます。
Data 2147483647& ' ロング型のデータは、末尾に[ & ]を付けます。
Data 2147483647! ' シングル型のデータは、末尾に[ ! ]を付けます。
Data 2147483647# ' ダブル型のデータは、末尾に[ # ]を付けます。
 
・DATA行を使用して、EEPROM用のデータを用意することもできます。 $EEPROM を参照



RESTORE 一覧へ戻る
READ命令でデータを読み込む際に、DATA行の読み込みを開始する位置を指定します。

書式 Restore label
注釈 label = データ行に付けられたラベル名。

参照 DATA , READ , $EEPROM , $DATA

 
・READ命令でデータを読み込むと、データの位置を示すポインターは、読み込みが終わった位置まで
 進みます。
・再度、初めのデータを読み込む場合には、RESTORE命令で、ポインターを戻す必要があります。
・また、複数のデータブロックに、それぞれラベルを付けておけば、任意のデータを読み込むことが
 できます。
 
Testdat1: ' データ行のラベル。
Data 11 , 12 , 13 ' バイト型の数値データ。
' '
Testdat2: ' データ行のラベル。
Data 21 , 22 , 23 ' バイト型の数値データ。
' '
Testdat3: ' データ行のラベル。
Data 31 , 32 , 33 ' バイト型の数値データ。



READ 一覧へ戻る
DATA行からデータを読み込み、変数に入れます。

書式 Read variable
注釈 variable = データを読み込む変数の名前。

参照 DATA , RESTORE , $EEPROM , $DATA

 
・読み込むデータの型式と、変数の型式は、同じにする必要があります。
・初めてREAD命令を実行する際には、必ずRESTORE命令でDATA行の位置を指定して下さい。
・READ命令でデータを読み込むと、データの位置を示すポインターは、読み込みが終わった位置まで
 進みます。
・再度、初めのデータを読み込む場合には、RESTORE命令で、ポインターを戻す必要があります。
・また、複数のデータブロックに、それぞれラベルを付けておけば、任意のデータを読み込むことが
 できます。
 
Dim A As Byte , B As Byte ' 使用する変数を宣言。
Restore Testdat1: ' データ行を指定。
For B = 1 To 3 ' 3回の繰り返し。
Read A ' データを変数へ読み込み。
Print A ' 読み込んだデータを出力。
Next '
End ' プログラムの終了。
' '
Testdat1: ' データ行のラベル。
Data 11 , 12 , 13 ' データ行。



LOOKUP 一覧へ戻る
指定したDATA行の先頭から、任意の位置にある数値データを、変数に読み込みます。

書式 variable = Lookup(value , label)
注釈
variable = データを読み込む、数値変数の名前。
value = 先頭からの位置。 ( 0 〜 65535 ) (変数も使用可能)
label = データ行に付けられたラベル名。

参照 LOOKUPSTR , DATA

 
・LOOKUP命令は、数値データにのみ対応しています。 文字データは、LOOKUPSTR命令で扱えます。
・読み込むデータの型式と、変数の型式は、同じにする必要があります。
・先頭からの位置は、0が先頭のデータを示します。
 
(例)
Dim A As Byte ' 使用する変数を宣言。
A = Lookup(3 , Tdat1) ' Tdat1のDATA行から4番目のデータを変数に読み込み。
Print A ' 読み込んだデータを出力。 (13が出力されます)
End ' プログラムの終了。
' '
Tdat1: ' データ行のラベル。
Data 10 , 11 , 12 , 13 , 14 , 15 ' データ行。



LOOKUPSTR 一覧へ戻る
指定したDATA行の先頭から、任意の位置にある文字データを、変数に読み込みます。

書式 variable = Lookupstr(value , label)
注釈
variable = データを読み込む、文字変数の名前。
value = 先頭からの位置。 ( 0 〜 255 ) (変数も使用可能)
label = データ行に付けられたラベル名。

参照 LOOKUP , DATA

 
・LOOKUPSTR命令は、文字データにのみ対応しています。 数値データは、LOOKUP命令で扱えます。
・先頭からの位置は、0が先頭のデータを示します。
 
(例)
Dim A As String * 2 ' 使用する変数を宣言。
A = Lookupstr(2 , Sdat1) ' Sdat1のDATA行から3番目の文字列を変数に読み込み。
Print A ' 読み込んだデータを出力。 (EFが出力されます)
End ' プログラムの終了。
' '
Sdat1: ' データ行のラベル。
Data "AB" , "CD" , "EF" , "GH" ' データ行。



LOOKDOWN 一覧へ戻る
指定したDATA行の中から、任意の数値データを検索し、先頭からの位置を変数に入れます。

書式 variable = Lookdown(search , label , entries)
注釈
variable = 検索結果(位置)を入れる、変数の名前。 (インテジャー型)
search = 検索する数値を入れた変数。 (変数のみ使用可能)
label = データ行に付けられたラベル名。
entries = 検索する最大個数。 (変数も使用可能)

参照 LOOKUP , DATA

 
・DATA行のデータと、検索する数値の型式は、同じにする必要があります。
・先頭からの位置は、1が先頭のデータを示します。
・データが見つからない場合は、-1が変数に入ります。
 
(例)
Dim I As Integer , A As Byte ' 使用する変数を宣言。
A = 13 ' 検索する数値を変数に入れる。
I = Lookdown(a , Tdat1 , 5) ' 検索を実行。
Print I ' 結果を出力。 (3が出力されます)
End ' プログラムの終了。
' '
Tdat1: ' データ行のラベル。
Data 11 , 12 , 13 , 14 , 15 ' データ行。





   電子工作の部屋 Top へ 前のページへ戻る