蓄光テープに文字を描くライントレーサですが、
- LANのためのシリアル送受信
- モータ2個のPWM処理
- ライントレース処理
今回は、

LANのためのシリアル送受信
まず重要な点ですが、
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
ソフトウェアで処理する場合、
ここで注意しないといけないのが、
モータのPWM制御
その空きクロックを使って、
なお、
movf posll, 0
addwf pwmval, 0
movlw 0
btfsc STATUS, C
movlw 1
addwf poslh, 0
call getmotor
andlw 0xf0
movwf work0
movf posrl, 0
addwf pwmval, 0
movlw 0
btfsc STATUS, C
movlw 1
addwf posrh, 0
call getmotor
andlw 0xf
iorwf work0, 0
movwf PORTC
incf pwmval, 1
btfss STATUS, Z
goto waitrx1
movf vell, 0
addwf posll, 1
btfsc STATUS, C
incf poslh, 1
movf velr, 0
addwf posrl, 1
btfsc STATUS, C
incf posrh, 1
次に、
HTTPリクエストの生成
いちばん外側の処理は、
main
call traceproc
movlw 0x47 ; 'G'
call sendrs
movlw 0x45 ; 'E'
call sendrs
movlw 0x54 ; 'T'
call sendrs
movlw 0x20 ; ' '
call sendrs
movlw 0x2f ; '/'
call sendrs
movlw 0x75 ; "u"
call sendrs
movlw 0x76 ; "v"
call sendrs
movlw 0x63 ; "c"
call sendrs
movlw 0x61 ; "a"
call sendrs
movlw 0x72 ; "r"
call sendrs
call traceproc
movlw 0x2f ; '/'
call sendrs
movlw 0x3f ; '?'
call sendrs
movlw 0x6f ; 'o'
call sendrs
movlw 0x66 ; 'f'
call sendrs
movlw 0x66 ; 'f'
call sendrs
movlw 0x73 ; 's'
call sendrs
movlw 0x65 ; 'e'
call sendrs
movlw 0x74 ; 't'
call sendrs
movlw 0x3d ; '='
call sendrs
movf recvbuf, 0
call sendrs
call traceproc
movf recvbuf + 1, 0
call sendrs
movf recvbuf + 2, 0
call sendrs
movf recvbuf + 3, 0
call sendrs
movf recvbuf + 4, 0
call sendrs
movf recvbuf + 5, 0
call sendrs
movf recvbuf + 6, 0
call sendrs
movf recvbuf + 7, 0
call sendrs
movlw 0x20 ; ' '
call sendrs
movlw 0x48 ; 'H'
call sendrs
movlw 0x54 ; 'T'
call sendrs
call traceproc
movlw 0x54 ; 'T'
call sendrs
movlw 0x50 ; 'P'
call sendrs
movlw 0x2f ; '/'
call sendrs
movlw 0x31 ; '1'
call sendrs
movlw 0x2e ; '.'
call sendrs
movlw 0x30 ; '0'
call sendrs
movlw 0xd
call sendrs
movlw 0xa
call sendrs
movlw 0xd
call sendrs
movlw 0xa
call sendrs
waitresp
clrf rxdata
waitresp0
call traceproc
movf rxdata, 0
btfsc STATUS, Z
goto waitresp0
xorlw 0xd
btfss STATUS, Z
goto waitresp
clrf rxdata
waitresp1
call traceproc
movf rxdata, 0
btfsc STATUS, Z
goto waitresp1
xorlw 0xa
btfss STATUS, Z
goto waitresp
clrf rxdata
waitresp2
call traceproc
movf rxdata, 0
btfsc STATUS, Z
goto waitresp2
xorlw 0xd
btfss STATUS, Z
goto waitresp
clrf rxdata
waitresp3
call traceproc
movf rxdata, 0
btfsc STATUS, Z
goto waitresp3
xorlw 0xa
btfss STATUS, Z
goto waitresp
clrf rxdata
movlw recvbuf
movwf bufpos
recvbody
call traceproc
movf rxdata, 0
btfsc STATUS, Z
goto recvbody
andlw 0xf0
xorlw 0x30
btfsc STATUS, Z
goto recvbody0
xorlw 0x70
btfsc STATUS, Z
goto recvbody0
xorlw 0x20
btfss STATUS, Z
goto putchar
recvbody0
movf bufpos, 0
movwf FSR
movf rxdata, 0
movwf INDF
incf bufpos, 1
clrf rxdata
movf bufpos, 0
xorlw recvbuf_end
btfss STATUS, Z
goto recvbody
putchar
movlw recvbuf + 8
movwf FSR
movlw 4
movwf work2
putchar0
call traceproc
btfsc posrh, 0
goto putchar0
movf INDF, 0
btfsc INDF, 6
addlw 9 ; 0x61 -> 0x6a
andlw 0xf
movwf work1
swapf work1, 1
incf FSR, 1
movf INDF, 0
btfsc INDF, 6
addlw 9 ; 0x61 -> 0x6a
andlw 0xf
iorwf work1, 0
xorlw 0xff
movwf PORTB
incf FSR, 1
putchar1
call traceproc
btfss posrh, 0
goto putchar1
movlw 0xff
movwf PORTB
decfsz work2, 1
goto putchar0
goto main
サーバはHTTPリクエストを受け取ると、
全体としては、
おわりに
というわけで、
最後までおつき合いいただき、
今回のプログラムソース全体はこちらからダウンロードできます。