SSブログ
English Version

PIC24FJ64GAでGAME言語(その7) [PIC]

 前回の記事で書いたように Amazon で販売している格安ドットマトリックスLEDモジュールが問題なく動作したので追加注文して3個をカスケード接続してみました。
 GAME言語(インタープリタ)だけでの制御ではLEDコントローラ(MAX7219)へのデータ送信速度が 約0.5ms/bitであり、1個分の表示のアップデートで約64ms(=0.5 x 16 x 8)掛かり、3個接続すると流石に目視でも書換え動作が見えてしまいます。

 そこでMAX7219への送信部分のみをアセンブラ化してみました。アセンブラソースは次のとおりです。

 LED driver I/F(アセンブラ)
/*************************************
  write data to DotLed driver(MAX7219)
    made by skyriver at 2015/11/21
 *************************************/
	.title	"DotMatrixLed I/F"
	.include "p24fj64ga002.inc"

	.equ	DI_BIT,0
	.equ	CK_BIT,1
	.equ	CS_BIT,2
	.equ	WR_PORT,LATA

	.section .text_Ap,code,address( 0x8000 )

; write to LED driver(MAX7219)
;  W4 <- data
LedDrvWr:
	bclr	WR_PORT,#CS_BIT
	mov	#16,W0		; set counter
0:	 sl	W4,W4
	 btss	SR,#C
	 bclr	WR_PORT,#DI_BIT
	 btsc	SR,#C
	 bset	WR_PORT,#DI_BIT
	 bset	WR_PORT,#CK_BIT
	 dec	W0,W0
	 bclr	WR_PORT,#CK_BIT
	 bra	NZ,0b
	return

	.end


 アセンブラでの処理は 0x8000 アドレスからの開始にしています。
 ソース保存時のフラッシュメモリのアドレス範囲が 0xa000 ~ 0xffff なので不思議な感じがするかもしれませんが、実はソース保存時のフラッシュメモリの実態(実際のアドレス)は 0x2000 ~ 0x7fff で、この部分がデータ領域にマッピングされて見えています。
 そのため、アセンブラの処理はフラッシュメモリの 0x8000 以降に配置することになります。

 今回、GAME言語からフラッシュメモリ上の処理をコールする際のパラメータ渡しのために 変数A の値を W4 レジスタに入れてコールするように変更しました。
  PIC24FJ64GAでGAME言語(その3)から変更後のGAME言語をダウンロードできます。

 また、アセンブラで記述した処理のhexファイルを作成する上で不要な部分(ベクタテーブルやconfigデータ等)が含まれないようにするための方法を PIC24FJ64GAでのアセンブラ環境覚書 の記事に追記しました。

 更に今回のような reset処理部分がないhexファイルの書込み時に OneBitLoader で書込み後、本来のreset処理にたどり着けない場合があったのでOneBitLoaderのPC側の実行ファイルを修正しました^^;
 OneBitLoader が PIC24FJ64GA に対応(80word版ブートローダー)の記事からダウンロード可能です。

 処理に時間が掛かる部分をピンポイントでアセンブラ化することでGAME言語で十分に制御できました。
 PICはI/Oがメモリ空間にあるためGAME言語からでも自由に制御できますし、今回のように必要に応じてアセンブラ等を使うことで大抵のことはできるのではないかと思います。
 GAME言語本体をいじらずに割り込み処理を追加するのは流石に難しそうですが、プログラムでフラッシュメモリの書換えができるのでやろうと思えば不可能ではありませんw


 カスケード接続時のデモ表示を YouTube にアップしましたのでご覧ください。


 https://youtu.be/--0pHQlKrOE


 GAME言語のソースは次のとおりです。

 Dot Matrix LED test(GAME言語)
1' Dot Matrix Module MAX7219(triple) test by skyriver 2015/11/21
10 P=& TA=$2C0 LA=$2C4 CS=4
20 LA:0)=0 TA:0)=$F8
30 #=10000
40' write to driver GorA<-address B<-data
50 A=G*256+B >=$8000 ]
60 A=A*256+B >=$8000 >=$8000 >=$8000 LA:0)=LA:0)|CS ]
999' initialize MAX7219
1000' set no decode mode
1010 A=9 B=0 !=60
1020' set scan limit 0-7
1030 A=11 B=7 !=60
1040' set intencity
1050 A=10 B=4 !=60
1060' set shutdown mode(normal operation)
1070 A=12 B=1 !=60
1080' set Test mode(normal)
1090 A=15 B=0 !=60
1100 ]
1999' write array pattern
2000 G=1,8 B=P:G+Q+15) !=50 B=P:G+Q+7) !=50 B=P:G+Q-1) !=50 LA:0)=LA:0)|CS @=G+1 ]
2999' pattern data
3000' space,0
3010+ 00 00 00 00 00 00 00 00-00 7E C1 B1 8D 83 7E 00
3020' 1,2
3030+ 00 00 00 82 FF 80 00 00-00 86 C1 A1 91 89 86 00
3040' 3,4
3050+ 00 42 81 81 89 89 76 00-00 30 28 24 22 FF 20 00
3060' 5,6
3070+ 00 4F 89 89 89 89 71 00-00 7E 89 89 89 89 72 00
3080' 7,8
3090+ 00 01 01 C1 31 0D 03 00-00 76 89 89 89 89 76 00
3100' 9,@
3110+ 00 06 89 49 29 19 06 00-7C 82 65 95 F9 82 7C 00
3120' A,B
3130+ 00 FC 12 11 11 12 FC 00-00 FF 89 89 89 89 76 00
3140' C,D
3150+ 00 7E 81 81 81 81 42 00-00 FF 81 81 81 42 3C 00
3160' E,space
3170+ 00 FF 89 89 89 89 81 00-00 00 00 00 00 00 00 00
3180' O,WA
3190+ 00 60 92 7F 12 90 64 08-00 22 1A FF 0A 08 88 70
3200' ri,space
3210+ 00 00 1E 08 00 80 7E 00-00 00 00 00 00 00 00 00
3220' space,space
3230+ 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
3240' EOD mark
3250+ 5A 5A
6999' hex2bin transfer(nibble)
7000 O=O-"0" ;=O>9 O=O-"A"+"0"+10
7010 ]
7999' set display pattern
8000 R== Q=0
8010 @
8020  ;=R:3)<>"+" R=R+R:0) #=8090
8030  R=R+4
8040  @
8050   O=R:1) !=7000 P:Q)=O*16 O=R:2) !=7000 P:Q)=P:Q)+O
8060   R=R+3 Q=Q+1
8070  @=(R:0)=0)
8080  R=R+1
8090 @=(R:0)=0)
8100 ]
8999' return to first data
9000 ;=S=1 S=-1 ]
9010 Q=0
9020 ;=S=8 S=1 ]
9030 S=8
9040 ]
10000 !=1000 !=8000 F=P(Q/2-1)
10010 S=8 Q=0
10020 @
10030  ;=(P(Q/2+12)=F)|(Q=-1) !=9000
10040  ¥=5*+S
10050  !=2000
10060  Q=Q+S
10070  @ "" @=(¥=0)
10080 @=(0)


★2019/03/23 追記
 この記事では7219への書込みをソフトウェアで実現していますが、クロック信号出力付のシリアル通信であるSPIのI/Fを使用して書込みもできるのでPIC内のSPIモジュール機能を使ってもっと簡単に7219への書込みができます。

[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(4) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 4