福野泰介の一日一創 - create every day

マシン語で150倍速!フルカラーLED「APA102C」がお土産のゲーム機を作ろう福井高専公開講座

2018/09/01
#IchigoJam #sabae #kosen 

未来の高専生に会えた、福井高専の公開講座。テーマは「ゲーム機を作ろう」

できあがったゲーム機!
ブレッドボードにタクトスイッチを2つ、LED1つ、サウンダーを搭載し、改造かわくだりゲームを作りました!


中学生向けの2時間の講座、エルチカゲームからかわくだりゲームの基本コースに加え、ブレッドボードとフルカラーLEDを扱う高専スペシャル!(資料、ゲーム機を作ろうPDF


コントローラーにするのにちょうどいい!


続いて、演出用のフルカラーLEDをまずははんだづけ!


そして今回の最難関、フルカラーLED、APA102Cを使った「SparkFun Lumenati」用プログラムの写経!
全員完走!色とりどりに光るLEDをゲット!

今回はBASICでフルカラーLEDを制御しましたが、フルパワーで毎秒5000万回計算するCPUをフルに使うマシン語を使うと、150倍速以上の制御が可能です!

BASIC、SPIの8bit送信を一部マシン語化、制御部分をフルアセンブラで実装の3パターン、速さの違いをぜひご覧ください!

配列の[0]から[7]に10進数3桁で色の三原色、RGBを入れてGSB@Lで呼び出す、BASICのAPA102フルカラーLED制御プログラムとデモがこちら。

30 CLV:GSB@L:FORI=0TO7:[I]=RND(1000):NEXT:CLT:GSB@L:?TICK():CONT 200 @L:N=0:FORI=0TO3:GSB@S:NEXT 210 FORI=0TO7:N=255:GSB@S:M=[I]:N=M%10:GSB@S:N=M/10%10:GSB@S:N=M/100:GSB@S:NEXT 220 N=255:FORI=0TO3:GSB@S:NEXT:RTN 230 @S:FORJ=7TO0STEP-1:OUT1,0:OUT2,N>>J&1:OUT1,1:NEXT:RTN

8コ点灯するのに155カウント、2.5秒かかります。順番に変わっていく様子が分かりやすい。

230行のCIに向けてオン・オフしながらDIにデータを8bit送るSPIという制御部分をマシン語化してみましょう。

@SPIW8BIT R3=[@GPIO1]L R1=1<<7 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 GOTO @SKIP R2=2 @SKIP [R3+`11]L=R2 ' OUT1,0:OUT2,F R2+=1 [R3+`11]L=R2 ' OUT1,1 R1=R1>>1 IF !0 GOTO @LOOP @END RET @GPIO1 DATA L #50010000

asm15でアセンブルして、28byteのマシン語を書き込み、@Sの中をマシン語に変更すると20倍速!

10 POKE#700,5,75,128,33,0,34,8,66,0,208,2,34,218,96,1,50,218,96,73,8,246,209,112,71,0,0,1,80 230 @S:U=USR(#700,N):RTN

8コ分の制御をまるっとマシン語に置き換えてしまうことで、更に高速化!

@APA102C PUSH {PC,R4,R5,R6,R7} R4=8 R4=R4<<8 R4+=R1 R5=8 ' num of LEDs R6=#F R7=@SPIW8BIT R7-=1 ' for Thumb +1 or -1 R3=[@GPIO1]L R0=0 GOSUB R7 GOSUB R7 GOSUB R7 GOSUB R7 @LOOP R0=255 ' brightness `11100000+max31 GOSUB R7 R0=[R4]W R0&=R6 GOSUB R7 R0=[R4]W R0=R0>>4 R0&=R6 GOSUB R7 R0=[R4]W R0=R0>>8 GOSUB R7 R4+=2 R5-=1 IF !0 GOTO @LOOP R0=255 GOSUB R7 GOSUB R7 GOSUB R7 GOSUB R7 POP {LR,R4,R5,R6,R7} @SPIW8BIT 'setting:R3 param:R0 use:R1,R2 R1=1<<7 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 GOTO @SKIP R2=2 @SKIP [R3+`11]L=R2 ' OUT1,0:OUT2,F R2+=1 [R3+`11]L=R2 ' OUT1,1 R1=R1>>1 IF !0 GOTO @LOOP @END RET @GPIO1 DATA L #50010000

96byteのマシン語で制御できました!(色の指定は、16進数3桁、例えば #F00 で赤)

10 POKE#700,240,181,8,36,36,2,12,68,8,37,15,38,14,167,1,63,18,75,0,32,184,71,184,71,184,71,184,71,255,32,184,71,32,136,48,64,184,71,32,136,0,9,48,64,184,71,32,136,0,10,184,71,2,52,1,61,240,209,255,32 20 POKE#73C,184,71,184,71,184,71,184,71,240,189,128,33,0,34,8,66,0,208,2,34,218,96,1,50,218,96,73,8,246,209,112,71,0,0,1,80 30 CLV:U=USR(#700,0):FORI=0TO7:[I]=RND(#1000):NEXT:CLT:U=USR(#700,0):?TICK():CONT

一瞬で8コの色を変更できるので、いろんな演出ができそうですね!
マシン語に興味を持ったら「IchigoJamマシン語入門」をどうぞ!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像