CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

LCD動作確認

キャラクLCDを動作させようとするといくつか問題が出てきました

 

1.LCDの速度が非常に遅い

 

LCDの/WR信号は簡単のためにGNDに固定してしまったのでコマンド間にはディレイを入れなければなりませんが、これが結構な無駄時間です。
ソフトタイマで処理しようとすると「NOP」は1ステート100nsで処理されます。
また、C25にはハードウェアで命令をリピートできる機能があるので以下のようにするとオーバーヘッドなしで200個実行して正確に20μsをつくれます。(ただし256個まで)

 

DELAY   .macro                  ;20us wait
        RPTK    199
         NOP
        .endm

 

コマンド間は40μs必要なのでこのマクロを2回で行けますが表示のクリアは1.6msもかかるのでNOPを1万6千回実行しなければなりません
DSPは高速演算が身上なので泥臭いヒューマンインターフェース、しかも特に遅いキャラクタ液晶制御なんかやらせたら役不足でかわいそうってことです

 

 

TMS320シリーズはハーバードアーキテクチャが採用されプログラム空間とデータ空間が分離されています。なのでプログラム空間に固定文字列のメッセージデータを埋め込んでいるとそれをデータとして外部に出力する際にいったんデータ空間に持ってこなければなりません。
完全に分離していたらそれはできない筈ですが、実は両方のバスをつなぐブリッジがあり行き来は可能です。ただし明示的に「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

 

表示は問題なく出るわけですが。。。

 

イメージ 1