初めてのcog廻し [Propeller]
お膳立てはそろったし、JUNK-BOXさまにご助言いただいたりで、PropellerでLEDチカチカしてみました。上のスクリーンショットはPropellerのツールのものです。
COM,VER,PUB,PUB...とセクションごとに自動的に色分けされます。
見づらいのでテキストで
COM
_clkmode = xtal1+pll16x
_xinfreq = 5_000_000
LED0 = 16
LED1 = 17
LED2 = 18
LED3 = 19
LED4 = 20
LED5 = 21
LED6 = 22
LED7 = 23
PUSHBUTTON = 15
VAR
long Stack[10]
repeat
cognew(LEDBlink(LED0, clkfreq/1),@Stack)
LEDBlink(LED1, clkfreq/10)
LEDBlink(LED2, clkfreq/10)
LEDBlink(LED3, clkfreq/10)
LEDBlink(LED4, clkfreq/10)
LEDBlink(LED5, clkfreq/10)
LEDBlink(LED6, clkfreq/10)
LEDBlink(LED7, clkfreq/10)
PUB LEDBlink(Pin, Delay)
dira[Pin]~~
! outa[Pin]
waitcnt(Delay + cnt)
COMは、共通Resourceの設定で、クロックの設定とピンの設定。
=右辺の数字はポート番号です。
VERはグローバル変数の設定。今回はcogのためのスタック領域(って受け売りです。)
PUBはCで言う関数ですね。まずcog0にロードされ、mainの方のcognewでcogを
実行したところ
再生できない場合、ダウンロードは🎥こちら
cog2個使いですね
最初のcognewで、あいているcogがLEDBlinkを実行しはじめるので
LED0が反転してウェイトして終了。
以降のLEDBlinkはcog0で逐次処理なので、1個反転して少しウェイト
して戻ってきて、次のLEDBlinkを実行してって具合でシフトみたいに
なってるんですね。
全部LEDBlinkをcognewに置き換ると、いかにも並列処理っぽくなると
思います。
by JUNK-BOX (2008-03-03 09:24)
JUNK-BOXさまこんにちは
ご指摘ありがとうございます。ワンショット動作なので変だなぁと思ってはいたのですが...。
Language Reference見てみると確かに連続指定みたいなのは無く、私の早とちりでした。
{}の代わりにインデントだったりとか、新鮮味いっぱいです。
by doggie (2008-03-03 14:37)