Docs/E2J/nvp5.pdf
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
&size(20){&color(,#FFE9C8){''Propeller Basic プログラミン...
//邦題タイトル
&size(15){''原題:'BASIC Propeller Programming'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:nvp5.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:PropBASICの初歩知識(この文書は初期[2010年 3月]...
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
ParallaxとBASICはそれ自体素晴らしいけどそれがマカロニとチ...
PropellerではBASICを使えないので失望している人が少なから...
私のようにずっとBASICを使ってきた人達や組込みプロジェクト...
今やSpinは私にとってオーケーであり、全く心地よいものとな...
30年ほどBASICや他の言語でプログラミングしてきたがやはりBA...
さて、よいおしらせだ。”Bean”の名で知られるTerry Hittが率...
もう「BASICが使えないからPropellerは使わないよ」という言...
**PropBASICとはなにか [#p892ba0d]
はっきりしている事はPropBASICはアセンブラコードに変換する...
そのコードは一つ以上のSPINファイルだ。Version1でメインプ...
Propellerアセンブラは強力なので他のCPUで数行のアセンブラ...
そのうえ、まだ7つのCogが残っていて、PropBASICはそれぞれ...
SX/Bを使ったことのある人にとってはPropBASICはとてもよくわ...
私を含めて多くの人にとってBASIC StampからSX/Bへ乗り換える...
でもBASIC StampからPropBASICに乗り換えるのはとっても簡単...
少し新しい事を学習しなくてはいけないけれど、すぐにマルチ...
**こんにちはPropBASIC [#p892ba0d]
どの学習書でも必ず”Hello World”で始まるのがお決まりになっ...
マイクロコントローラの分野でそれに相当するのはLEDの点滅だ...
LEDの点滅さえもできないのに、どうやってGPSを使った多軸ロ...
ちらかって汚いプログラムリストは大嫌いだ。最後まできちん...
template.pbasを使ってPropBASICプログラムの内容を紹介するh...
あえて言おう。
SX/BやBASIC Stampを使った事のある人ならPropBASICに乗り換...
**デバイス設定[#p892ba0d]
DEVICE P8X32A, XTAL1, PLL16X
XIN 5_000_000
上記はPropBASICでは定番だ。
これは16倍PLLを使った外部クロックを入力するプロセッサをP8...
外部クロック周波数は5MHzでシステムクロックは80MHzだ(5 x 16)
もちろん定番以外もある。時間にシビアでない用途ならRCモー...
RCモードのシステムクロックはRCFASTで大体12MHz、RCSLOWで大...
RCFASTの設定は
DEVICE P8X32A
RCFASTの設定の場合はなにも指定しないけれどRCSLOWの場合はR...
RCモードでは必ずPLLは1倍でXINは無視される。
繰り返すが、RC発信周波数はチップ単位で異なるのでRCモード...
スポックが今の文章を読んだら眉毛を少しつり上げるかもしれ...
RCモードがシリアル通信に不向きなら、RCモードで動作してい...
よい質問だ。
実際IDEはダウンロードプロトコルの役割としてPropellerと拍...
だから、消費電流を減らすために低クロックスピードにしてシ...
・RCモードのクロックスピードを測定(FREQディレクティブはな...
オシロを使って出力パルスの巾を測定して計算
・XINの替わりにFREQディレクティブでRC周波数を修正
10msecのパルスを出力するプログラムを作って(speed_test.pba...
これはプロセッサは予想より少し速いクロックで動作している...
以下のように測定したパルス巾を予想していた10msecで割った...
Scale = 10.0/measured
私の場合、scale factorは1.1038だった。クロック周波数20kHz...
DEVICE P8X32A, RCSLOW
FREQ 22_075
FREQ設定でコンパイルすることにより、PAUSEやSEROUTでも正し...
**定数” [#p892ba0d]
テンプレートの次の項目は定数定義だ。数字とキャラクタ文字...
OnTime CON 250
OffTime CON 750
IsOn CON 1
IsOff CON 0
Asterisk CON “*”
プログラムでSERIN,SEROUTを使う場合はボーモード定数の設定...
Baud CON “T9600”
上記ではSERIN,SEROUTをTrueモードで使う場合の定義を示して...
PropBASICでは定数はグローバルとして扱われ、どのCogでも使...
**I/Oピン [#p892ba0d]
LED PIN 16 LOW
PropBASICではI/O ピンの宣言はPBASIC2.5やリセット後にピン...
通信プログラムでこのピン定義を使用している。
RX PIN 31 INPUT
TX PIN 30 HIGH
HIGHオプションの使用に注意:シリアル通信のTXピンをアイド...
PropBASICはI/Oピンのグループを定義することもできる。例え...
LEDs PIN 23..16 LOW
ピングループ定義で最初の数字がグループの最上位ピン(MSB)、...
PropBASIC1.0では出力ピングループにバイナリを割り当てるこ...
LEDs = %100000
上記はOK、しかし
LEDs = 1 << position
はNG。これは将来実装されるかもしれない。現在のところは下...
__temp = 1 << position
LEDs = __temp
**変数の共有 [#p892ba0d]
PropBASICでは変数及び配列をHubに保存しており、それらはど...
Hubの変数はbytes,words,longs,全部のタイプのarraysで定義さ...
rxHead HUB Byte = 0
rxTail HUB Byte = 0
rxBuffer HUB Byte(64) = 0
PropBASICではHub変数の初期値を設定できるが、初期値設定さ...
Hub変数は通常の変数のようには扱えず、それらのread/writeに...
**データの共有 [#p892ba0d]
変数と同じようにHubにあるデータも共有できる、そして32Kバ...
Hubのデータはbytes,words,longsとして、それぞれDATA,WORD,L...
Zip4 DATA %0001
DATA %0010
DATA %0100
DATA %1000
Hub変数のようにRDxxxx/WRxxxxを使ってHubのデータにアクセス...
大きなテーブルデータの場合はFILEディレクティブを使って外...
SFX1 FILE “BABY.WAV”
DATA 0
**タスク定義[#p892ba0d]
PropBASICで2個以上のCogを使用して「裏プロセス」の処理を実...
PropellerではHub変数を使ってシリアル入力処理を別のプロセ...
SERIAL_RX TASK
**ローカル(Cog)変数 [#p892ba0d]
プログラムやタスクで使う変数はCogにとってローカルでLongと...
Hub変数として配列宣言や初期値設定ができる。
Idx VAR Long
PropBASICはコンパイラによって生成されるアセンブラコードで...
コンパイル出力を見ると5個の変数__temp1〜__temp5があります...
変数__param1〜__param4ぐらいは利用してもいいでしょう。こ...
**サブルーチンと関数の宣言 [#p892ba0d]
始めに述べたようにPropBASICは1パスコンパイラでアセンブラ...
良いニュースは出力コードを検査することでアセンブラを習得...
SX/Bの初期には意味がないと思われるコードを削除していたも...
例えばPAUSEはよく使われる、このPAUSE 100のPASMが下記だ
mov __temp1, cnt
adds __temp1, _1msec
mov __temp2, #100
__L001
waitcnt __temp1, _1msec
djnz __temp2, #__L001
オーケー、もしPAUSEが出現する度にアセンブラコードを生成し...
SX/BのようにDELAY_MSという名前のシェルは下記
DELAY_MS SUB 1
DELAY_MSは1個の引数が必要だ。Propeller変数は32bitなのでそ...
SX/Bを知ってる人にはPropBASICのFUNC宣言は少し違うと思うだ...
1月にPropeller ForumメンバーがSIRCSのPropBASICへの移植に...
SIRCSオブジェクトはIRコードビットをビットカウントのように...
PropBASICは関数が返すパラメータ数を気にしない。(通常は1...
それ故、定義は下記
SIRCS_RX FUNC 0
**メインプログラム [#p892ba0d]
LED blinkerプログラム本体は大体下記のようになる
PROGRAM Start
Start:
FOR idx = 1 TO 3
LED = IsOn
DELAY_MS OnTime
LED = IsOff
DELAY_MS OffTime
NEXT
DELAY_MS 1_000
GOTO Start
PROGRAMディレクティブはユーザが作ったプログラムの始点と、...
Propellerではstart-upコードはディレクティブの指すラベルへ...
見てのとうり、コードはまったくのBASICだ。PBASICやSX/B、他...
**サブルーチンと関数の中身を作る [#p892ba0d]
サブルーチンと関数のコードはリストの最後に書くことになっ...
SUB DELAY_MS
PAUSE __param1
ENDSUB
他の言語同様にサブルーチンは別のサブルーチンをcallするこ...
SUB TX_STR
strAddr VAR __param2
strChar VAR __param3
strAddr = __param1
DO
RDBYTE strAddr, strChar
IF strChar = 0 THEN EXIT
TX_BYTE strChar
INC strAddr
LOOP
ENDSUB
SUB TX_BYTE
SEROUT TX, Baud, __param1
ENDSUB
2番目のサブルーチンはSEROUTのシェルで、最初のサブルーチン...
文字のアドレスを引数にしてTX_STRをcallするとその引数は__p...
TX_BYTEに文字を渡すのに__param1が必要なのでサブルーチン内...
新しい変数を宣言しない理由はPropellerでは全部がRAMにある...
その為、できるだけ__paramx変数を使い変数宣言を少なくして...
多分キャラクタコードを得るのにRDBYTEを使ってるコードに気...
Banner DATA “PropBASIC”, 0
関数のコードはサブルーチンコードと比較するとFUNC..ENDFUNC...
FUNC GET_SIRCS
irCode VAR __param1
irBits VAR __param2
COUNTERA NEG_DETECT, IR, 0, 1
COUNTERB FREE_RUN, 0, 0, 1
Wait_Start:
WAITPEQ IR, IR
PHSA = 0
WAITPNE IR, IR
PHSB = 0
WAITPEQ IR, IR
IF PHSA < BIT_S THEN Wait_Start
irCode = 0
irBits = 0
Check_Frame
IF PHSB > MS_044 THEN IR_Done
Wait_Bit:
IF IR = 1 THEN Check_Frame
PHSA = 0
WAITPEQ IR, IR
irCode = irCode >> 1
Measure_Bit:
IF PHSA > BIT_1 THEN
irCode = irCode | $8000_0000
ENDIF
INC irBits
IF irBits = 20 THEN IR_Done
GOTO Check_Frame
IR_Done
__temp1 = 32 – irBits
irCode = irCode >> __temp1
RETURN irCode, irBits
ENDFUNC
まったくそのまんまのコードだと思う。これはアセンブリコー...
PropBASICはSIRCSの例のようにPASMにあるWAITPEQ、WAITPNEな...
**タスクの中身を作る [#p892ba0d]
タスクは別のCogで動いてるのでその構成はサブルーチンや関数...
実際、タスクはそれ自身が1つのプログラムなのでその中でのみ...
これらの宣言やコードの全部がTASK..ENDTASKブロック内にある。
TASK SERIAL_RX
rxb VAR __param1
hPntr VAR __param2
DO
SERIN RX, Baud, rxb
RDBYTE rxHead, hPntr
WRBYTE rxBuffer(hPntr), rxb
INC hPntr
hPntr = hPntr & $3F
WRBYTE rxHead, hPntr
LOOP
ENDTASK
そのとうり、これが全部だ。タスクはCON,PIN,HUB宣言もできる...
DO..LOOPの最初でSERINを使ってバイトデータを読んでいる。-...
違いはこのタスクはそれ自身のCogで起動されシリアルデータを...
現在のヘッドポインタのデータをRDBYTEで読み出しrxBufferに...
ヘッドポインタを+1してバッファ内に収まるように$3FとANDし...
タスクをスタートするには2種類あるがたいていCOGSTARTを使う。
COGSTART SERIAL_RX
別のCogが立ち上がり準備が整うまで十分な時間は必要なので、...
PropBASICコンパイラはタスクの名前でSpinファイルも作れるの...
オーケー。シリアルデータを受信しバッファリングする方法は...
バッファからデータを取り出す関数を書いたよ。
FUNC RX_BYTE
rxh VAR __param1
rxt VAR __param2
rxchar VAR __param3
DO
RDBYTE rxHead, rxh
RDBYTE rxTail, rxt
LOOP UNTIL rxh <> rxt
RDBYTE rxBuffer(rxt), rxchar
INC rxt
rxt = rxt & $3F
WRBYTE rxTail, rxt
RETURN rxchar
ENDFUNC
最初のループでヘッドとテイルポインタの値を比較してデータ...
バッファが空だとこの値は等しく、この値が違うとバッファイ...
別のCogがシリアルバッファにデータを保存するやっかい事をや...
シリアルバッファで待つバイト数を戻す関数があるよ。
もしゼロならバッファが空なので受信データをただ待つだけのR...
FUNC RX_CHECK
head VAR __param1
tail VAR __param2
bufcnt VAR __param3
RDBYTE rxHead, head
RDBYTE rxTail, tail
IF head >= tail THEN
bufcnt = head – tail
ELSE
bufcnt = tail – head
ENDIF
RETURN bufcnt
ENDFUNC
これはバッファの先頭と最後尾間の差をリターンする。バッフ...
**誰でもアセンブラ? [#p892ba0d]
難解なアセンブラ言語から解放してくれて速いプログラムをコ...
でもそれでもアセンブラうを使うのはやっぱり便利だ。
PropBASICでは複数行ならASM..ENDASMブロック、1行なら”\”を...
**まとめよう [#p892ba0d]
ここだけで多様な機能をもつPropBASICを述べる事はできない。...
アプリケーション初期バージョンとしては本当によくできてい...
**PropBASICの将来 [#p892ba0d]
一言でいえばワクワクしているんだ。
SX/Bを使ってた人達はもちろん、初心者にとってもこんなに便...
PropBASIC1.0の機能はSX/Bのよりも少し進んでいる。
アセンブラ言語なみのの速度で走る大きなプログラムを作れるL...
終了行:
&size(20){&color(,#FFE9C8){''Propeller Basic プログラミン...
//邦題タイトル
&size(15){''原題:'BASIC Propeller Programming'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:nvp5.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:PropBASICの初歩知識(この文書は初期[2010年 3月]...
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
ParallaxとBASICはそれ自体素晴らしいけどそれがマカロニとチ...
PropellerではBASICを使えないので失望している人が少なから...
私のようにずっとBASICを使ってきた人達や組込みプロジェクト...
今やSpinは私にとってオーケーであり、全く心地よいものとな...
30年ほどBASICや他の言語でプログラミングしてきたがやはりBA...
さて、よいおしらせだ。”Bean”の名で知られるTerry Hittが率...
もう「BASICが使えないからPropellerは使わないよ」という言...
**PropBASICとはなにか [#p892ba0d]
はっきりしている事はPropBASICはアセンブラコードに変換する...
そのコードは一つ以上のSPINファイルだ。Version1でメインプ...
Propellerアセンブラは強力なので他のCPUで数行のアセンブラ...
そのうえ、まだ7つのCogが残っていて、PropBASICはそれぞれ...
SX/Bを使ったことのある人にとってはPropBASICはとてもよくわ...
私を含めて多くの人にとってBASIC StampからSX/Bへ乗り換える...
でもBASIC StampからPropBASICに乗り換えるのはとっても簡単...
少し新しい事を学習しなくてはいけないけれど、すぐにマルチ...
**こんにちはPropBASIC [#p892ba0d]
どの学習書でも必ず”Hello World”で始まるのがお決まりになっ...
マイクロコントローラの分野でそれに相当するのはLEDの点滅だ...
LEDの点滅さえもできないのに、どうやってGPSを使った多軸ロ...
ちらかって汚いプログラムリストは大嫌いだ。最後まできちん...
template.pbasを使ってPropBASICプログラムの内容を紹介するh...
あえて言おう。
SX/BやBASIC Stampを使った事のある人ならPropBASICに乗り換...
**デバイス設定[#p892ba0d]
DEVICE P8X32A, XTAL1, PLL16X
XIN 5_000_000
上記はPropBASICでは定番だ。
これは16倍PLLを使った外部クロックを入力するプロセッサをP8...
外部クロック周波数は5MHzでシステムクロックは80MHzだ(5 x 16)
もちろん定番以外もある。時間にシビアでない用途ならRCモー...
RCモードのシステムクロックはRCFASTで大体12MHz、RCSLOWで大...
RCFASTの設定は
DEVICE P8X32A
RCFASTの設定の場合はなにも指定しないけれどRCSLOWの場合はR...
RCモードでは必ずPLLは1倍でXINは無視される。
繰り返すが、RC発信周波数はチップ単位で異なるのでRCモード...
スポックが今の文章を読んだら眉毛を少しつり上げるかもしれ...
RCモードがシリアル通信に不向きなら、RCモードで動作してい...
よい質問だ。
実際IDEはダウンロードプロトコルの役割としてPropellerと拍...
だから、消費電流を減らすために低クロックスピードにしてシ...
・RCモードのクロックスピードを測定(FREQディレクティブはな...
オシロを使って出力パルスの巾を測定して計算
・XINの替わりにFREQディレクティブでRC周波数を修正
10msecのパルスを出力するプログラムを作って(speed_test.pba...
これはプロセッサは予想より少し速いクロックで動作している...
以下のように測定したパルス巾を予想していた10msecで割った...
Scale = 10.0/measured
私の場合、scale factorは1.1038だった。クロック周波数20kHz...
DEVICE P8X32A, RCSLOW
FREQ 22_075
FREQ設定でコンパイルすることにより、PAUSEやSEROUTでも正し...
**定数” [#p892ba0d]
テンプレートの次の項目は定数定義だ。数字とキャラクタ文字...
OnTime CON 250
OffTime CON 750
IsOn CON 1
IsOff CON 0
Asterisk CON “*”
プログラムでSERIN,SEROUTを使う場合はボーモード定数の設定...
Baud CON “T9600”
上記ではSERIN,SEROUTをTrueモードで使う場合の定義を示して...
PropBASICでは定数はグローバルとして扱われ、どのCogでも使...
**I/Oピン [#p892ba0d]
LED PIN 16 LOW
PropBASICではI/O ピンの宣言はPBASIC2.5やリセット後にピン...
通信プログラムでこのピン定義を使用している。
RX PIN 31 INPUT
TX PIN 30 HIGH
HIGHオプションの使用に注意:シリアル通信のTXピンをアイド...
PropBASICはI/Oピンのグループを定義することもできる。例え...
LEDs PIN 23..16 LOW
ピングループ定義で最初の数字がグループの最上位ピン(MSB)、...
PropBASIC1.0では出力ピングループにバイナリを割り当てるこ...
LEDs = %100000
上記はOK、しかし
LEDs = 1 << position
はNG。これは将来実装されるかもしれない。現在のところは下...
__temp = 1 << position
LEDs = __temp
**変数の共有 [#p892ba0d]
PropBASICでは変数及び配列をHubに保存しており、それらはど...
Hubの変数はbytes,words,longs,全部のタイプのarraysで定義さ...
rxHead HUB Byte = 0
rxTail HUB Byte = 0
rxBuffer HUB Byte(64) = 0
PropBASICではHub変数の初期値を設定できるが、初期値設定さ...
Hub変数は通常の変数のようには扱えず、それらのread/writeに...
**データの共有 [#p892ba0d]
変数と同じようにHubにあるデータも共有できる、そして32Kバ...
Hubのデータはbytes,words,longsとして、それぞれDATA,WORD,L...
Zip4 DATA %0001
DATA %0010
DATA %0100
DATA %1000
Hub変数のようにRDxxxx/WRxxxxを使ってHubのデータにアクセス...
大きなテーブルデータの場合はFILEディレクティブを使って外...
SFX1 FILE “BABY.WAV”
DATA 0
**タスク定義[#p892ba0d]
PropBASICで2個以上のCogを使用して「裏プロセス」の処理を実...
PropellerではHub変数を使ってシリアル入力処理を別のプロセ...
SERIAL_RX TASK
**ローカル(Cog)変数 [#p892ba0d]
プログラムやタスクで使う変数はCogにとってローカルでLongと...
Hub変数として配列宣言や初期値設定ができる。
Idx VAR Long
PropBASICはコンパイラによって生成されるアセンブラコードで...
コンパイル出力を見ると5個の変数__temp1〜__temp5があります...
変数__param1〜__param4ぐらいは利用してもいいでしょう。こ...
**サブルーチンと関数の宣言 [#p892ba0d]
始めに述べたようにPropBASICは1パスコンパイラでアセンブラ...
良いニュースは出力コードを検査することでアセンブラを習得...
SX/Bの初期には意味がないと思われるコードを削除していたも...
例えばPAUSEはよく使われる、このPAUSE 100のPASMが下記だ
mov __temp1, cnt
adds __temp1, _1msec
mov __temp2, #100
__L001
waitcnt __temp1, _1msec
djnz __temp2, #__L001
オーケー、もしPAUSEが出現する度にアセンブラコードを生成し...
SX/BのようにDELAY_MSという名前のシェルは下記
DELAY_MS SUB 1
DELAY_MSは1個の引数が必要だ。Propeller変数は32bitなのでそ...
SX/Bを知ってる人にはPropBASICのFUNC宣言は少し違うと思うだ...
1月にPropeller ForumメンバーがSIRCSのPropBASICへの移植に...
SIRCSオブジェクトはIRコードビットをビットカウントのように...
PropBASICは関数が返すパラメータ数を気にしない。(通常は1...
それ故、定義は下記
SIRCS_RX FUNC 0
**メインプログラム [#p892ba0d]
LED blinkerプログラム本体は大体下記のようになる
PROGRAM Start
Start:
FOR idx = 1 TO 3
LED = IsOn
DELAY_MS OnTime
LED = IsOff
DELAY_MS OffTime
NEXT
DELAY_MS 1_000
GOTO Start
PROGRAMディレクティブはユーザが作ったプログラムの始点と、...
Propellerではstart-upコードはディレクティブの指すラベルへ...
見てのとうり、コードはまったくのBASICだ。PBASICやSX/B、他...
**サブルーチンと関数の中身を作る [#p892ba0d]
サブルーチンと関数のコードはリストの最後に書くことになっ...
SUB DELAY_MS
PAUSE __param1
ENDSUB
他の言語同様にサブルーチンは別のサブルーチンをcallするこ...
SUB TX_STR
strAddr VAR __param2
strChar VAR __param3
strAddr = __param1
DO
RDBYTE strAddr, strChar
IF strChar = 0 THEN EXIT
TX_BYTE strChar
INC strAddr
LOOP
ENDSUB
SUB TX_BYTE
SEROUT TX, Baud, __param1
ENDSUB
2番目のサブルーチンはSEROUTのシェルで、最初のサブルーチン...
文字のアドレスを引数にしてTX_STRをcallするとその引数は__p...
TX_BYTEに文字を渡すのに__param1が必要なのでサブルーチン内...
新しい変数を宣言しない理由はPropellerでは全部がRAMにある...
その為、できるだけ__paramx変数を使い変数宣言を少なくして...
多分キャラクタコードを得るのにRDBYTEを使ってるコードに気...
Banner DATA “PropBASIC”, 0
関数のコードはサブルーチンコードと比較するとFUNC..ENDFUNC...
FUNC GET_SIRCS
irCode VAR __param1
irBits VAR __param2
COUNTERA NEG_DETECT, IR, 0, 1
COUNTERB FREE_RUN, 0, 0, 1
Wait_Start:
WAITPEQ IR, IR
PHSA = 0
WAITPNE IR, IR
PHSB = 0
WAITPEQ IR, IR
IF PHSA < BIT_S THEN Wait_Start
irCode = 0
irBits = 0
Check_Frame
IF PHSB > MS_044 THEN IR_Done
Wait_Bit:
IF IR = 1 THEN Check_Frame
PHSA = 0
WAITPEQ IR, IR
irCode = irCode >> 1
Measure_Bit:
IF PHSA > BIT_1 THEN
irCode = irCode | $8000_0000
ENDIF
INC irBits
IF irBits = 20 THEN IR_Done
GOTO Check_Frame
IR_Done
__temp1 = 32 – irBits
irCode = irCode >> __temp1
RETURN irCode, irBits
ENDFUNC
まったくそのまんまのコードだと思う。これはアセンブリコー...
PropBASICはSIRCSの例のようにPASMにあるWAITPEQ、WAITPNEな...
**タスクの中身を作る [#p892ba0d]
タスクは別のCogで動いてるのでその構成はサブルーチンや関数...
実際、タスクはそれ自身が1つのプログラムなのでその中でのみ...
これらの宣言やコードの全部がTASK..ENDTASKブロック内にある。
TASK SERIAL_RX
rxb VAR __param1
hPntr VAR __param2
DO
SERIN RX, Baud, rxb
RDBYTE rxHead, hPntr
WRBYTE rxBuffer(hPntr), rxb
INC hPntr
hPntr = hPntr & $3F
WRBYTE rxHead, hPntr
LOOP
ENDTASK
そのとうり、これが全部だ。タスクはCON,PIN,HUB宣言もできる...
DO..LOOPの最初でSERINを使ってバイトデータを読んでいる。-...
違いはこのタスクはそれ自身のCogで起動されシリアルデータを...
現在のヘッドポインタのデータをRDBYTEで読み出しrxBufferに...
ヘッドポインタを+1してバッファ内に収まるように$3FとANDし...
タスクをスタートするには2種類あるがたいていCOGSTARTを使う。
COGSTART SERIAL_RX
別のCogが立ち上がり準備が整うまで十分な時間は必要なので、...
PropBASICコンパイラはタスクの名前でSpinファイルも作れるの...
オーケー。シリアルデータを受信しバッファリングする方法は...
バッファからデータを取り出す関数を書いたよ。
FUNC RX_BYTE
rxh VAR __param1
rxt VAR __param2
rxchar VAR __param3
DO
RDBYTE rxHead, rxh
RDBYTE rxTail, rxt
LOOP UNTIL rxh <> rxt
RDBYTE rxBuffer(rxt), rxchar
INC rxt
rxt = rxt & $3F
WRBYTE rxTail, rxt
RETURN rxchar
ENDFUNC
最初のループでヘッドとテイルポインタの値を比較してデータ...
バッファが空だとこの値は等しく、この値が違うとバッファイ...
別のCogがシリアルバッファにデータを保存するやっかい事をや...
シリアルバッファで待つバイト数を戻す関数があるよ。
もしゼロならバッファが空なので受信データをただ待つだけのR...
FUNC RX_CHECK
head VAR __param1
tail VAR __param2
bufcnt VAR __param3
RDBYTE rxHead, head
RDBYTE rxTail, tail
IF head >= tail THEN
bufcnt = head – tail
ELSE
bufcnt = tail – head
ENDIF
RETURN bufcnt
ENDFUNC
これはバッファの先頭と最後尾間の差をリターンする。バッフ...
**誰でもアセンブラ? [#p892ba0d]
難解なアセンブラ言語から解放してくれて速いプログラムをコ...
でもそれでもアセンブラうを使うのはやっぱり便利だ。
PropBASICでは複数行ならASM..ENDASMブロック、1行なら”\”を...
**まとめよう [#p892ba0d]
ここだけで多様な機能をもつPropBASICを述べる事はできない。...
アプリケーション初期バージョンとしては本当によくできてい...
**PropBASICの将来 [#p892ba0d]
一言でいえばワクワクしているんだ。
SX/Bを使ってた人達はもちろん、初心者にとってもこんなに便...
PropBASIC1.0の機能はSX/Bのよりも少し進んでいる。
アセンブラ言語なみのの速度で走る大きなプログラムを作れるL...
ページ名: