エンジニアの夏休み:蓄光テープで「省エネディスプレイ」を作る

第4回 本体側の文字描画処理はどうなっているのか?

この記事を読むのに必要な時間:およそ 5 分

蓄光テープに文字を描くライントレーサですが,マイコンの内部ではいろいろな処理を行っています。

  • LANのためのシリアル送受信
  • モータ2個のPWM処理
  • ライントレース処理

今回は,どのようにしてこれらの処理を行ったかを解説します。ぜひマイコンで制御を行う際の参考にしてください。

LED文字描画システム全体

LED文字描画システム全体

LANのためのシリアル送受信

まず重要な点ですが,今回はシリアル送受信をソフトウェアでおこないました。PICには内蔵シリアルもあるのですが,使えるピンが固定されています。今回は8bit連続で取りたかったので,シリアルをソフトウェアで処理するようにしました。

リスト1 シリアル送受信処理

waitrx1
    movlw    0x55            ; (87clk - 2)
    subwf    TMR0, 1
waitrx0
    btfsc    TMR0, 7
    goto    waitrx0
    
    movf    rxphase, 0
    addwf    rxphase, 0
    incf    rxphase, 1
    
    addwf    PCL, 1
    
        ; 0:start
    btfsc    PORTA, PORTA_RX
    clrf    rxphase
    
    retlw    0
    nop
    
    retlw    0
    nop
        ; 3:bit0
    clrf    rxwork
    retlw    0
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 0
    
    retlw    0
    nop
        ; 6:bit1
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 1
    
    retlw    0
    nop
        ; 9:bit2
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 2
    
    retlw    0
    nop
        ; 12:bit3
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 3
    
    retlw    0
    nop
        ; 15:bit4
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 4
    
    retlw    0
    nop
        ; 18:bit5
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 5
    
    retlw    0
    nop
        ; 21:bit6
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 6
    
    retlw    0
    nop
        ; 24:bit7
    retlw    0
    nop
    
    btfsc    PORTA, PORTA_RX
    bsf    rxwork, 7
    
    retlw    0
    nop
        ; 27:stop
    movf    rxwork, 0
    movwf    rxdata
    clrf    rxphase
    retlw    0

ソフトウェアで処理する場合,ビットレートの3倍,たとえば9600bpsなら28800bpsで,約35μsごとにタイマ処理をおこないます。この中で,スタートビットを検出してから4クロック後をビット0,7クロック後をビット1というように読み込みます。すると,他の処理を行いながらシリアルを受信することができます。

ここで注意しないといけないのが,マイコンのクロック数です。今回は20MHzを使ったので,1命令を0.2μsで実行できます。シリアル受信は35μs間隔ですから,この中で約175命令を実行できます。今回のコードでは,シリアル受信部分がcall/returnを含めて20クロック弱ですから,タイマ処理ごとにあと150クロックほど余裕があることになります。

著者プロフィール

木元峰之(きもとみねゆき)

独立系ソフトハウスに8年間勤務,パッケージソフトの開発や記事執筆などを行う。現在はフリーのコンサルタント。SWESTなどのワークショップで分科会のコーディネータを務める。デジタル回路設計歴30年,プログラミング歴27年。

きもと特急電子設計
URL:http://business.pa-i.org/

コメント

コメントの記入