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

変換基板到着! IchigoJam for STM32 でも動くArmマシン語3x3キャラ描画

2018/02/21
#IchigoJam #stm #KidsIT #asm 

注文していたプリント基板(PCB)が到着、動きました!

IchigoJam for STM32
LEDをつけるけすはもちろん、IchigoJam BASICのツールやゲームはそのまま動作。
Armマシン語も、仮想RAMしか使わないものならそのまま動きます!
第3回こどもプログラミングサミット」のIchigoJamワークショップにて初お披露目!

つくりかた手順
1. 変換基板を入手(PCB発注など)
2. テスターで変換基板の回路パターンを確認(電源とGNDがショートしていないかなど)
3. CPU、STM32F030K6T6をはんだづけ(0.8mmピッチなのでLPC1114FDH28より少し簡単)
* 秋月電子で入手可能なSTM32F042K6T6でもOK
4. CPUを実装していないIchigoJamを準備(IchigoJam 完全組立キットTなど)
5. 変換基板をCPUとして接続(ピンヘッダーではんだづけや、抜き差しできるようになどお好みで)
6. USBシリアルを使い、STM用のファームウェア、IchigoJam BASICをstm32writerを使って書き込みます
* ファームウェアはIchigoJam-FANにてβ公開予定、書き込み時に接続待ちがでた場合、RESETピンを一瞬GNDに

変換基板とSTM32F030K6T6。

ミニテクニック
IchigoJam BASIC、GOTOを使わないFORコマンドを使ったエルチカ無限ループ。

FOR I=0 TO 1 STEP 0:LED A:WAIT10:A=1-A:NEXT

キャラクター9つで3x3サイズの大きなキャラとして表示する、Armマシン語。
配列の先頭2つで座標を指定して、9文字分の文字列を渡すと表示します。

10 POKE#700,8,68,8,35,27,2,11,68,26,136,89,136,128,51,128,51,19,68,73,1,11,68,3,33,2,120,26,112,66,120,90,112,130,120,154,112,3,48,32,51,1,57,245,209,112,71 20 LET[0],RND(30),RND(20):U=USR(#700,"ABCDEFGHI") 30 GOTO 20

asm15でアセンブルできるプログラムはこちら
(R1を使った仮想メモリアドレスを物理メモリアドレスへ変換がポイント)

R0+=R1 R3=8 R3=R3<<8 R3+=R1 R2=[R3]W ' [0]=X R1=[R3+1]W ' [1]=Y R3+=128 R3+=128 R3+=R2 R1=R1<<5 R3+=R1 R1=3 @LOOP R2=[R0] [R3]=R2 R2=[R0+1] [R3+1]=R2 R2=[R0+2] [R3+2]=R2 R0+=3 R3+=32 R1-=1 IF !0 GOTO @LOOP RET

高速化したい時、メインループの一番内側から順にマシン語化してみましょう
Armマシン語入門

Armマシン語でライフゲーム - IchigoJamとRaspberry Pi用IchigoJam RPi(beta)で動く!

2018/01/28
#arm #IchigoJam #rasppi 

1995年のMSX-FANで出会ってから、シンプルな法則から生まれる多彩な結果に魅了されたライフゲーム。
一日一創でも、広大なライフゲームチェックボックスでつくったもの光の3原色をレイヤー表示したものなど作ってました。

IchigoJam BASICでも、10x10くらいなら配列を使ったプログラミングの練習にもちょうどいい感じでできます。
シミュレーション入門 / こどもパソコン IchigoJam でつくるライフゲーム
IchigoJam でも IchigoJam RPi(1.2b16以降) でも同じプログラムで動きます!

IchigoJam-FANにて、紹介あったArmマシン語でサクサク全画面で動くライフゲーム!
IchigoJam RPi vs LPC1114 マシン語ルーチンで動作違いを確認(戻り値の動き)
asm15 assembly表記にしてみました。

