Docs/E2J/nvp4.pdf
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
&size(20){&color(,#FFE9C8){''SIRCS,Propeller流''};};
//邦題タイトル
&size(15){''原題:'SIRCS,Propeller Style!'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:nvp4.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:SIRCSしたい人
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
By Jon Williams
Nuts & Volts Magazine, コラム#4 2010年1月
僕にはカメラのpan/tilt制御をする周辺機器の設計をしているL...
LouとSX48を使って製品の為の電子回路を設計したんだ。
SPINはSX/Bより使い易いと考えていたので僕は次世代用の機器...
Louはすぐに採用を決めて簡単なTVリモートでpan/tilt制御をで...
「オーケー、できるよ」と叫んでしまったんだ、でも本当はこ...
(大体1、2時間ぐらい)
PropellerでSIRCSの送受信ができてよかった。
**SIRCSプロトコル [#p892ba0d]
SIRCS(Sony IR Control System)プロトコルを知らない人の為に...
SIRCSとはIR(赤外線)で送信されるパルス幅変調信号のことだ...
SIRCSシステムの受信側の復変調素子はFigure1の様にactive-L...
SIRCS信号列はスタートビットが2.4msのパルス幅で、これは他...
信号の全体(フレームと呼ばれる)は45ms以内に送信されてい...
でも僕のSonyカメラはコードを5回送信していたよ。
違う機器には違う長さのコードが使われている。
僕の経験ではTVコードは12ビットだけれどDVDプレーやのような...
IRコードは二つの要素に分かれる:デバイスコードとキーコー...
12ビットシステムではデバイスコードは5ビット、キーコード...
20ビットシステムではそれぞれ8ビット、12ビットになって...
キーコードが20ビットシステムで大きくなってるのはこのタイ...
**PropellerでSIRCSをデコード [#p892ba0d]
Propellerを使って良い点は1個のCogでSIRCSをデコードできる...
だから準備ができていない時に入ってくる信号の事やユーザが...
(そもそもPropellerには割り込み自体存在しないが)
DMX512プロジェクトでコードを簡単にする為に各Cog内で多目的...
rxsircs mov ctra, NEG_DETECT
mov frqa, #1
mov ctrb, FREE_RUN
mov frqb, #1
waitok rdlong tmp1, okpntr wz
if_nz jmp #waitok
waitstart waitpeq irmask, irmask
mov phsa, #0
waitpne irmask, irmask
mov phsb, #0
waitpeq irmask, irmask
cmp START_BIT, phsa wc
if_nc jmp #waitstart
上記は2個のカウンターを使用している。CounterAは入力パルス...
zフラグが”1”の時、プログラム実行はwaitstartへと進む。
君の推測どうり、ここで2.4msのスタートビットを待つ。
この部分の最初でwaitpeqを使って入力ピンをマスクしてIR入力...
入力ピンのラインがhighの時にPHSAをクリアしwaitpneでライン...
ラインがlowになった時PHSBをクリアするのはなぜか?
この時にスタートビットの立ち下がりを検出したのでフレーム...
もう一度ラインがhighに戻ったらcmpでビット巾をテストして、...
スタートビットを検出したら次のステップはdevice/keyコード...
mov irwork, #0
mov bits,#0
checkframe cmp MS_044, phsb wc
if_c jmp #irdone
waitbit test irmask, ina wz
if_nz jmp #checkframe
measurebit mov phsa, #0
waitpeq irmask, irmask
cmp ONE_BIT, phsa wc
rcr irwork, #1
add bits, #1
cmp bits, #20 wc
if_b jmp #checkframe
irdone mov tmp1, #32
sub tmp1, bits
shr irwork, tmp1
report wrlong irwork, codepntr
wrlong bits, bitspntr
wrlong DONE, okpntr
jmp #waitok
デコーダプログラムはそれが何番目のデータかわからないので...
これらの値は呼出し側で使用される。
妙な配置の様に思えるが、ビット受信ループのトップ(checkfra...
僕は45msフレームと思われる期間をテストするのに44mseconds...
これは20ビットコードのビット全部が”1”だとしても送信のスタ...
もしフレームがまだアクティブなら新しいビット(入力ライン...
一旦入力ラインがlowになったら新しいビットの為にPHSAをクリ...
新しく得たビット巾をビット”1”の時間と比較して結果をキャリ...
20ビット受信するかフレームタイマーが44msecondsになったら...
ビット数を32(Long)から減算することにより入力ビット列の結...
一つのコマンドでどんなビット数の値でもシフトできるのがPAS...
最後にirworkにある値と受信ビット数はHubに書き戻され、フラ...
フラグがfalseにセットされると呼出し側がtrueにセットするま...
**SIRCS”Sniffer” [#p892ba0d]
1年前SXベースのSIRCS"Sniffer”プログラムを作成して、僕の家...
コードは本当に簡単だ。
上記のSIRCS受信オブジェクトに検出したSIRCSコードをターミ...
コードは下記
PUB main | code, bc
ir.init(0)
term.init(30, 115_200)
waitcnt(clkfreq / 1_000 + cnt)
term.str(string(CLS, “SIRCS Sniffer”, CR, CR))
repeat
code := ir.getir
bc := ir.bitcount
case bc
12:
term.str(string(“12 :: “))
term.bin(code >> 7, 5)
term.tx(“.”)
Term.bin(code, 7)
20:
term.str(string(“20 :: “))
term.bin(code >> 12, 8)
term.tx(“.”)
Term.bin(code, 12)
other:
if bc < 10
term.tx(“0”)
term.dec(bc)
term.bin(string(“ :: “))
Term.bin(code, 32)
term.tx(CR)
waitcnt(clkfreq / 4 + cnt)
上記のメインループでIRオブジェクトの.getirメソッドを呼び...
ここで有効なビット数を得る為に.bitcount()メソッドを使う。
ビット列は画面で見えるようにしたいので出力部はビット数と...
おかしなビット数を受け取ったら(一度もなかったが)case文...
このプログラムのハードウェアは簡単だ
Figure2は以前に使ったPN4602Nデコーダーだ。
2.2kの抵抗を付けてPropellerのI/Oピン保護ダイオードに流れ...
(このダイオードはデコーダー出力が5Vの時に働く)
PropellerDemoBoardに接続したのがFigure3でFigur4はデバイス...
上の2つはTV/DVDのチャンネルのup/downで下の2つはボリューム...
君も色々実験したら、SIRCSを使っている同じブランドの製品だ...
これを拡張したら、特定のブランドのリモートに対応したプロ...
**PropellerでSIRCSを送信 [#p892ba0d]
Sony DSLRを制御するにはSIRCSの送信をするプログラム必要だ。
SXを使って挑戦したことはPropellerでは簡単なことだ。特にIR...
Figur5はPropellerとIR LEDの接続図だ。アノードを3.3Vに繋い...
なぜPropellerでは1本なのか?何が変わったのか?
Propelerのアーキテクチャでは出力ピンをhighにできる素子がC...
各cogは出力ピンをhighにすることができる4つの素子(出力レ...
カソードピンに対してカウンターをNCOモードにセットすること...
コード解析の前に一仕事あるんだ。カウンターをNCOモードで使...
NCOモードでFRQx設定値の公式は以下:
FRQx =Hz X 2^32 / System Frequency
僕はPropellerプロジェクトを80MHzで作っているのでIRリモー...
オーケー、そうしよう。最初にIRカソードピンを出力にセット...
txsircs or outa, ircath
or dira, ircath
mov frqa, modfreq
mov ctra, modctrl
waitcmd rdlong frcount, fcpntr wz
if_z jmp #waitcmd
rdlong bitcount, bcpntr
rdlong code, irpntr
送信はフレーム数、ビット数、コードを持つHub変数を読み出し...
WaitcmdでSIRCSフレーム数がHubから読み込まれゼロより大きか...
startframe mov bcount, txbitcount
mov testmask, #1
mov frametimer, MS_45
add frametimer, cnt
txstart mov bittimer, BIT_START
call #txbit
普通1フレーム以上を送信するのでbitcountをコピーしてビッ...
フレームタイミングはframtimerと言う名の変数に45ms(システ...
全部のビット送信が終わった後waitcntでこの値を使う。
SIRCSフレームの最初の要素は2.4msのスタートビットだ。これ...
以前のプロジェクトでPASMコードはサブルーチンを使わなかっ...
txbit add bittimer, cnt
andn outa, ircath
waitcnt bittimer, #0
or outa, ircath
txpad mov bittimer, BIT_PRO
add bittimer, cnt
waitcnt bittimer, #0
txbit_ret ret
bittimerをシステムカウンタ(cnt)に同期させてカソードピンを...
最後に重要な事をひとつ話そう。サブルーチンの最後の行でtxb...
PropellerのアーキテクチャとアセンブラではPASMサブルーチン...
サブルーチンのエントリーが複数あったらどのようにしたらい...
問題ない。下記のように複数行に_retラベルを付ける事ができ...
name1_ret
name2_ret ret
ret文は最後の行のみに置けることに注意してくれ。
オーケー、スタートビットの送信が終わったらdevice/keyコー...
これはbcountで制御する簡単なループで処理する。
txcmd test txcode, mask wz
if_z mov bittimer, BIT_0
if_nz mov bittimer, BIT_1
call #txbit
shl mask, #1
checkdone djnz bcount, #txcmd
PASMで好きなところは色々あるけれどその中の一つが条件文だ...
testの結果でzフラグが変化する。
ビットがゼロの時、zフラグはtrueとなりビットがゼロでない時...
次の2行は条件文でbittimerを特定の値に設定している。if_zな...
ここで”bit 1”の時この行はどうなるのか不思議に思う人がいる...
条件に逢わない時これはnopに置き換えられるので何もしない。
Txbitをコールする場所のタイミングで、次のビットの為にmask...
もし、送信ビットが残っていればtxcmdへジャンプする。
全ビットが送信されたらwaitframe以降の45msのフレームが終了...
waitframe waitcnt frametimer, #0
djnz frames, #startframe
txdone wrlong ZERO, fcpntr
jmp #waitcmd
最後のステップはフレーム数を保存しているHub変数にゼロを書...
これでPropellerを使ってSony SIRCSコードの送受信ができた。...
“sniffer”プログラムでチャンネルup/downのキーコードを確認...
ちょっと楽しいかい?
友達がぼーっとしている時、慎重に仕掛けをしてデモボードのI...
エレクトロニクスが好きな連中は時々技術を使ったいたずらを...
僕だよ!
次回までにPropellerをぶん回して人気者になって楽しもう
Jon Williams
jwilliams@efx-tex.com
Parallax,Inc
www.parallax.com
終了行:
&size(20){&color(,#FFE9C8){''SIRCS,Propeller流''};};
//邦題タイトル
&size(15){''原題:'SIRCS,Propeller Style!'};
//洋題タイトル
-----
状態:''この文書の翻訳作業は完了しています''
//もしくは''この文書の翻訳作業は完了しています''
原文:nvp4.pdf
//原文へのリンクなど
翻訳者:caskaz
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue
対象読者:SIRCSしたい人
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents
//自動的に目次が生成されます
//最初のページ製作者は以下目次のタイトルを先に翻訳してお...
By Jon Williams
Nuts & Volts Magazine, コラム#4 2010年1月
僕にはカメラのpan/tilt制御をする周辺機器の設計をしているL...
LouとSX48を使って製品の為の電子回路を設計したんだ。
SPINはSX/Bより使い易いと考えていたので僕は次世代用の機器...
Louはすぐに採用を決めて簡単なTVリモートでpan/tilt制御をで...
「オーケー、できるよ」と叫んでしまったんだ、でも本当はこ...
(大体1、2時間ぐらい)
PropellerでSIRCSの送受信ができてよかった。
**SIRCSプロトコル [#p892ba0d]
SIRCS(Sony IR Control System)プロトコルを知らない人の為に...
SIRCSとはIR(赤外線)で送信されるパルス幅変調信号のことだ...
SIRCSシステムの受信側の復変調素子はFigure1の様にactive-L...
SIRCS信号列はスタートビットが2.4msのパルス幅で、これは他...
信号の全体(フレームと呼ばれる)は45ms以内に送信されてい...
でも僕のSonyカメラはコードを5回送信していたよ。
違う機器には違う長さのコードが使われている。
僕の経験ではTVコードは12ビットだけれどDVDプレーやのような...
IRコードは二つの要素に分かれる:デバイスコードとキーコー...
12ビットシステムではデバイスコードは5ビット、キーコード...
20ビットシステムではそれぞれ8ビット、12ビットになって...
キーコードが20ビットシステムで大きくなってるのはこのタイ...
**PropellerでSIRCSをデコード [#p892ba0d]
Propellerを使って良い点は1個のCogでSIRCSをデコードできる...
だから準備ができていない時に入ってくる信号の事やユーザが...
(そもそもPropellerには割り込み自体存在しないが)
DMX512プロジェクトでコードを簡単にする為に各Cog内で多目的...
rxsircs mov ctra, NEG_DETECT
mov frqa, #1
mov ctrb, FREE_RUN
mov frqb, #1
waitok rdlong tmp1, okpntr wz
if_nz jmp #waitok
waitstart waitpeq irmask, irmask
mov phsa, #0
waitpne irmask, irmask
mov phsb, #0
waitpeq irmask, irmask
cmp START_BIT, phsa wc
if_nc jmp #waitstart
上記は2個のカウンターを使用している。CounterAは入力パルス...
zフラグが”1”の時、プログラム実行はwaitstartへと進む。
君の推測どうり、ここで2.4msのスタートビットを待つ。
この部分の最初でwaitpeqを使って入力ピンをマスクしてIR入力...
入力ピンのラインがhighの時にPHSAをクリアしwaitpneでライン...
ラインがlowになった時PHSBをクリアするのはなぜか?
この時にスタートビットの立ち下がりを検出したのでフレーム...
もう一度ラインがhighに戻ったらcmpでビット巾をテストして、...
スタートビットを検出したら次のステップはdevice/keyコード...
mov irwork, #0
mov bits,#0
checkframe cmp MS_044, phsb wc
if_c jmp #irdone
waitbit test irmask, ina wz
if_nz jmp #checkframe
measurebit mov phsa, #0
waitpeq irmask, irmask
cmp ONE_BIT, phsa wc
rcr irwork, #1
add bits, #1
cmp bits, #20 wc
if_b jmp #checkframe
irdone mov tmp1, #32
sub tmp1, bits
shr irwork, tmp1
report wrlong irwork, codepntr
wrlong bits, bitspntr
wrlong DONE, okpntr
jmp #waitok
デコーダプログラムはそれが何番目のデータかわからないので...
これらの値は呼出し側で使用される。
妙な配置の様に思えるが、ビット受信ループのトップ(checkfra...
僕は45msフレームと思われる期間をテストするのに44mseconds...
これは20ビットコードのビット全部が”1”だとしても送信のスタ...
もしフレームがまだアクティブなら新しいビット(入力ライン...
一旦入力ラインがlowになったら新しいビットの為にPHSAをクリ...
新しく得たビット巾をビット”1”の時間と比較して結果をキャリ...
20ビット受信するかフレームタイマーが44msecondsになったら...
ビット数を32(Long)から減算することにより入力ビット列の結...
一つのコマンドでどんなビット数の値でもシフトできるのがPAS...
最後にirworkにある値と受信ビット数はHubに書き戻され、フラ...
フラグがfalseにセットされると呼出し側がtrueにセットするま...
**SIRCS”Sniffer” [#p892ba0d]
1年前SXベースのSIRCS"Sniffer”プログラムを作成して、僕の家...
コードは本当に簡単だ。
上記のSIRCS受信オブジェクトに検出したSIRCSコードをターミ...
コードは下記
PUB main | code, bc
ir.init(0)
term.init(30, 115_200)
waitcnt(clkfreq / 1_000 + cnt)
term.str(string(CLS, “SIRCS Sniffer”, CR, CR))
repeat
code := ir.getir
bc := ir.bitcount
case bc
12:
term.str(string(“12 :: “))
term.bin(code >> 7, 5)
term.tx(“.”)
Term.bin(code, 7)
20:
term.str(string(“20 :: “))
term.bin(code >> 12, 8)
term.tx(“.”)
Term.bin(code, 12)
other:
if bc < 10
term.tx(“0”)
term.dec(bc)
term.bin(string(“ :: “))
Term.bin(code, 32)
term.tx(CR)
waitcnt(clkfreq / 4 + cnt)
上記のメインループでIRオブジェクトの.getirメソッドを呼び...
ここで有効なビット数を得る為に.bitcount()メソッドを使う。
ビット列は画面で見えるようにしたいので出力部はビット数と...
おかしなビット数を受け取ったら(一度もなかったが)case文...
このプログラムのハードウェアは簡単だ
Figure2は以前に使ったPN4602Nデコーダーだ。
2.2kの抵抗を付けてPropellerのI/Oピン保護ダイオードに流れ...
(このダイオードはデコーダー出力が5Vの時に働く)
PropellerDemoBoardに接続したのがFigure3でFigur4はデバイス...
上の2つはTV/DVDのチャンネルのup/downで下の2つはボリューム...
君も色々実験したら、SIRCSを使っている同じブランドの製品だ...
これを拡張したら、特定のブランドのリモートに対応したプロ...
**PropellerでSIRCSを送信 [#p892ba0d]
Sony DSLRを制御するにはSIRCSの送信をするプログラム必要だ。
SXを使って挑戦したことはPropellerでは簡単なことだ。特にIR...
Figur5はPropellerとIR LEDの接続図だ。アノードを3.3Vに繋い...
なぜPropellerでは1本なのか?何が変わったのか?
Propelerのアーキテクチャでは出力ピンをhighにできる素子がC...
各cogは出力ピンをhighにすることができる4つの素子(出力レ...
カソードピンに対してカウンターをNCOモードにセットすること...
コード解析の前に一仕事あるんだ。カウンターをNCOモードで使...
NCOモードでFRQx設定値の公式は以下:
FRQx =Hz X 2^32 / System Frequency
僕はPropellerプロジェクトを80MHzで作っているのでIRリモー...
オーケー、そうしよう。最初にIRカソードピンを出力にセット...
txsircs or outa, ircath
or dira, ircath
mov frqa, modfreq
mov ctra, modctrl
waitcmd rdlong frcount, fcpntr wz
if_z jmp #waitcmd
rdlong bitcount, bcpntr
rdlong code, irpntr
送信はフレーム数、ビット数、コードを持つHub変数を読み出し...
WaitcmdでSIRCSフレーム数がHubから読み込まれゼロより大きか...
startframe mov bcount, txbitcount
mov testmask, #1
mov frametimer, MS_45
add frametimer, cnt
txstart mov bittimer, BIT_START
call #txbit
普通1フレーム以上を送信するのでbitcountをコピーしてビッ...
フレームタイミングはframtimerと言う名の変数に45ms(システ...
全部のビット送信が終わった後waitcntでこの値を使う。
SIRCSフレームの最初の要素は2.4msのスタートビットだ。これ...
以前のプロジェクトでPASMコードはサブルーチンを使わなかっ...
txbit add bittimer, cnt
andn outa, ircath
waitcnt bittimer, #0
or outa, ircath
txpad mov bittimer, BIT_PRO
add bittimer, cnt
waitcnt bittimer, #0
txbit_ret ret
bittimerをシステムカウンタ(cnt)に同期させてカソードピンを...
最後に重要な事をひとつ話そう。サブルーチンの最後の行でtxb...
PropellerのアーキテクチャとアセンブラではPASMサブルーチン...
サブルーチンのエントリーが複数あったらどのようにしたらい...
問題ない。下記のように複数行に_retラベルを付ける事ができ...
name1_ret
name2_ret ret
ret文は最後の行のみに置けることに注意してくれ。
オーケー、スタートビットの送信が終わったらdevice/keyコー...
これはbcountで制御する簡単なループで処理する。
txcmd test txcode, mask wz
if_z mov bittimer, BIT_0
if_nz mov bittimer, BIT_1
call #txbit
shl mask, #1
checkdone djnz bcount, #txcmd
PASMで好きなところは色々あるけれどその中の一つが条件文だ...
testの結果でzフラグが変化する。
ビットがゼロの時、zフラグはtrueとなりビットがゼロでない時...
次の2行は条件文でbittimerを特定の値に設定している。if_zな...
ここで”bit 1”の時この行はどうなるのか不思議に思う人がいる...
条件に逢わない時これはnopに置き換えられるので何もしない。
Txbitをコールする場所のタイミングで、次のビットの為にmask...
もし、送信ビットが残っていればtxcmdへジャンプする。
全ビットが送信されたらwaitframe以降の45msのフレームが終了...
waitframe waitcnt frametimer, #0
djnz frames, #startframe
txdone wrlong ZERO, fcpntr
jmp #waitcmd
最後のステップはフレーム数を保存しているHub変数にゼロを書...
これでPropellerを使ってSony SIRCSコードの送受信ができた。...
“sniffer”プログラムでチャンネルup/downのキーコードを確認...
ちょっと楽しいかい?
友達がぼーっとしている時、慎重に仕掛けをしてデモボードのI...
エレクトロニクスが好きな連中は時々技術を使ったいたずらを...
僕だよ!
次回までにPropellerをぶん回して人気者になって楽しもう
Jon Williams
jwilliams@efx-tex.com
Parallax,Inc
www.parallax.com
ページ名: