Docs/E2J/NV134.pdf
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
&size(20){&color(,#FFE9C8){''Spin 愛しのSpin'};};
//邦題タイトル
&size(15){''原題:'Spin Baby Spin'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:NV134.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:Spin言語についての初歩知識
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
今月はPropellerマルチコントローラの紹介をしよう。
高水準Spinプログラム言語でプログラムして同時にマルチプロ...
先月述べたように実際僕はアセンブラ言語に熟練するような仕...
いくつかのプロジェクトでお手上げになってしまった事もない。
Propellerを使えば僕でも(君にも)アセンブラを習得せずに複...
センサをモニタし処理をするデバイスがあったとしよう。
リアルタイムでデータ表示処理を行うプログラムが表側で動作...
これが今月やろうとしていることなんだ。
簡単なプログラムでポテンショメータの値を読み、その値をシ...
ポテンショメータの値を読む為にBASIC StampのRCTIME文を真似...
そしてコードを書いて表側のプログラムとは完全に独立して動...
雑談はもう十分だ、始めよう。アーカイブを解凍してrctime.sp...
このオブジェクトの肝はrctimeメソッドだ。
PUB rctime(pin, state, zofs, div, rcAddr) | rc_temp
if lookdown(pin : 0..27)
state := 0 #> state <#1
zofs #>= 0
div #>= 1
repeat
rc_temp~
outa[pin] := state
dira[pin]~
waitcnt(clkfreq / 2000 + cnt)
dira[pin]~
rc_temp := cnt
waitpne(state << pin, |< pin, 0)
rc_temp := || (cnt – rc_temp)
rc_temp := (rc_temp – zofs) #> 0
rc_temp /= div
long[rcAddr] := rc_temp
if mode == 0
quit
rctimeメソッドをpublicにしている。こうするとテスト時など...
このメソッドにはいくつか引数がある。pin(使用するI/Oピン...
ローカル変数rc_tempもある、これはターゲット変数にコピーさ...
Basic Stampのようにテストでコールしてコードをみてみよう。...
rctimeをコールするには下記のようにする:
pot.rctime(0, 1, 0, 1, @potVal)
rctimeメソッドのリターン値をコピーする代わりにターゲット...
rctimeメソッドのコードを見てみよう。ピン入力を制限してス...
それを防ぐためにlookdownで0..27を使っている。
PBASICのlookdownは1からN,lookdownn(Propellerではlookdown...
lookdownを使うことで非ゼロ値はピンが範囲内にあることを意...
If (pin => 0) and (pin =< 27)
特にlookdown(lookdownz)はリストに区切り文字のコンマを使え...
pin を評価したら次のステップは stateとzero offsetとdiviso...
これはlimit演算子で簡単に処理できる。
ここでRC測定の仕組を説明しよう。
まず、変数rc_tempをクリアしピンを出力にセットして希望の状...
220オームの抵抗と0.1uFのコンデンサを使うと充放電は110us必...
コンデンサを充電してからピンを入力にセットしてシステムカ...
状態の変化をモニタするにはwaitpneを使う。これは1つ以上の...
waitpne(target, mask, 0)
targetはI/Oピンの目的の状態、maskはPropellerの入力とANDす...
PropellerのピンをmaskとANDしてtargetと一致するとメソッド...
このプログラムでは1本のピンだけだが必要なら32本までのピン...
例えば4ビットのバイナリスイッチがA3..A0に接続されていた場...
waitpne(%1010, %1111, 0)
4本全部A3..A0が比較に使われるので、%1111をmaskとして使う。
rc_timeメソッドでは1本のピンのみを監視するので、コンデン...
もし、rc_timeがI/OピンA3を使っていたら、maskは%1000となる。
オーケー、ピンの状態が変化したら、充放電サイクルの期間に...
絶対値(||)はリターン値を正にする。(bit31がセットされると...
結果はターゲットアドレスにLongで保存される。
これはBASICのPOKEをつかってるような感じだ。
ターゲットアドレスはメインRAMであることに注意してくれ。
このプログラムはrctimeメソッドを別のCogに実行させているか...
けれどもその前に 全てのコード全体がrepeat loopで囲まれて...
rctimeがコールされる時、グローバル変数modeがゼロにされて...
rctimeメソッドの最後でその変数はチェックされ、もしゼロな...
裏側でメソッドを走らせてターゲット変数を定期的にアップデ...
rctimeオブジェクトのスタートメソッドの詳細
PUB start(pin, state, zofs, div, rcAddr) : okay
stop
mode := 0
okay := cogon := (cog :=
cognew(rctime(pin, state, zofs, div, rcAddr) ,
@stack)) > 0
if okay
mode := 1
startメソッドが最初にstopメソッドをコールしているのは奇妙...
キチンとしなければならない事はオブジェクト(この場合はpot...
もし、リスタートするならそのオブジェクトはまず止めなけれ...
もし、いくつかのオブジェクトを裏側で使うなら対応するいく...
そして、他に影響をあたえずに止めたりリスタートできる。
次のステップはmode変数をクリアすることだ。実際には動作し...
未使用のCogがあればcognewでrctimeをそのCogで起動できる。...
一旦rctimeがアップし起動したらメソッドが稼働中を保持する...
裏側のプロセスを動作させるのにアセンブラを習得する必要は...
自由に使える8個のCogで想像できるどんな事も多くの事が新し...
僕はSpinに蹴飛ばされながら、ある種の感情をもって睡眠も惜...
その感情というのは僕が12年間BASIC Stampのプログラミングを...
オーケー、rctimeの利点を得る表側ののプログラム(トップオ...
CON
_clkmode = xtal1 + pll16x
xinfreq = 5000_000
LCD_PIN = 0
LCD_BAUD = 19_200
LCD_LINES = 2
POT_PIN = 1
VAR
long potVal
OBJ
lcd : “debug_lcd”
pot : “rctime”
PUB main
if lcd.start( LCD_PIN, LCD_BAUD, LCD_LINES)
lcd.cursor(0)
lcd.cls
lcd.backlight(true)
if pot.start(POT_PIN, 1, 1520, 642, @potVal)
repeat
lcd.home
lcd.def(potVal, 5)
waitcnt(clkfreq / 5 + cnt)
上記は全く簡単なコードだ。表示デバイスにParallaxシリアルL...
SEETON BPI-216表示デバイスを使っても問題はない。
debug_lcdと同じメソッドがあるオブジェクトdebug_BPI-216を...
変更点はボーレートが9600とlcdのオブジェクトファイルだ。他...
pot.startメソッドの後にあるrepeatループをチェックしてみよ...
pot.rctimeメソッドを使ってないことに気が付いたと思う。rct...
Rctimeが更新している間にメインプログラムからpotValを読ん...
Propellerは一度に1個のCogだけがメインシステムRAMにアクセ...
このセクションを要約する前にzofs(1520)とdiv(642)の引数に...
この値は経験的に3つのステップに由来する
一番目のステップは”0”(zofs)と”1”(div)でpot.startを実行す...
ポットをゼロポジションに回した時pot.startは1520をリターン...
これはどこからきたのか?小さな放電遅延時間はは220オームの...
二番めはzofsに1520を代入してpot.startをもう一度実行する
ポットの位置は先程と同じはずなので今度はポットを最大まで...
僕の場合、その値は大体64125だった(ブレッドボードのノイズ...
ポットを1〜99で読みたいのでdivisorに642を使った
3番目はこれをチェックすることだ。ビンゴ!ポットの読み取...
Stacking It All Up
オーケー、今月はまとめる前に話さなければならない技術細部...
SpinプログラムがCogで動作している時それは用意されたstack...
かつてマルチスレッドのデバイスの仕事をしていた時、新しい...
なぜスタックを大きくしないのかそしてそなぜそれを怠るのか?
それはコードスペースの浪費だからだ。メモリは賢く使うべきだ
良いニュースがある:PropellerのCogの一つを使って別のオブ...
でもこれを利用することはできる。
これを使うとmulti-cogプロジェクトの開発を始めるのが楽にな...
ファイルに含まれているのはstack_monitor.spinというオブジ...
これはPhil Pilgrimが作った。長い間Parallaxの友人であるPhi...
stack_monitorは1個のCogで動作するオブジェクトだ。
これは別のオブジェクトがスタックとして使う一群のメモリを...
それはスタックを使う、オブジェクトのstartメソッドで最初に...
そしてLEDにつないでいるMSB〜LSBのピンにスタック使用出力を...
rctimeオブジェクトのstartメソッドの最初の行に配置
stackmon.start(@stack, 32, 23, 16)
これは32の初期サイズを持つスタックをコールした配列を指定...
僕はPropellerDemoBoardを使っているのでLEDsはピンA23..A16...
さて、トップオブジェクトへ戻っても実行しよう
僕の場合、LEDsはピンA19..A16が点灯している、だからスタッ...
オーケー、動作したかい?stack_monitor.startメソッドはター...
PRI monitor(addr, size, ledMsb, ledLsb) | idx, used
outa[ledMsb..ledLsb]~
dira[ledMsb..ledLsb]~~
repeat
used := 0
repeat idx from addr to addr + size * 4 step 4
used -= long[idx] <> FILLER
outa[ledMsb..ledLsb] := used
メソッドは実際全く小さい。
これはLEDをクリアしてスタートする、そして無限ループに入る...
ループ内で使われる変数はクリアされ、それからチェックする...
減算してるだろう?実際オブジェクトのスタックで使うlongsの...
なぜこれが動作するのか:式の右側(-=の後ろ)はtrueかfalse...
大事な事はSpinではtrueは-1と定義されていることだ。だから-...
オーケー、これで充分だと思う。
Propellerと3ヶ月の勉強で充分にわかったと思う。自分自身が...
これはPBASICから出発する大きなチャンスだ、そのパワー全部...
当然その使い方を学ばなければならない。
もし自分では実現出来ない特殊なアイデアがあれば僕にそれを...
そこから別のものを作るかもしれない。
次回まで楽しくぶん回そう!
終了行:
&size(20){&color(,#FFE9C8){''Spin 愛しのSpin'};};
//邦題タイトル
&size(15){''原題:'Spin Baby Spin'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:NV134.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:Spin言語についての初歩知識
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
今月はPropellerマルチコントローラの紹介をしよう。
高水準Spinプログラム言語でプログラムして同時にマルチプロ...
先月述べたように実際僕はアセンブラ言語に熟練するような仕...
いくつかのプロジェクトでお手上げになってしまった事もない。
Propellerを使えば僕でも(君にも)アセンブラを習得せずに複...
センサをモニタし処理をするデバイスがあったとしよう。
リアルタイムでデータ表示処理を行うプログラムが表側で動作...
これが今月やろうとしていることなんだ。
簡単なプログラムでポテンショメータの値を読み、その値をシ...
ポテンショメータの値を読む為にBASIC StampのRCTIME文を真似...
そしてコードを書いて表側のプログラムとは完全に独立して動...
雑談はもう十分だ、始めよう。アーカイブを解凍してrctime.sp...
このオブジェクトの肝はrctimeメソッドだ。
PUB rctime(pin, state, zofs, div, rcAddr) | rc_temp
if lookdown(pin : 0..27)
state := 0 #> state <#1
zofs #>= 0
div #>= 1
repeat
rc_temp~
outa[pin] := state
dira[pin]~
waitcnt(clkfreq / 2000 + cnt)
dira[pin]~
rc_temp := cnt
waitpne(state << pin, |< pin, 0)
rc_temp := || (cnt – rc_temp)
rc_temp := (rc_temp – zofs) #> 0
rc_temp /= div
long[rcAddr] := rc_temp
if mode == 0
quit
rctimeメソッドをpublicにしている。こうするとテスト時など...
このメソッドにはいくつか引数がある。pin(使用するI/Oピン...
ローカル変数rc_tempもある、これはターゲット変数にコピーさ...
Basic Stampのようにテストでコールしてコードをみてみよう。...
rctimeをコールするには下記のようにする:
pot.rctime(0, 1, 0, 1, @potVal)
rctimeメソッドのリターン値をコピーする代わりにターゲット...
rctimeメソッドのコードを見てみよう。ピン入力を制限してス...
それを防ぐためにlookdownで0..27を使っている。
PBASICのlookdownは1からN,lookdownn(Propellerではlookdown...
lookdownを使うことで非ゼロ値はピンが範囲内にあることを意...
If (pin => 0) and (pin =< 27)
特にlookdown(lookdownz)はリストに区切り文字のコンマを使え...
pin を評価したら次のステップは stateとzero offsetとdiviso...
これはlimit演算子で簡単に処理できる。
ここでRC測定の仕組を説明しよう。
まず、変数rc_tempをクリアしピンを出力にセットして希望の状...
220オームの抵抗と0.1uFのコンデンサを使うと充放電は110us必...
コンデンサを充電してからピンを入力にセットしてシステムカ...
状態の変化をモニタするにはwaitpneを使う。これは1つ以上の...
waitpne(target, mask, 0)
targetはI/Oピンの目的の状態、maskはPropellerの入力とANDす...
PropellerのピンをmaskとANDしてtargetと一致するとメソッド...
このプログラムでは1本のピンだけだが必要なら32本までのピン...
例えば4ビットのバイナリスイッチがA3..A0に接続されていた場...
waitpne(%1010, %1111, 0)
4本全部A3..A0が比較に使われるので、%1111をmaskとして使う。
rc_timeメソッドでは1本のピンのみを監視するので、コンデン...
もし、rc_timeがI/OピンA3を使っていたら、maskは%1000となる。
オーケー、ピンの状態が変化したら、充放電サイクルの期間に...
絶対値(||)はリターン値を正にする。(bit31がセットされると...
結果はターゲットアドレスにLongで保存される。
これはBASICのPOKEをつかってるような感じだ。
ターゲットアドレスはメインRAMであることに注意してくれ。
このプログラムはrctimeメソッドを別のCogに実行させているか...
けれどもその前に 全てのコード全体がrepeat loopで囲まれて...
rctimeがコールされる時、グローバル変数modeがゼロにされて...
rctimeメソッドの最後でその変数はチェックされ、もしゼロな...
裏側でメソッドを走らせてターゲット変数を定期的にアップデ...
rctimeオブジェクトのスタートメソッドの詳細
PUB start(pin, state, zofs, div, rcAddr) : okay
stop
mode := 0
okay := cogon := (cog :=
cognew(rctime(pin, state, zofs, div, rcAddr) ,
@stack)) > 0
if okay
mode := 1
startメソッドが最初にstopメソッドをコールしているのは奇妙...
キチンとしなければならない事はオブジェクト(この場合はpot...
もし、リスタートするならそのオブジェクトはまず止めなけれ...
もし、いくつかのオブジェクトを裏側で使うなら対応するいく...
そして、他に影響をあたえずに止めたりリスタートできる。
次のステップはmode変数をクリアすることだ。実際には動作し...
未使用のCogがあればcognewでrctimeをそのCogで起動できる。...
一旦rctimeがアップし起動したらメソッドが稼働中を保持する...
裏側のプロセスを動作させるのにアセンブラを習得する必要は...
自由に使える8個のCogで想像できるどんな事も多くの事が新し...
僕はSpinに蹴飛ばされながら、ある種の感情をもって睡眠も惜...
その感情というのは僕が12年間BASIC Stampのプログラミングを...
オーケー、rctimeの利点を得る表側ののプログラム(トップオ...
CON
_clkmode = xtal1 + pll16x
xinfreq = 5000_000
LCD_PIN = 0
LCD_BAUD = 19_200
LCD_LINES = 2
POT_PIN = 1
VAR
long potVal
OBJ
lcd : “debug_lcd”
pot : “rctime”
PUB main
if lcd.start( LCD_PIN, LCD_BAUD, LCD_LINES)
lcd.cursor(0)
lcd.cls
lcd.backlight(true)
if pot.start(POT_PIN, 1, 1520, 642, @potVal)
repeat
lcd.home
lcd.def(potVal, 5)
waitcnt(clkfreq / 5 + cnt)
上記は全く簡単なコードだ。表示デバイスにParallaxシリアルL...
SEETON BPI-216表示デバイスを使っても問題はない。
debug_lcdと同じメソッドがあるオブジェクトdebug_BPI-216を...
変更点はボーレートが9600とlcdのオブジェクトファイルだ。他...
pot.startメソッドの後にあるrepeatループをチェックしてみよ...
pot.rctimeメソッドを使ってないことに気が付いたと思う。rct...
Rctimeが更新している間にメインプログラムからpotValを読ん...
Propellerは一度に1個のCogだけがメインシステムRAMにアクセ...
このセクションを要約する前にzofs(1520)とdiv(642)の引数に...
この値は経験的に3つのステップに由来する
一番目のステップは”0”(zofs)と”1”(div)でpot.startを実行す...
ポットをゼロポジションに回した時pot.startは1520をリターン...
これはどこからきたのか?小さな放電遅延時間はは220オームの...
二番めはzofsに1520を代入してpot.startをもう一度実行する
ポットの位置は先程と同じはずなので今度はポットを最大まで...
僕の場合、その値は大体64125だった(ブレッドボードのノイズ...
ポットを1〜99で読みたいのでdivisorに642を使った
3番目はこれをチェックすることだ。ビンゴ!ポットの読み取...
Stacking It All Up
オーケー、今月はまとめる前に話さなければならない技術細部...
SpinプログラムがCogで動作している時それは用意されたstack...
かつてマルチスレッドのデバイスの仕事をしていた時、新しい...
なぜスタックを大きくしないのかそしてそなぜそれを怠るのか?
それはコードスペースの浪費だからだ。メモリは賢く使うべきだ
良いニュースがある:PropellerのCogの一つを使って別のオブ...
でもこれを利用することはできる。
これを使うとmulti-cogプロジェクトの開発を始めるのが楽にな...
ファイルに含まれているのはstack_monitor.spinというオブジ...
これはPhil Pilgrimが作った。長い間Parallaxの友人であるPhi...
stack_monitorは1個のCogで動作するオブジェクトだ。
これは別のオブジェクトがスタックとして使う一群のメモリを...
それはスタックを使う、オブジェクトのstartメソッドで最初に...
そしてLEDにつないでいるMSB〜LSBのピンにスタック使用出力を...
rctimeオブジェクトのstartメソッドの最初の行に配置
stackmon.start(@stack, 32, 23, 16)
これは32の初期サイズを持つスタックをコールした配列を指定...
僕はPropellerDemoBoardを使っているのでLEDsはピンA23..A16...
さて、トップオブジェクトへ戻っても実行しよう
僕の場合、LEDsはピンA19..A16が点灯している、だからスタッ...
オーケー、動作したかい?stack_monitor.startメソッドはター...
PRI monitor(addr, size, ledMsb, ledLsb) | idx, used
outa[ledMsb..ledLsb]~
dira[ledMsb..ledLsb]~~
repeat
used := 0
repeat idx from addr to addr + size * 4 step 4
used -= long[idx] <> FILLER
outa[ledMsb..ledLsb] := used
メソッドは実際全く小さい。
これはLEDをクリアしてスタートする、そして無限ループに入る...
ループ内で使われる変数はクリアされ、それからチェックする...
減算してるだろう?実際オブジェクトのスタックで使うlongsの...
なぜこれが動作するのか:式の右側(-=の後ろ)はtrueかfalse...
大事な事はSpinではtrueは-1と定義されていることだ。だから-...
オーケー、これで充分だと思う。
Propellerと3ヶ月の勉強で充分にわかったと思う。自分自身が...
これはPBASICから出発する大きなチャンスだ、そのパワー全部...
当然その使い方を学ばなければならない。
もし自分では実現出来ない特殊なアイデアがあれば僕にそれを...
そこから別のものを作るかもしれない。
次回まで楽しくぶん回そう!
ページ名: