CPU実験室

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

シリアル連続出力

シリアルコントローラには定番の8251を使っていますが
動作クロックを決めるのが多少厄介です

ボーレートを38400bpsとした場合、
非同期通信なので内部分周比は×16または×64を選択することになりますが
使用した三菱M82C51APFでは、送受信クロックの最大値が615kHzとなっているので×16として
614.4kHzをTxC、RxCに与えます。これは4.9152MHzの水晶の出力を8分周して得られます。
一方メインクロックは送受信クロックの5倍以上、且つデバイスの動作上限6.25MHz以下と規定されて
いるのでこれは5MHzとし、DSPマスタクロック用水晶40MHzを8分周して得ました。
ここはCPLD内の分周用カウンタのタップを切替えるだけで済みますが

イメージ 2


今思えば送受信クロックに5MHzを分周した625kHzを使ってもボーレートは+1.7%くらいのずれなので
水晶は1個でも良かったといえます

ハードを修正して改めてシリアル出力の動作確認をしてみました。
シリアルコントローラの初期化、送信ドライバ部分をサブルーチン化していますが
最近はこれぐらいの長さでもアセンブラで書くのはダルくなります

リカバリタイム確保のためにリピート命令でNOPを挿入しています

       1            *************************************************
       2            *       TMS320C25 SIO_TEST C25SIO.asm          *
       3            *************************************************
       4            
       5 0000               .bss    tmp,    1
       6 0001               .bss    txdata, 1
       7 0002               .bss    rxdata, 1
       8            
       9            DELAY   .macro
      10                    RPTK    32
      11                    NOP
      12                    .endm
      13            
      14 0000               .text
      15                    
      16 0000 c900          LDPK    100h
      17 0001 fe80          CALL    INIT
         0002 000d' 
      18 0003 6001- LOOP    SACL    txdata
      19 0004 e201-         OUT     txdata,PA2
      20 0005 ce0c          RXF
      21 0006 fe80          CALL    SEND
         0007 0023' 
      22 0008 ce0d          SXF
      23 0009 2001-         LAC     txdata
      24 000a cc01          ADDK    1
      25 000b ff80          B       LOOP
         000c 0003' 
      26                    
      27 000d ca00  INIT    LACK    0
      28 000e fe80          CALL    CMDSET
         000f 001e' 
      29 0010 fe80          CALL    CMDSET
         0011 001e' 
      30 0012 fe80          CALL    CMDSET
         0013 001e' 
      31 0014 ca40          LACK    040h     ;command RESET
      32 0015 fe80          CALL    CMDSET
         0016 001e' 
      33 0017 ca4e          LACK    04eh     ;mode 1stopbit,parity disable,8bitchar,*16
      34 0018 fe80          CALL    CMDSET
         0019 001e' 
      35 001a ca37          LACK    037h     ;command RTS,DTR=ON,ERRreset,TXRXenable
      36 001b fe80          CALL    CMDSET
         001c 001e' 
      37 001d ce26          RET
      38            *
      39 001e 6000- CMDSET  SACL    tmp
      40 001f e100-         OUT     tmp,pa1
      41 0020               DELAY
1        0020 cb20          RPTK    32
1        0021 5500          NOP
      42 0022 ce26          RET
      43            
      44 0023 8100- SEND    IN      tmp,pa1
      45 0024 ca01          LACK    1
      46 0025 4e00-         AND     tmp
      47 0026 f680          BZ      SEND
         0027 0023' 
      48 0028 e001-         OUT     txdata,pa0
      49 0029               DELAY
1        0029 cb20          RPTK    32
1        002a 5500          NOP
      50 002b ce26          RET
      51                            
      52 002c 8100- RECV    IN      tmp,pa1
      53 002d ca02          LACK    2
      54 002e 4e00-         AND     tmp
      55 002f f680          BZ      RECV
         0030 002c' 
      56 0031 8002-         IN      rxdata,pa0
      57 0032               DELAY
1        0032 cb20          RPTK    32
1        0033 5500          NOP
      58 0034 caff          LACK    0ffh
      59 0035 4e02-         AND     rxdata
      60 0036 6002-         SACL    rxdata
      61 0037 ce26          RET
      62                    
      63                    .end



ようやくシリアルの正常動作が確認できました。10ビット分で確かに約3.84kHzとなっています
振幅も約±10Vで問題ありません

イメージ 1