PicBasic Pro Compiler
完全日本語訳サンプル(テック・ハンゾウガネ訳)
Copyrights
and Trademarks
Copyright ©2000 microEngineering Labs, Inc.
All rights reserved.
EPIC and
PicBasic Pro are trademarks of microEngineering Labs, Inc.
BASIC Stamp is a trademark of Parallax, Inc.
PICmicro is a registered trademark of Microchip Technology Inc.
シリアルEEPROM命令 I2CREAD
LCD 命令 LCDOUT
RS-232Cアウト命令 SEROUT
日本語訳文の著作権はテック・ハンゾウガネ諸橋義明に帰属します。
Japanese Translation Copy Right
©2001-2003 Tech・Hanzougane Yoshiaki Morohashi
尚、日本語訳文から派生する利用者のいかなる不利益もテック・ハンゾウガネ諸橋義明は責任を負いません。
I2CREAD
I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}
ControlとオプションのAddressバイトをClockPinとDataPinに送出し、受け取ったバイトを変数の中に格納してください。
ClockPinとDataPinは定数、ナンバー0-15(e.g. B0 )あるいはピン名前(e.g. PORTA.0 )を含む0-15、あるいは変数であることができます。I2CREADとI2CWRITEがマイクロチップ24LC01Bと類似のデバイスのような2ワイヤーのI2CインタフェースでシリアルEEPROMにデータを読み書きに使うことができます。
それが、電源が止められた後さえ、保持されるように、データは外部の不揮発メモリに格納されることができます。これらのコマンドはI2Cマスターモードで動作して、そして同じく温度センサやA/DコンバータのようなI2Cインタフェースで他のデバイスと通話をするためにもわれます。
12ビットのコアのためにPICmicro MCUのみ、I2C クロックとデータピンがDEFINEによってコンパイル時に固定されます。 このインフォメーションがコンパイラによって無視されるけれども、それらはまだI2CREAD命令で指定されなければなりません。
DEFINE I2C_SCL PORTA,1 'For 12-bit core only
DEFINE I2C_SDA PORTA,0 'For 12-bit core only
コントロールバイトの上7ビットはチップ選択あるいは追加のアドレスインフォメーションとともに、特定のデバイスによって制御コードを含んでいます。
下位bit はそれが読みまたは書き込み命令であって、そしてクリアしておかれるべきであるかどうかを示す内部のフラグです。コントロールバイトのためのこのフォーマットはオリジナルのPicBasicコンパイラによって使われるフォーマットと異なっています。PBP
I2Cオペレーションでこのフォーマットを使うことを確認してください。例えば、24LC01Bとコミュニケートするとき、制御コードは%1010です、そしてチップ選択は使われていません、それでコントロールバイトは%10100000あるいは
$A0であるでしょう。 様々な役割のコントロールバイトのフォーマットを次に上げます:
Device |
Capacity |
Control |
Address size |
24LC01B |
128 bytes |
%1010xxx0 |
1 byte |
24LC02B |
256 bytes |
%1010xxx0 |
1 byte |
24LC04B |
512 bytes |
%1010xxb0 |
1 byte |
24LC08B |
1K bytes |
%1010xbb0 |
1 byte |
24LC16B |
2K bytes |
%1010bbb0 |
1 byte |
24LC32B |
4K bytes |
%1010ddd0 |
2 bytes |
24LC65 |
8K bytes |
%1010ddd0 |
2 bytes |
bbb =ブロックセレクト(ハイ順アドレス)ビット
ddd =デバイスセレクトビット
xxx =気にかけない
アドレスサイズ送出(バイトあるいはワード)は使われる変数の大きさによって決定されます。
もしバイトサイズの変数がアドレスに使われるなら、8ビットのアドレスが送られます。 もしワードサイズの変数が使われるなら、16ビットのアドレスが送られます。 あなたがそれとコミュニケートすることを望むデバイスのために適切なサイズの変数を使うことを明示してください。定数は定数のサイズにたいへん依存したアドレスのために使われるべきではない。また表現は送出される不適当なアドレスサイズとして使用されるべきではない。
もしワードサイズの変数が指定されるなら、2バイトが読まれて、ハイバイトが最初に格納されます。ローバイトが続きます。
この順序は変数を通常に格納する、ローバイトが最初の方法と異なっています。修飾子、STR、は可変的な名前の前に含まれます。 これは同時にに全部の配列(文字列)をロードすることができます。
もしSTRが指定されるなら、次の変数はバックスラッシュ(\)と数に続いて、ワードあるいはバイト配列の名前でなくてはいけません:
a var byte[8]
I2CREAD
PORTC.4,PORTC.3,$a0,0,[STR a\8]
もしワードサイズ配列が指定されるなら、それぞれの要素を構成する2バイトはローバイトは最初に読み込まれる。
これは単純なワードが読まれる方法の正反対であって、そしてコンパイラが通常ワードサイズ変数を格納する方法と一致している。もしオプションラベルが含まれるなら、このラベルはアクノリッジがI2Cデバイスから受信されないならジャンプされるだろう。I2Cインストラクションは12CExxxと16CExxxデバイスのオンチップシリアルEEPROMにアクセスするために使われることができる。
ただ適切な内部のラインのピン名をI2Cコマンドの部分とプログラムの最上部においてDEFINEに続く場所の一部として明示しなさい:
DEFINE I2C_INTERNAL 1
12CE67xデバイスのために、データラインはGPIO.6である、そしてクロックラインはGPIO.7である。16CE62x デバイスのために、データラインはEEINTF.1である、そしてクロックラインはEEINTF.2である。
もっと多くの情報のためそれらのデバイスのマイクロチップデータシートを見なさい。I2C インストラクションのタイミングは(100KHz)から8MHzまでのクロック速度でアクセス可能であるであろう標準スピードデバイスにセットされる。 高速モードデバイス(400KHz)は20MHzまで使える。 もし8MHz以上において標準スピードデバイスにアクセスすることが望まれるなら、次のDEFINEはプログラムに加えられるべきである:
DEFINE I2C_SLOW 1
受信デバイスによって休止できるI2Cバス上でその保持クロックラインlowのため遷移させなさい。 これを可能にするために、次のDEFINEはプログラムに加えられるべきである:
DEFINE I2C_HOLD 1
I2C クロックとデータ行は次の回路図でそれらはまた双方向性のオープンコレクター規則で共に動作しているとして4.7K抵抗でVccにプルアップされるべきだ。2極式のI2C クロック線を作製するために、オープンコレクターのかわりに次のDEFINEをプログラムに追加できる
DEFINE I2C_SCLOUT 1
addr var byte
cont con %10100000
addr = 17 ‘ Set address to 17
‘ Read data at address 17 into B2
I2CREAD PORTA.0,PORTA.1,cont,addr,[B2]
さらなる情報のため、それらやI2CREADやI2CWRITEコマンドが使われているだろうデバイス上でMicrochip
ANon-Volatile
Memory (不揮発メモリ)Products Data Book@を見なさい。
LCDOUT
LCDOUT Item{,Item...}
インテリジェント液晶上にItemを表示します。 PBPは日立44780コントローラーあるいは同等品でLCDモジュールをサポートします。 これらのLCDは通常1つのエッジにおいて14あるいはの16ピンの単列あるいは二重横列のヘッダーがあります。もしポンドサイン(
# )がItemに前置されるなら、それぞれのデジットのASCII表記はLCDに送られます。 LCDOUT(12ビットのコア以外のすべてのデバイスの上で)は同じくSEROUT2と共に使われる修飾子のいずれも使うことができます。
このインフォメーションのためにSEROUT2の上にセクションを見てください。
Modifier |
Operation |
{I}{S}BIN{1..16} |
2進数を送信しなさい |
{I}{S}DEC{1..5} |
10進数を送信しなさい |
{I}{S}HEX{1..4} |
16進数を送信しなさい |
REP c\n |
文字cがn回繰り返し送信しなさい |
STR ArrayVar{\n} |
n個の文字ストリングを送信しなさい |
最初のコマンドをLCDに送る前に、プログラムが少なくとも0.5秒を待つべきです。 それはLCDがスタートアップする間を取ります。いろんな文字あるいはコマンドがLCDOUTを使って送られる最初に、LCDは初期化されます。
もし動作中に何らかの理由でそれが電源停止やそれから電源バックアップされるなら、LCDOUTを使う次のとき、内部のフラグを再初期化することをプログラムに示すためリセットできます:
FLAGS = 0
コマンドは、$FEに続くコマンドを送出することによってLCDに送られます。若干の有用なコマンドが次の表に載せられています:
Command |
Operation |
$FE, 1 |
クリアディスプレイ |
$FE, 2 |
リターンホーム(最初のラインの始め) |
$FE, $0C |
カーソルオフ |
$FE, $0E |
アンダーラインカーソルオン |
$FE, $0F |
ブリンキングカーソルオン |
$FE, $10 |
カーソルを左へ1つポジション移動してください |
$FE, $14 |
カーソルを右へ1つポジション移動してください |
$FE, $C0 |
カーソルを2番目のラインの始めに移動してださい |
$FE, $94 |
カーソルを3番目のラインの始めに移動してください |
$FE, $D4 |
カーソルを4番目のラインの始めに移動してください |
カーソルを2ラインのディスプレイの2番目のラインの始まりに動かすコマンドがあることに注意してください。
たいていのLCDに、表示された文字と行はディスプレイメモリーで連続していません−ロケーション間でブレークすることができます。
たいていの16x2ディスプレイのため、最初のラインは$0で始まります、そして2番目のラインは$40で始まります。 コマンド:
LCDOUT $FE, $80 + 4
は最初のラインの4番目の位置で書き始めることを設定します。
16x1ディスプレイが通常1番目と2番目の8文字のためにメモリー配置のあいだのブレークで8x2ディスプレイとしてフォーマットされます。
上の表に示されるように、4ラインのディスプレイはまた複合しているメモリーマップを持っています。文字記憶場所と追加のコマンドのために特定のLCDデバイスのデータシートを見てください。.
LCDOUT $FE, 1, “Hello” ’ディスプレイをクリアして、そして「 Hello 」を表示してください
LCDOUT $FE,$C0,“World” ’2番目のラインにジャンプして”World”を表示してください
LCDOUT B0, #B1 ’B0とB1の十進ASCII値を表示してください
LCDは4ビットのバスあるいは8ビットのバスを使ってPICmicroに接続できる。 もし8ビットのバスが使われるな
ら、すべての8ビットは1つのポートの上になければなりません。 もし4ビットのバスが使われるなら、最下位4ある
いは1つのポートの最上位4bit に接続しなくてはいけません。 イネーブルとレジスタセレクトはどんなポートピンと
でも接続されても良い。 LCDOUTコマンドが書き込みのみである時、 R/Wはグランドに結線されるべきです。
LCDは4ビットのバスあるいは8ビットのバスを使ってPICmicroに接続できる。 もし8ビットのバスが使われるなら、すべての8ビットは1つのポートの上になければなりません。
もし4ビットのバスが使われるなら、最下位4あるいは1つのポートの最上位4bitに接続しなくてはいけません。イネーブルとレジスタセレクトはどんなポートピンとでも接続されても良い。
LCDINコマンドが使われない時、 R/Wはグランドに結線されるべきです。
PBPは、示されないならLCDが特定の
Pinに接続していると想定します。 それはPICmicroのPORTA.0 - PORTA.3, レジスタセレクトPORTA.4
とイネーブルPORTB.3が接続されたデータラインDB4 - DB7を持った4ビットバスで使われるであろうと想定します。それはまたLCDを2ラインのディスプレイに初期化するようにあらかじめセットされています。このセットアップを変更するため、次のDEFINEの1つまたはさらに多くの文ををあなたのPicBasic
Proプログラムのトップに置いてください:
' Set LCD Data port
DEFINE LCD_DREG PORTB
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 4
' Set LCD Register Select port
DEFINE LCD_RSREG PORTB
' Set LCD Register Select bit
DEFINE LCD_RSBIT 1
' Set LCD Enable port
DEFINE LCD_EREG PORTB
' Set LCD Enable bit
DEFINE LCD_EBIT 0
' Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 4
' Set number of lines on LCD
DEFINE LCD_LINES 2
' Set command delay time in us
DEFINE LCD_COMMANDUS 2000
' Set data delay time in us
DEFINE LCD_DATAUS 50
このセットアップはPBPに2ラインのLCDが PORTB.0の上に PORTBの最上位4ビット、 PORTB.1上のレジスタセレクトとイネーブル上の4ビットのモードでデータバスに接続していると示すでしょう。次の回路図は、デフォルトを使って、LCDをPICmicroに接続する1つの方法を示します:
(訳者注記):下図はPORTAをデータバスとしたものであり上のDEFINE文はPORTBをデータバスとしたものです。
SEROUT
SEROUT Pin,Mode,[Item{,Item...}]
標準的な非同期フォォーマットを使っている8データビット、ノーパリティと1ストップビット(8N1)でPin上に1つかそれ以上のItemを受け取ってください。 SEROUTはBS1 Seroutコマンドに類似しています。 Pin は自動的にアウトプットにされます。
Pinは定数、0−15、あるいは番0−15(e.g. B0 )あるいはピン名(e.g. PORTA.0)を含んでいる変数であることができます。
Mode名(T2400)はファイルMODEDEFS.BASで定義されます。
それらを使うために、PICBasic Proプログラムのトップに
Include
"modedefs.bas"
のラインを付加して下さい。
BS1DEFS.BASとBS2DEFS.BASがすでにMODEDEFS.BASを含みます。
もしこれらのファイルの1つがすでに含まれているなら、再びそれを含まないでください。 このファイルを含まないで、Modeナンバーは使われることができます。
Mode |
Mode No. |
Baud Rate |
State |
T2400 |
0 |
2400 |
Driven True |
T1200 |
1 |
1200 |
|
T9600 |
2 |
9600 |
|
T300 |
3 |
300 |
|
N2400 |
4 |
2400 |
Driven Inverted |
N1200 |
5 |
1200 |
|
N9600 |
6 |
9600 |
|
N300 |
7 |
300 |
|
OT2400 |
8 |
2400 |
Open True* |
OT1200 |
9 |
1200 |
|
OT9600 |
10 |
9600 |
|
OT300 |
11 |
300 |
|
ON2400 |
12 |
2400 |
Open Inverted* |
ON1200 |
13 |
1200 |
|
ON9600 |
14 |
9600 |
|
ON300 |
15 |
300 |
* Openモードは12ビットコアPicMicro MCUでサポートしない。
SEROUTはミックスして、一つのSEROUT文中で自由に組み合わされる3つの異なったデータ型をサポートします。
1) |
|
文字列定数が文字のリテラル列として出力されます。 |
2) |
|
数値(変数あるいは定数)が対応するASCII文字を送出する。 最も注記すること、13が改行です、そして10はリターンです。 |
3) |
|
ポンドサインを( # )前置がその十進値の ASCIIの表現を送出する。
例えば、もし W0 = 123であるなら、それから # W0 (あるいは
# 123)が「1」、「2」、「3」を送るでしょう。 |
そのビットタイミングを生成するとき、SEROUTは4MHzオシレータを想定します。 他のオシレータ値で適切なボーレートタイミングを保持するために、新しいオシレータ値にOSC設定をDEFINEで明らかにしてください。
ある場合には、SEROUT命令の送信速度は受信デバイスにあまりにも速く文字を渡すことができます。
DEFINEがシリアル出力伝送に文字間隔を付加します。 それらが伝送されるとき、文字間の追加時間を割り当てます。DEFINEの文字間隔は伝送されたそれぞれの文字間に1から65,535マイクロ秒(.001から65.535ミリ秒)のディレーを割り当てます。
例えば、それぞれの文字の送信の間に1ミリ秒ポーズするため:
DEFINE CHAR_PACING 1000
シングルチップRS
-232レベルコンバータが普通で、そして高価でない間に、PICmicroの素晴らしい I/O 仕様はたいていのアプリケーションがレベルコンバータ無しで動作することを可能にします。どちらかと言えば、電流制限抵抗器の接続で反転インプット(
N300. .N9600 )が使える。
(RS-232Cは短絡許容であると仮定する)
SEROUT 0,N2400,[#B0,10] ' B0 の ASCII 値をPin0 の外にシリアルにラインフィードで送信して下さい