サーボモータの制御を行う。
サーボモータは 20ms のパルスを受信し、その duty 比で回転角を制御します。 パルス幅としては 1ms から 2ms になる。
入力は GP0 から GP2 までの 3bit で、角度を決めます。 サーボへの出力は GP4 です。
割り込みは 256 μs 間隔で発生します。 従って、周期を 20 ms にするには 20/0.256 = 78.125 となります。 そこで、 duty_period(周期)を 80 にします。 この時、 1ms のパルスを作るには clock は大体 4 つ、 2ms のパルスを作る には 8 つになります。 したがって、周期 80 で、On になっている状態が 4 から 8 となるようにコ ントロールします。 プログラムはモータの PWM とほぼ同様です。
プログラムを以下に示す。
#include "sakamoto629.inc"
org 0x0000
goto start
org 0x0004
goto timer0
org 0x0008
start
calibrate
movlw 0x07
movwf CMCON
banksel TRISIO
movlw b'00000111'
movwf TRISIO
timer0_init b'11010000' ; 内部クロック、 PS=1:2
duty_init
movlw d'80' ; 周期
movwf duty_period
main
movf GPIO,0
andlw b'00000111'
call getduty
movwf duty_ratio
goto main
getduty
addwf PCL,1
startduty
retlw d'3'
retlw d'4'
retlw d'5'
retlw d'6'
retlw d'7'
retlw d'8'
retlw d'9'
retlw d'10'
endduty
timer0_prg duty
duty_prg gp4off,gp4on
gp4off
bcf GPIO,4
return
gp4on
bsf GPIO,4
return
end