
■ BASCOM-AVR (DEMO) の使用方法 ■ |
1-Wire デバイスを制御する命令 |
CONFIG 1WIRE |
1-Wireバスの、データ線を接続するポートピンを設定します。 |
1WRESET |
1-Wireバスの初期化のために、バスにリセットパルスを送ります。 |
1WWRITE |
1-Wireバスに、データを送信します。 |
1WREAD |
1-Wireバスから、データを受信します。 |
1WSEARCHFIRST |
1-Wireバスに存在する、デバイスのシリアル番号を検索します。 (初回時に使用) |
1WSEARCHNEXT |
1-Wireバスに存在する、デバイスのシリアル番号を検索します。 (2つめ以降に使用) |
1WIRECOUNT |
1-Wireバスに存在する、デバイスの数を取得します。 |
1WVERIFY |
1-Wireバスで、指定されたシリアル番号のデバイスが使用できるかを確認します。 |
CRC8 |
配列 または 変数の、CRC8値(巡回冗長検査)を計算します。 |
CONFIG 1WIRE |
一覧へ戻る |
1-Wireバスの、データ線を接続するポートピンを設定します。
書式 |
Config 1wire = PORTX.b [ , Extended = 1] |
注釈 |
X = |
ポートの名前。 ( A , B , C , D , E , F , G ) |
b = |
ピンの番号。 ( 0 〜 7 ) |
Extended = 1 |
複数のポートで1-Wireバスを使用する場合のオプション。 |
|
・コンパイラの[Options]→[Compiler]→[I2C]からも設定が可能ですが、この命令が優先されます。
・この命令で、指定されたポートピンは適切に入出力が設定されるので、ユーザーが事前にポート
設定をする必要はありません。
・1-Wireバスのデータ線は、4.7KΩの抵抗器でプルアップして下さい。
(AVR内部プルアップでは、容量不足です)
・複数の1-Wireバスを使う場合、2つめからのポートピン設定は、各1-Wireコマンド(下記)の後に
オプションで指定します。
・[Extended = 1] オプションは、複数の1-Wireバスを使用する場合で、別ポート(PortAとPortBなど)に
渡る場合に指定して下さい。
(プログラムのコードが大きくなるので、できるだけ同一ポート内での使用が推奨されます)
|
(例) デバイスのシリアル番号を読み出す。(バス上にデバイスが1つだけの場合) |
Dim Idbuff(8) As Byte |
' デバイスのシリアル番号を格納する配列。(8byte以上) |
Dim Temp1 As Byte |
' 汎用テンポラリ変数 Byte型 No.1 |
Config 1wire = Portd.0 |
' 1-Wireバスのデータ線を接続するポートピンを設定。 |
1wreset |
' バスのリセット処理。 |
Locate 1 , 1 |
' リセットに対するエラーを表示する。 |
Lcd "Error=" ; Err |
' (Errはエラー状態を格納する内部変数 0:なし , 1:あり) |
1wwrite &H33 |
' [READ ROM] コマンドを発行する。 |
Idbuff(1) = 1wread(8) |
' デバイスのシリアル番号(8byte)を受信する。 |
Locate 2 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
End |
' |
|
|
1WRESET |
一覧へ戻る |
1-Wireバスの初期化のために、バスにリセットパルスを送ります。
書式 |
1wreset
1wreset , Port , Pin |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・マスターは、各コマンド処理の前に、必ずこの「1WRESET」命令で、バスの初期化をしなければ
なりません。 (1-Wireバスのリセット・パルスが出されます)
・リセット・パルスに対応して、デバイスは「存在パルス」を返します。
・デバイスが接続されていない等のエラーが発生した場合は、エラー状態を格納する内部変数「Err」に、
エラーなし = 0 、エラーあり = 1 が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) デバイスのシリアル番号を読み出す。(複数のポートで1-Wireバスを使用する場合) |
Dim Idbuff(8) As Byte |
' デバイスのシリアル番号を格納する配列。(8byte以上) |
Dim Temp1 As Byte |
' 汎用テンポラリ変数 Byte型 No.1 |
1wreset Pind , 0 |
' バス(1)のリセット処理。 |
1wwrite &H33 , 1 , Pind , 0 |
' バス(1)に[READ ROM] コマンドを発行する。 |
Idbuff(1) = 1wread(8 , Pind , 0) |
' デバイス(1)のシリアル番号(8byte)を受信する。 |
Locate 1 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
' |
' |
1wreset Pind , 1 |
' バス(2)のリセット処理。 |
1wwrite &H33 , 1 , Pind , 1 |
' バス(2)に[READ ROM] コマンドを発行する。 |
Idbuff(1) = 1wread(8 , Pind , 1) |
' デバイス(2)のシリアル番号(8byte)を受信する。 |
Locate 2 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
'' |
Next Temp1 |
' |
End |
' |
|
|
1WWRITE |
一覧へ戻る |
1-Wireバスに、データを送信します。
書式 |
1wwrite variable
1wwrite variable , length
1wwrite variable , length , Port , Pin |
1-Wireバスが、1つの場合。
(同上)送信バイト数を指定する場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
送信するデータ。 (定数 または バイト型変数) |
length = |
送信するバイト数。 (配列データを使用時) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・マスターがデバイスに、コマンドやデータを送信します。
・コマンドの場合は1バイト、データの場合は配列に格納した値を、バイト数を指定して送信できます。
・デバイスが接続されていない等のエラーが発生した場合は、エラー状態を格納する内部変数「Err」に、
エラーなし = 0 、エラーあり = 1 が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。 (lengthの記述は、必ず必要です(1byteでも))
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) CONFIG 1WIRE ・ 1WRESET命令を参照。 |
|
|
1WREAD |
一覧へ戻る |
1-Wireバスから、データを受信します。
書式 |
variable = 1wread(length)
variable = 1wread(length , Port , Pin) |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
受信したデータを入れる変数。 (バイト型変数) |
length = |
受信するバイト数。 (配列を使用時) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・マスターがデバイスから、データを受信します。
・データは、1バイト または 配列にバイト数を指定して受信できます。
・デバイスが接続されていない等のエラーが発生した場合は、エラー状態を格納する内部変数「Err」に、
エラーなし = 0 、エラーあり = 1 が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。 (lengthの記述は、必ず必要です(1byteでも))
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) CONFIG 1WIRE ・ 1WRESET命令を参照。 |
|
|
1WSEARCHFIRST |
一覧へ戻る |
1-Wireバスに存在する、デバイスのシリアル番号を検索します。 (初回時に使用する命令)
書式 |
variable = 1wsearchfirst()
variable = 1wsearchfirst(Port , Pin) |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
検索したシリアル番号を入れる配列変数。 (バイト型 [8byte]) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・デバイスの検索をする場合、まず始めに1WSEARCHFIRST命令を使用します。
・バス上に2つ以上のデバイスがある場合は、2つめから1WSEARCHNEXT命令を使用して下さい。
・シリアル番号を格納する変数は8バイト以上必要なので、配列を宣言しておきます。
・文字変数には格納できません。 (ヌル[00]が、文字列の終了コードのため)
・デバイスが見つからない等のエラーが発生した場合は、エラー状態を格納する内部変数「Err」に、
エラーなし = 0 、エラーあり = 1 が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) デバイスのシリアル番号を調べる。 (バス上にデバイスが2つ以上の場合) |
Dim Idbuff(16) As Byte |
' デバイスのシリアル番号を格納する配列。(8byte以上) |
Dim Temp1 As Byte |
' 汎用テンポラリ変数 Byte型 No.1 |
Dim Tempw1 As Word |
' 汎用テンポラリ変数 Word型 No.1 |
Config 1wire = Portd.0 |
' 1-Wireバスのデータ線を接続するポートピンを設定。 |
Idbuff(1) = 1wsearchfirst() |
' 最初にシリアル番号を検索する。 |
Locate 1 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
' |
' |
Do |
' 繰り返し。 |
Idbuff(9) = 1wsearchnext() |
' 次のシリアル番号を検索する。 |
If Err = 0 Then |
' デバイスが見つかったか? |
Locate 2 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 9 To 16 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
End If |
' |
Loop Until Err = 1 |
' もうデバイスが見つからない場合には、Err = 1 になる。 |
' |
' |
Tempw1 = 1wirecount() |
' デバイスの総数を調べる。 |
End |
' |
|
|
1WSEARCHNEXT |
一覧へ戻る |
1-Wireバスに存在する、デバイスのシリアル番号を検索します。 (2つめ以降に使用)
書式 |
variable = 1wsearchnext()
variable = 1wsearchnext(Port , Pin) |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
検索したシリアル番号を入れる配列変数。 (バイト型 [8byte]) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・デバイスの検索をする場合、まず始めに1WSEARCHFIRST命令を使用して下さい。
・バス上に2つ以上のデバイスがある場合は、2つめから1WSEARCHNEXT命令を使用します。
・シリアル番号を格納する変数は8バイト以上必要なので、配列を宣言しておきます。
・文字変数には格納できません。 (ヌル[00]が、文字列の終了コードのため)
・デバイスが見つからない等のエラーが発生した場合は、エラー状態を格納する内部変数「Err」に、
エラーなし = 0 、エラーあり = 1 が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
1WIRECOUNT |
一覧へ戻る |
1-Wireバスに存在する、デバイスの数を取得します。
書式 |
variable = 1wirecount()
variable = 1wirecount(Port , Pin) |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
デバイスの数を入れる変数。 (ワード型変数) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・デバイスのシリアル番号を検索する、1WSEARCHFIRST 並びに 1WSEARCHNEXT命令を実行
する前に、接続されているデバイスの個数を調べることができます。
・デバイスの数を入れる変数は、ワード または インテジャー型でなければなりません。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) 接続されているデバイスの個数を調べる。 |
Dim Tempw1 As Word |
' 汎用テンポラリ変数 Word型 No.1 |
Config 1wire = Portd.0 |
' 1-Wireバスのデータ線を接続するポートピンを設定。 |
Tempw1 = 1wirecount() |
' デバイスの総数を調べる。 |
Locate 1 , 1 |
' LCDにデバイスの個数を表示する。 |
Lcd Tempw1 |
' |
End |
' |
|
|
1WVERIFY |
一覧へ戻る |
1-Wireバスで、指定されたシリアル番号のデバイスが使用できるかを確認します。
書式 |
1wverify variable
1wverify variable , Port , Pin |
1-Wireバスが、1つの場合。
1-Wireバスを、複数使用する場合。 |
注釈 |
variable = |
確認するシリアル番号が入った配列変数。 (バイト型 [8byte]) |
Port = |
ポートの名前。 ( Pina , Pinb , Pinc など) |
Pin = |
ピンの番号。 ( 0 〜 7 ) (定数 または 数値変数) |
|
・1-Wireバス上に、指定したシリアル番号のデバイスが存在した場合は、内部変数「Err」に [0] が入り、
見つからない場合には [1] が入ります。
・複数の1-Wireバスを使用する場合は、2つめからのポートピン設定を、各1-Wireコマンドの後に
オプションで指定します。
・この場合、ポート名は入力ポート名「Pina , Pinb , Pinc など」となりますので注意して下さい。
・「CONFIG 1WIRE」命令を使用せずに、すべての各1-Wireコマンドの後に、ポートピン設定を記述する
方法も可能です。 (同一ポート内に限定)
|
(例) 指定したシリアル番号が使用できるかを確認する。 |
Dim Idbuff(8) As Byte |
' デバイスのシリアル番号を格納する配列。(8byte以上) |
Dim Temp1 As Byte |
' 汎用テンポラリ変数 Byte型 No.1 |
Config 1wire = Portd.0 |
' 1-Wireバスのデータ線を接続するポートピンを設定。 |
Idbuff(1) = 1wsearchfirst() |
' 最初にシリアル番号を検索する。 |
Locate 1 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
' |
' |
1wverify Idbuff(1) |
' 指定したシリアル番号が使用できるかを確認する。 |
Locate 2 , 1 |
' デバイスの状態を表示する。 |
Lcd Err |
|
End |
' |
|
|
CRC8 |
一覧へ戻る |
配列 または 変数の、CRC8値(巡回冗長検査)を計算します。 (CRC8-Maxim/Dallas)
書式 |
variable = Crc8(source , length) |
注釈 |
variable = |
CRC8の計算結果を入れる変数。 (バイト型) |
source = |
CRC8を計算する配列 または 変数。 (配列の添字はデータの先頭) |
length = |
CRC8を計算するバイト数。 |
|
・1-Wireバスで使用されるデバイスのシリアル番号は、最後のバイトがCRCバイトになっています。
・これにより、受信したデータに誤りがないかを検査します。
・CRC8の計算は「Maxim/Dallas」式で、下記の計算式で求められます。
CRC = X8 + X5 + X4 + 1
・8バイトのシリアル番号では、先頭から7バイトを上記の式で計算し、8バイト目にその結果が添えられ
ます。
・検査方法は、受信したデータの先頭から7バイトでCRC8を計算し、8バイト目と一致しているかを照合
するか、8バイト全てのCEC8を計算し、結果が0になっているかを確認します。
・検査の結果に異常がある場合は、再度シリアル番号を要求するようにプログラムを作成します。
|
(例) 受信したシリアル番号に、エラーがないかを確認する。 |
Dim Idbuff(8) As Byte |
' デバイスのシリアル番号を格納する配列。(8byte以上) |
Dim Temp1 As Byte |
' 汎用テンポラリ変数 Byte型 No.1 |
Config 1wire = Portd.0 |
' 1-Wireバスのデータ線を接続するポートピンを設定。 |
Idbuff(1) = 1wsearchfirst() |
' 最初にシリアル番号を検索する。 |
Locate 1 , 1 |
' LCDにシリアル番号を表示する。 |
For Temp1 = 1 To 8 |
' |
Lcd Hex(idbuff(temp1)); |
' |
Next Temp1 |
' |
' |
' |
Temp1 = Crc8(idbuff(1) , 7) |
' シリアル番号の先頭から7バイトでCRC8を計算する。 |
Locate 2 , 1 |
' LCDに計算結果を表示する。 |
Lcd Hex(temp1) |
' (シリアル番号の8バイト目と一致すれば異常なし) |
' |
' |
Temp1 = Crc8(idbuff(1) , 8) |
' シリアル番号の8バイトすべてでCRC8を計算する。 |
Locate 2 , 5 |
' LCDに計算結果を表示する。 |
Lcd Hex(temp1) |
' (結果が0ならば異常なし) |
End |
' |
|
|
|