蓄光テープに文字を描くライントレーサですが,マイコンの内部ではいろいろな処理を行っています。
- LANのためのシリアル送受信
- モータ2個のPWM処理
- ライントレース処理
今回は,どのようにしてこれらの処理を行ったかを解説します。ぜひマイコンで制御を行う際の参考にしてください。
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クロックほど余裕があることになります。

