1.LCDの速度が非常に遅い
LCDの/WR信号は簡単のためにGNDに固定してしまったのでコマンド間にはディレイを入れなければなりませんが、これが結構な無駄時間です。
ソフトタイマで処理しようとすると「NOP」は1ステート100nsで処理されます。
また、C25にはハードウェアで命令をリピートできる機能があるので以下のようにするとオーバーヘッドなしで200個実行して正確に20μsをつくれます。(ただし256個まで)
ソフトタイマで処理しようとすると「NOP」は1ステート100nsで処理されます。
また、C25にはハードウェアで命令をリピートできる機能があるので以下のようにするとオーバーヘッドなしで200個実行して正確に20μsをつくれます。(ただし256個まで)
DELAY .macro ;20us wait RPTK 199 NOP .endm
コマンド間は40μs必要なのでこのマクロを2回で行けますが表示のクリアは1.6msもかかるのでNOPを1万6千回実行しなければなりません
TMS320シリーズはハーバードアーキテクチャが採用されプログラム空間とデータ空間が分離されています。なのでプログラム空間に固定文字列のメッセージデータを埋め込んでいるとそれをデータとして外部に出力する際にいったんデータ空間に持ってこなければなりません。
完全に分離していたらそれはできない筈ですが、実は両方のバスをつなぐブリッジがあり行き来は可能です。ただし明示的に「TBLR」命令で転送してこなければなりません。
完全に分離していたらそれはできない筈ですが、実は両方のバスをつなぐブリッジがあり行き来は可能です。ただし明示的に「TBLR」命令で転送してこなければなりません。
3.処理データ幅
DSPのデータの処理対象は1ワード16ビット幅固定なので1ワード8ビット幅の文字列処理は得意ではありません、以下のようにメッセージを1バイト単位でパックしてしまうと上位下位バイトの分離が必要になります
.data 0000 2a2a MSG .string "** LCD TEST **" 0001 204c 0002 4344 0003 2054 0004 4553 0005 5420 0006 2a2a
というわけでコーディングをしてみると意外に厄介なことになります
1 ************************************************* 2 * TMS320C25 LCD_TEST C25LCD.asm * 3 ************************************************* 4 5 0000 .bss tmp, 1 6 0001 .bss tmp1, 1 7 8 DELAY .macro ;20us wait 9 RPTK 199 10 NOP 11 .endm 12 13 0000 .text 14 15 0000 c800- LDPK tmp 16 0001 fe80 CALL INIT ;LCD initialize 0002 001b' 17 18 0003 d001 LALK MSG ;message 0004 0000" 19 0005 c006 LARK AR0,7-1 ;charcter number 20 0006 5800- LOOP TBLR tmp ;PMA -> DMA 21 0007 ce1c PUSH 22 0008 4100- LACL tmp 23 0009 cb07 RPTK 7 ;8bit right shift 24 000a ce19 SFR 25 000b 6001- SACL tmp1 26 000c e501- OUT tmp1,pa5 ;upper byte 27 000d DELAY ;40us wait 1 000d cbc7 RPTK 199 1 000e 5500 NOP 28 000f DELAY 1 000f cbc7 RPTK 199 1 0010 5500 NOP 29 30 0011 e500- OUT tmp,pa5 ;lower byte 31 0012 DELAY ;40us wait 1 0012 cbc7 RPTK 199 1 0013 5500 NOP 32 0014 DELAY 1 0014 cbc7 RPTK 199 1 0015 5500 NOP 33 34 0016 ce1d POP 35 0017 cc01 ADDK 1 36 0018 fb90 BANZ LOOP,*- 0019 0006' 37 38 001a ce1e TRAP 39 40 001b ca38 INIT LACK 38h ;function set 41 001c fe80 CALL CMDSET 001d 002e' 42 001e ca06 LACK 06h ;entry mode set 43 001f fe80 CALL CMDSET 0020 002e' 44 0021 ca0c LACK 0ch ;display on/off control 45 0022 fe80 CALL CMDSET 0023 002e' 46 0024 ca01 LACK 01h ;clear display 47 0025 fe80 CALL CMDSET 0026 002e' 48 0027 5588 LARP AR0 49 0028 d000 LARK AR0,16000 ;1.6ms wait 0029 3e80 50 002a 5500 CLOOP NOP 51 002b fb90 BANZ CLOOP,*- 002c 002a' 52 002d ce26 RET 53 54 002e 6000- CMDSET SACL tmp 55 002f e400- OUT tmp,pa4 56 0030 DELAY 1 0030 cbc7 RPTK 199 1 0031 5500 NOP 57 0032 DELAY 1 0032 cbc7 RPTK 199 1 0033 5500 NOP 58 0034 ce26 RET 59 : 65 66 0000 .data 67 0000 2a2a MSG .string "** LCD TEST **" 0001 204c 0002 4344 0003 2054 0004 4553 0005 5420 0006 2a2a 68 69 .end
表示は問題なく出るわけですが。。。