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
表示は問題なく出るわけですが。。。