こちらちょうど1kbyte(=1024byte)になったライフゲームプログラム。(ベースプログラム by KubotaProject

1 'L-GAME 10 POKE#7D0,240,181,132,70,0,32,0,35,0,36,37,0,0,38,45,66,6,208,1,45,4,208,2,45,2,208,3,61,1,54,246,231,66,9,87,1,199,27,2,180 20 POKE#7F8,0,33,18,66,4,209,54,66,9,209,23,33,73,1,6,224,22,42,4,209,2,46,2,209,23,33,73,1,73,66,63,66,3,209,45,66,6,209,32,49 30 POKE#820,4,224,31,47,2,209,2,45,0,209,32,57,10,0,2,188,23,24,127,25,32,37,110,67,191,25,33,63,9,34,18,2,191,24,125,92,101,69,0,209 40 POKE#848,1,51,1,52,9,44,196,209,143,36,36,1,100,90,198,8,247,0,199,27,53,25,7,38,246,27,111,92,132,24,1,34,178,64,102,92,102,69,7,209 50 POKE#870,3,43,9,208,4,43,7,208,255,36,98,64,23,64,2,224,3,43,1,209,23,67,111,84,64,28,66,9,23,42,162,209,0,224,132,70,0,32,9,34 60 POKE#898,18,2,143,35,27,1,91,90,0,36,230,8,247,0,231,27,245,24,7,38,246,27,111,92,247,64,1,37,47,64,165,24,1,47,1,209,64,28,103,70 70 POKE#8C0,111,84,100,28,101,9,23,45,235,209,240,189 100 CLS:S=#700:W=0:FORI=0TO95:POKES+I,0:NEXT 110 FORI=0TO255:G=RND(736):M=G/8+S:F=7-G%8:R=PEEK(M):R=R|1<<F:POKEM,R:NEXT 120 WAIT3:LC0,23:?DEC$(USR(#7D0,#ED),5);:CONT

#700からのメモリに1マス1bitの生命データを置き、USRのマシン語読み出しで1世代進めています。
asm15形式にした、Armマシン語プログラムはこちら。(ベースプログラム by KubotaProject

' LIFE GAME - START ADDRESS #7D0 PUSH {LR,R4-R7} R12=R0 R0=0 @LP0 R3=0 R4=0 @LP1 R5=R4<<0 R6=0 @LP2 R5&R5 IF 0 GOTO @JP1 R5-1 IF 0 GOTO @JP1 R5-2 IF 0 GOTO @JP1 R5-=3 R6+=1 GOTO @LP2 @JP1 R2=R0>>5 R7=R2<<5 R7=R0-R7 PUSH {R1} R1=0 @TOP R2&R2 IF !0 GOTO @BOTTOM R6&R6 IF !0 GOTO @LEFT R1=23 R1=R1<<5 GOTO @LEFT @BOTTOM R2-22 IF !0 GOTO @LEFT R6-2 IF !0 GOTO @LEFT R1=23 R1=R1<<5 R1=-R1 @LEFT R7&R7 IF !0 GOTO @RIGHT R5&R5 IF !0 GOTO @JP5 R1+=32 GOTO @JP5 @RIGHT R7-31 IF !0 GOTO @JP5 R5-2 IF !0 GOTO @JP5 R1-=32 @JP5 R2=R1<<0 POP {R1} R7=R2+R0 R7=R7+R5 R5=#20 R6*=R5 R7=R7+R6 R7-=#21 R2=9 R2=R2<<8 R7=R7+R2 R5=[R7+R1] R5-R12 IF !0 GOTO @JP2 R3+=1 @JP2 R4+=1 R4-9 IF !0 GOTO @LP1 @PREP R4=143 R4=R4<<4 R4=[R4+R1]W R6=R0>>3 R7=R6<<3 R7=R0-R7 R5=R6+R4 R6=7 R6=R6-R7 R7=[R5+R1] R4=R0+R2 R2=1 R2<<=R6 @JUDGE R6=[R4+R1] R6-R12 IF !0 GOTO @JPB R3-3 IF 0 GOTO @JP3 R3-4 IF 0 GOTO @JP3 @DEATH R4=#FF R2^=R4 R7&=R2 GOTO @JPMEM @JPB R3-3 IF !0 GOTO @JP3 R7|=R2 @JPMEM [R5+R1]=R7 @JP3 R0=R0+1 R2=R0>>5 R2-23 IF !0 GOTO @LP0 GOTO @JPX2 @MEM2VRAM R12=R0 @JPX2 R0=0 R2=9 R2=R2<<8 R3=#8F R3=R3<<4 R3=[R3+R1]W R4=0 @LPX1 R6=R4>>3 R7=R6<<3 R7=R4-R7 R5=R6+R3 R6=7 R6=R6-R7 R7=[R5+R1] R7>>=R6 R5=1 R7&=R5 R5=R4+R2 R7-1 IF !0 GOTO @JPX1 R0=R0+1 R7=R12 @JPX1 [R5+R1]=R7 R4=R4+1 R5=R4>>5 R5-23 IF !0 GOTO @LPX1 POP {PC,R4-R7}

asm15 assemblerでアセンブルできます。

asm15 assemblerのアップデート
- R8からR15レジスタに未対応の一部命令を追加しました。
- レジスタに代入できるのは8bit/1byteの符号なし定数までなど、範囲制限のある数値で超える場合にエラーが出るようにしました。

IchigoJam、ラズパイ、スマホで動くArmマシン語、興味持った方はこちらからどうぞ!
はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

My First Machine language - the simplest course of Arm machine language with IchigoJam step1

2018/01/25
#IchigoJam #KidsIT #Arm #rasppi #english 

Computers only know them binary machine language using just 0(off) and 1(on).
How do we make binary number sequence? It's depends on computers.


"RUN the Arm machine language on IchigoJam RPi after 1.2b16 (Raspberry Pi 2)"

The computer of IchigoJam understands 16 bit words (0 or 1 x 16).

0011000000000001

This machine language means to add 1 to R0 register. (resisters are kind of memories in the computer)

First 5 bit means "to add", next 3 bit means the resister number, last 8 bit means number to add.

00110 000 00000001

Let's write to RAM using POKE command of IchigoJam BASIC. (*IchigoJam BASIC reference ver 1.2)

POKE#700,`00000001,`00110000

#700 is position of RAM. Number starts with ` means binary number. (# for hexadecimal number)
To write last 8 bit in the first is a rule of this computer. (little-endian)

You need an other machine language word to work, "return" to IchigoJam BASIC.

0100011101110000

Write this word to RAM in the same way.

POKE#702,`01110000,`01000111

You are ready to run!

?USR(#700,1)

Did you get a number 2 as a right result?

USR command needs an start address of the machine languages and a number as a parameter.
Please check using 100 as a parameter.

?USR(#700,100)

Try to make to add 5 program using the machine language.

POKE#700,5 ?USR(#700,100)

You did it!

Speed is the greatest advantage of using the machine language.
The disadvantage is wrong machine language program doesn't protect your system.
So, please save before run if you make long program with machine language.

IchigoJam will stop if you write wrong machine languages.
Try to freeze your IchigoJam.

?USR(#704,0)

Computers work with some machine language words such them.
CPU of IchigoJam (LPC1114 Arm Cortex-M0) knows only 56 words Arm Thumb machine language.
It's very simple to understand!

If you use IchigoJam RPi after 1.2b16 (Raspberry Pi2/3 Arm Cortex-A7/A53), it knows more words.

It's a sample code to use SIMD(single instruction multiple data) machine language.
QADD8 can calculate 4 number as parallel during just 1 CPU cycle.

POKE#700,#80,#FA,#10,#F0,#70,#47 ?HEX$(USR(#700,#1234)) 2468

*It can calculate 8bit x 4 numbers but variables of IchigoJam BASIC are 16bit.

To be continued!

references
- Cortex-M0 Technical Reference Manual - Instruction set summary / ARM Information Center
- Cortex-A7 MPCore Technical Reference Manual - About the programmers model / ARM Information Center

links (now in Japanese)
- asm15 - simple Arm assembly language and machine language table
- asm15 assembler for IchigoJam
- series of "My First Arm Assembly language"

IchigoJamが音痴な理由と対処法、STM32F0版IchigoJamは音痴が解消する見込み

2018/01/04
#IchigoJam #stm32 #maker 

IchigoJamには懐かしのBEEP音とPLAY文によるMML演奏が可能です。
ただ訳あってちょっと音痴です。

音痴な理由、2つ

1. 標準で付属しているサウンダーの周波数特性
音楽再生用じゃないので、与えた周波数通りには鳴りません。
別途エイリアンスピーカーなどに接続することである程度解消されます。

2. 元々音痴で鳴らしている
標準のオクターブ(O4)で、ドのシャープで1.2%、ファで2.2%ずれています。
ディスプレイ表示用の水平同期信号を最低周期として使っているために、ちょうどいい周波数になっていないのです。
PWMコマンドやマシン語を使って、目的の周波数に合わせて鳴らすことで一応対策可能ですが、PanCakeや、FM音源や、MIDIなどでいい音につなぐのもいいですよ!

開発中のSTM32F0版IchigoJamでは、タイマーが豊富なので、PLAY文用にタイマーが使える見込みです!

きれいな440Hzが鳴っています!音域も低音O1から超音波に突入するO9まで拡げられそう。
LPC1114のハードウェア(CPU)によるタイマーはディスプレイ表示、2つはサーボ制御用PWMを優先させ、音痴で妥協していましたが、念願の音痴解消!?(ただし、理由1対策に、いいスピーカーは必要です)

音は波。
昔、MSXturboR標準ソフトで、音声を録音して、波形を見ていろいろいじって楽しかったことを思い出します。
音の正体とプログラム作曲 / はじめてのプログラミングその8

links
- IchigoJam電子工作パーツセット エイリアンスピーカー / ASP-JamP

だいたい動いたSTM32F0版IchigoJam、画面&キーボード可能バージョンβ

2018/01/03
#IchigoJam #stm32 #maker 

シリアルで動いたSTM32F0版IchigoJam、NTSC信号を作成し、SPIで受け取るPS/2キーボード入力部分を作って、IchigoJamっぽくなりました!

CPUを実装していないIchigoJam T基板につないで、起動からLEDチカチカ、かわくだりゲームの読み込み、保存までを動画にしてみました。 ベンチマークしてみたところ、LPC1114版とほぼ同速度でした。

LPC1114と違って、1KBずつファイルが書き込めるので、今まで同様4ファイル保存するとして、4KB増の28KBまでOSで使えます! アナログが豊富にあったり、タイマーがたくさん使えたりするので、いろいろできなかったこともできるかも。(参考、LPC1114での4ファイル保存


開発中、たいへん役だってくれたオシロスコープくん。電子工作のデバッグに便利です!

STM32F0版IchigoJam、シリアル通信バージョンβ

2018/01/02
#IchigoJam #stm32 #asm #maker 

お気に入りCPU、Arm Cortex-M0NXP社製LPC1114シリーズと同じクラス、STMicroelectronics社製STM32F0シリーズでIchigoJamが動きました!


シリアル通信でIchigoJamを便利に使える、IJUtilitiesを使うとスクリーンを使ったゲームも動かせます!


今回は、秋月電子で手に入るSTM32F042K6T6へ書き込んだら、そのままシリアル通信で使えます。 (Nucleoにbinファイル書き込みでも動くかもしれません)

I/Oは、まだLED(PB3とPA7)のみ使えます。他、配置と機能、検討中です。

同じArmなので、USRコマンドを使ったマシン語はそのままで動きます!
ハンドアセンブルで超速計算! - IchigoJamではじめるArmマシン語その2
I/Oを使うマシン語は、LPC1114とSTM32F0、I/Oのメモリマップが違う点に注意です。

ターゲットにしている、STM32F030K6T6TRは、LPC1114と同じ48MHz/Flash32KB/RAM4KBで、1コ175円、12,000コ買えば1つあたりなんと74円

STM32で始めるC言語」で紹介した上級者向けミニマム開発環境サンプルも拡充
(GPIO/Clock変更/UART/割り込み/TIM/SPI/Flash書き込み)

ちっちゃいコンピューターをプログラミングで味方に付け、身の回りをどんどん便利にしちゃいましょう!

STM32で始めるC言語、アセンブリ言語と比べてみよう

2017/12/30
#stm32 #asm 

Mbed対応のSTM32の開発環境Nucleoでマシン語でエルチカに成功したので、次はいろいろ製品化を見越して、CPUそのままを使って作ってみます。


今回使用したのは、秋月で売っている一番安いSTM32、STM32F042K6T6です。
Arm Cortex-M0 48MHz, Flash32KB, SRAM6KB, LQFP32
LQFP32に対応するDIP化基板へはんだづけ!
0.8mmピッチなので、0.65mmピッチ28ピンのLPC1114FDH28のはんだづけより簡単です。


USBシリアルを使って書き込みます。LEDとUSBシリアルとの接続の仕方はつぎの通り。
VDDA、VDDIO2にも電源供給が必要です。BOOT0をHIGHにすることで、書き込みモードになります。
RTSが使えない場合は、リセットする際、手でジャンパー線をGNDにつなぐか、タクトスイッチをつけましょう。

3.3VVDD 1STM32F032 VSSGND
OSC_IN 231 BOOT03.3V
OSC_OUT 330 PB7
RTSNRST 429 PB6
3.3VVDDA 528 PB5
PA0 627 PB4
PA1 726 PB3
PA2 825 PA15
PA3 924 PA14
PA4 1023 PA13
PA5 1122 PA12
PA6 1221 PA11
PA7 1320 PA10TXD
PB0 1419 PA9RXD
LEDPB1 1518 PA8
GNDVSS 1617 VDDIO23.3V
USBシリアルの書き込みに、"STM32 FLASH Writer Program Using Python" stm32writerを使わせてもらいました。 stm32用プロジェクト一式をGitHub"my-first-stm32" からダウンロードし、マシン語のエルチカを書き込んでみましょう。(Mac用です。USBシリアルの設定は、makefile内を書き換えてください)

t0-asm$ make ../tools/stm32writer/stm32writer.py --port=/dev/tty.SLAB_USBtoUART --go "obj.mot" stm32writer (version: 20171231py) ...

うまくいけば書き込み終了後に自動的にエルチカが始まります。
書き込み終わっているので、USBシリアルを外して、BOOT0をGNDに接続し、3Vくらいにつなげばエルチカマシンのできあがりです!

アセンブリ言語でマシン語プログラムも楽しいですが、C言語で開発できるようにすると楽です。
例えば、48MHzへの切り替えの一部 (asm15 アセンブリ言語 from STM32エルチカ)

R0=[@RCC]L R3=R0+4 ' RCC_CFGR R1=[R3]L R2=`1111 R2=R2<<18 R2=~R2 R1&=R2 R2=4 ' PLLMUL6 R2=R2&lt;<18 R1|=R2 [R3]L=R1

これがC言語だと1行で書けます!

RCC->CFGR = (RCC->CFGR & ~(0b1111 << 18)) | (4 << 18);

t1-led-blinkがC言語でのエルチカ、t2-clockがクロックを48MHzに変更と、stm32の取説に合わせて必要最小限のプログラムになっているので、C言語の雰囲気をつかむのにのぞいてみてください。

t2-usartではstm32とのシリアル通信が一応できていますが、どうも内蔵クロックの精度が悪く計算上の値とは5%ほどずれてしまう点と、切り替えるべきAF(Alternate Function)の番号がstmのシリーズによって違う点が注意です。

STM32F0シリーズの取説は、日本語版もあって親切丁寧です!
参考資料 RM0091 リファレンスマニュアル STM32F0x1/STM32F0x2/STM32F0x8 advanced ARM-based 32bit MCUs

コンピューターをフル活用できる、マシン語とC言語の世界もぜひどうぞ!

BASICでプログラムの楽しさを知り
マシン語でコンピューターを知り
C言語でツールの便利さを知る
かつての王道、今でも通じる!?

links
- taisukef/my-first-stm32: first step of STM32F0
- IchigoJamではじめるArmマシン語

STM32はじめのいっぽ、64byteでつくるエルチカ1Hz Armマシン語

2017/12/24
#Arm #stm32 

CPUアーキテクチャとしてArmを採用しているメーカーはたくさんあるので、Armマシン語を覚えたらいろいろと応用できます。 今回コントロールするマイコンは、STマイクロエレクトロニクスSTM32F031K6です!


実は古い、STM32との出会い。マイコンに興味を持ち始めた4年前、開発環境が1,000円とあまりに安かったでひとまず買ってWindowsでデモのエルチカを見るも、Macでの開発環境が見つからずお蔵入り。 その後、書籍「組み合わせ自在!超小型ARMマイコン基板」をきっかけにNXP社のDIP版LPC1114に出会ったできた、IchigoJam

IchigoJamでマイコン開発で使っているDIP版LPC810も残念ながら生産終了なので、メーカー問わずマイコン探しをしている中での再会です!

ひとまず一番小さいSTM32F0シリーズのお手軽ボード「STM32 Nucleo Board STM32F031K6」で実験。 Arm Mbedに対応したUSBでPCに接続するとドライブとして認識して、binファイルをコピーするだけで書き込んでくれます。

LPC1114と同様、Arm Cortex-M0なので、基本は一緒。 親切な取説を見ながら、ひとまずミニマムなエルチカ(64byte)が完成! (参考、Cortex-M0 Armマシン語表(抜粋)

DATA L #20001000 ' stack top DATA L #08000009 ' entry point @ENTRY R0=[@RCC_AHBENR]L R1=[R0]L R2=1 R2=R2<<18 R1|=R2 [R0]L=R1 R0=[@GPIOB]L ' GPIOB_MODER R1=`01000000 [R0]L=R1 R0+=#14 ' GPIOB_ODR R1=`1000 R2=0 R3=[@WAIT_CNT]L @LOOP [R0]L=R1 R4=R3 R4-=1 IF !0 GOTO -1 [R0]L=R2 R4=R3 R4-=1 IF !0 GOTO -1 GOTO @LOOP @RCC_AHBENR DATA L #40021014 @GPIOB DATA L #48000400 @WAIT_CNT DATA L 1000000

RCC_AHBENRでGPIOを有効にする(省エネの基本は使う部品だけ有効に!)
GPIOB_MODERでGPIOを設定(Nucleoの取説より、PB3にオンボードLEDがつながっていることを確認)
GPIOB_ODRでGPIOに書き込む(メモリマップドI/Oなので、メモリに書き込むだけ)
空ループでWAIT(1ループ4clock、標準は8MHzなので、1Hzエルチカするには1万回でOK!)
* Flashは#08000000に置かれます。チェックサムがないので手抜きするとヘッダは8byteでOK!

asm15 Assemblyでstart address:0、hex fileにアセンブルして、objcopyでbinファイルを作って、コピーしてみましょう!

cat > obj.hex :1000000000100020090000080A480168012292043B :10001000114301600848402101601430082100228A :10002000064B01601C46013CFDD102601C46013CB0 :10003000FDD1F6E7141002400004004840420F00D2 :00000001FF arm-none-eabi-objcopy -I ihex --output-target=binary obj.hex obj.bin

定格いっぱいフルパワー48MHzでエルチカする方法はこちら

DATA L #20001000 ' stack top DATA L #08000009 ' entry point @ENTRY 'clock 48MHz R0=[@FLASH]L ' FLASH_ACR R1=[R0]L R2=`10001 ' 1<<4:enbale prefetch, 1 wait state R1|=R2 [R0]L=R1 R0=[@RCC]L R3=R0+4 ' RCC_CFGR R1=[R3]L R2=`1111 R2=R2<<18 R2=~R2 R1&=R2 R2=4 ' PLLMUL6 R2=R2<<18 R1|=R2 [R3]L=R1 R1=[R0]L ' RCC_CR R2=1 R2=R2<<24 ' PLLON R1|=R2 [R0]L=R1 R2=R2<<1 ' PLLRDY R1=[R0]L R1&R2 IF !0 GOTO -2 R1=[R3]L ' RCC_CFGR R2=2 ' PLL R1|=R2 [R3]L=R1 R2=12 R1=[R3]L R1&=R2 R1-8 ' 2<<2 == PLL IF !0 GOTO -3 ' init GPIO R0+=#14 'RCC_AHBENR R1=[R0]L R2=1 R2=R2<<18 R1|=R2 [R0]L=R1 R0=[@GPIOB]L ' GPIOB_MODER R1=`01000000 [R0]L=R1 R0+=#14 ' GPIOB_ODR R1=`1000 R2=0 R3=[@WAIT_CNT]L @LOOP [R0]L=R1 R4=R3 R4-=1 IF !0 GOTO -1 [R0]L=R2 R4=R3 R4-=1 IF !0 GOTO -1 GOTO @LOOP @FLASH DATA L #40022000 @RCC DATA L #40021000 @GPIOB DATA L #48000400 @WAIT_CNT DATA L 6000000

24MHzを超える場合はFlashアクセスにウェイトが必要です。ただプリフェッチバッファー4byteが3つあり、それを有効にしておくことで、速度はそこそこ保たれます。 PLLを有効にして、内蔵クロック8MHzを6倍にする設定をして、クロックを切り替えることで48MHz動作になります!エルチカも6倍速くなってしまうので、WAIT_CNTを6倍にして1Hzエルチカのできあがり!

次は、Nucleoの書き込み機能に頼らず、IchigoJamからマイコンへの書き込みに挑戦です!

links
- リファレンスマニュアル STM32F0x1/STM32F0x2/STM32F0x8 advanced ARM®-based 32-bit MCUs
- IchigoJamとLPC810でつくるLED点滅クリスマスアクセサリー
- はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

WS2812Bを観察しよう!IchigoJamで開発するLPC810でフルカラーLED点灯実験

2017/12/17
#IchigoJam #maker #lpc810 #asm 

光るカセットテープで活躍するWS2812Bを、LPC810を使って自在に点灯できたら簡単、気軽にカセットテープ内にボタン電池も含めて収められてうれしいかも? (IchigoJamを書き込んだLPC1114を使って光るカセットテープを作った例 by JO3GBDさん)


LPC810から制御したWS2812B。
拡大してみると、信号が来るDI側から順に、緑、赤、青と小さく光っている様子が分かります。
データを送信する順も緑、赤、青!

プログラムはこの通り、マシン語部分が長くなってきたら、100行以降を別プログラムとして保存しましょう。

10 POKE#700,0,4,0,16,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,251,255,239,24,72,223,33,1,96,24,72 20 POKE#728,1,104,3,34,210,67,17,64,1,96,22,72,22,73,1,96,22,72,12,33,1,96,22,76,4,34,3,32,22,161,128,37,11,120,34,96,43,66,8,208 30 POKE#750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,96,7,224,0,0,34,96,0,0,0,0,0,0,0,0,0,0,0,0,109,8,233,209,1,49 40 POKE#778,1,56,228,209,7,79,1,63,253,209,222,231,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,64,66,15,0 50 POKE#7A0,2,2,2,0 60 A=#700:L=164:LRUN1 'FILE1 100 'LPC810 Writer 256byte from ADR:A 110 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?";:GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R:GSB@R 150 ?"A 0":GSB@R:GSB@R 160 ?"U 23130":GSB@R 170 ?"W 268436096 ";256:GSB@R:UART1,2:LC0,-1:FORI=0TO255:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6 180 ?"P 0 0":GSB@R 190 ?"E 0 0":GSB@R 200 ?"P 0 0":GSB@R 210 ?"C 0 268436096 256":GSB@R 215 '?"G 268436128 T":GSB@R:END 220 OUT2,1:OUT1,0:OUT1,1:END 500 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT

ちょうど50行、#7A0からの3byteがG(緑)、R(赤)、B(青)の数を指定しています。
書き換えて、実験してみましょう。


LPC810と光ったWS2812B!

マシン語プログラムの解説

asm15でWS2812Bの制御用マシン語プログラムは、LPC1114用を元に、LPC810用に修正します。
Cortex-M0+のLPC810では、OUTポートの扱いがNOTを使えるので短く、1クロックで読み書きできるので高速!
ただ、標準動作の12MHz用に、ウェイトはループではなく、NOPコマンドで調整しました。
厳密にはデータの区切りで速度が追いついていないので、たくさん光らせようとするとおかしくなってしまうため、周波数を上げるかSPIでの制御にしないといけなさそうです。(追記、勘違いでした12MHzでもいけました!

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0, 0, 0, 0, 0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' flash no wait: set 0b00 R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 ' WS2812B driver ' R0 - data count ' R1 - data address (G1,R1,B1,G2,R2,B2 ....) ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count ' R7 - wait count @WS2812B R0=3 R1=@DATA_LED @LOOP_DATA R5=#80 R3=[R1] @LOOP_BIT [R4]L=R2 R3&R5 IF 0 GOTO @ZERO NOP NOP NOP NOP NOP NOP NOP [R4]L=R2 GOTO @JOIN @ZERO NOP [R4]L=R2 NOP NOP NOP NOP NOP NOP @JOIN R5=R5>>1 IF !0 GOTO @LOOP_BIT R1+=1 '+6clock R0-=1 IF !0 GOTO @LOOP_DATA @WAIT R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 GOTO @WS2812B ' init @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 ' WS2812B @WAIT_N DATA L 1000000 @DATA_LED DATA B 2, 2, 2

開始アドレスを0に変えて、hexファイルに変換したものがこちら。
こちらをLPC810に直接書き込んでも動きます!

:1000000000040010210000000000000000000000BB :10001000000000000000000000000000DFFBFFEF18 :100020001848DF210160184801680322D2431140BB :10003000016016481649016016480C210160164CF3 :100040000422032016A180250B7822602B4208D0C1 :10005000000000000000000000000000000022601E :1000600007E0000022600000000000000000000027 :1000700000006D08E9D101310138E4D1074F013F9B :10008000FDD1DEE78080044010000440C0C1004084 :10009000BFFFFFFF002000A0002300A040420F0090 :0400A0000202020056 :00000001FF

links
- IchigoJamでLPC810マイコン開発!(デプロイ・完結編)
- IchigoJamでも光る大五郎! 300コのフルカラーLEDを簡単コントロール! IchigoJam x WS2812B/SK6812/NeoPixel
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

IchigoJam「で」LPC810マイコン開発!(まずは実行編)

2017/12/11
#IchigoJam #maker #lpc810 

マシン語でLPC810のエルチカができたので、次のステップ、IchigoJamからの書き込みです。
IchigoJamだけで、LPC810の開発に成功しました!


エルチカのプログラムのメイン部分をBASICのPOKE文にasm15で変換して、メモリに書き込んでおきます。

10 POKE#700,11,72,223,33,1,96,11,72,1,104,3,34,210,67,17,64,1,96,9,72,9,73,1,96,9,72,12,33,1,96,9,72,4,33,9,74,1,112,19,70 20 POKE#728,1,59,253,209,250,231,0,0,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,128,132,30,0 30 A=#700:L=76

LPC810へはシリアル信号でつなぎます。RESETをOUT1、ISPをOUT2へ、TXD/RXDをクロスしてIchigoJamに接続。VCC/GNDもIchigoJamから取りましょう。

プログラムをメモリに書き込み、即実行するIchigoJam BASICプログラムがこちら

100 'LPC810 WRITER A:ADR L:LEN 110 UART3,2:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?":GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R 150 ?"U 23130":GSB@R 160 ?"W 268435456 ";L:GSB@R:UART1,2:LC0,-1:FORI=0TOL-1:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6:? 170 ?"G 268435456 T":GSB@R:END 180 @R:K=INKEY():IF K=13 K=INKEY():RTN ELSE CONT

110行、LPC810を一度リセット
120行、?を送ることでシリアル信号のbpsを合わせてくれます
130行、bpsが合っていることを確認
140行、周波数12MHzを表します
150行、書き込みや実行権限をゲット
160行、アドレスAから、長さLを書き込み!
170行、書き込んだ場所を即実行!
※1 268435456は、16進数で#10000000、LPC810のRAMの先頭位置を表します。(linecalcで0x10000000)
※2 LPC1114と違って、バイナリで直接書き込めるのでプログラムが短く、速い!


マシン語を書き換えて、点滅速度を高速変えて書き込むデモ動画

マシン語を直接書くも良し、アセンブラやコンパイラを作るも良し。
安くてかわいいコンピューターを使いこなしちゃいましょう!
追記、デプロイ・完結編はこちら!


links
- マシン語で作る!75円のかわいいArmマイコン、LPC810用エルチカプログラム
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- LPCマイコン情報:LPC800 Cortex-M0+搭載-スイッチ・マトリックス
- LPC810 - marutsu
- LPC810 - 秋月電子通商
- IchigoJamでLPC810マイコン開発!(デプロイ・完結編)

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