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(アセンブラ)
アセンブラでの処理は 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言語)
★2019/03/23 追記
この記事では7219への書込みをソフトウェアで実現していますが、クロック信号出力付のシリアル通信であるSPIのI/Fを使用して書込みもできるのでPIC内のSPIモジュール機能を使ってもっと簡単に7219への書込みができます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
GAME言語(インタープリタ)だけでの制御ではLEDコントローラ(MAX7219)へのデータ送信速度が 約0.5ms/bitであり、1個分の表示のアップデートで約64ms(=0.5 x 16 x 8)掛かり、3個接続すると流石に目視でも書換え動作が見えてしまいます。
そこでMAX7219への送信部分のみをアセンブラ化してみました。アセンブラソースは次のとおりです。
/************************************* 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言語のソースは次のとおりです。
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] [ 前へ ] 連載記事 [ 次へ ]
コメント 0