;selfwork ちょろQ 2011/02/17 retestd を改良
;停止時逆転を挿入 2011/04/24 smartA2
;停止時逆転を修正 2011/04/25 smartA3
;BKDRIVE挿入 2011/06/19
;;停止確認program 2011/06/19


include 16f84.h
.osc hs
.wdt off

inp_0 = ra.0 ;portA_1bit
inp_1 = ra.1
inp_2 = ra.2
inp_3 = ra.3 ;portA_3bit

org 0ch
tim0 ds 1 ;tim0
tim1 ds 1 ;tim1〜tim2 を変数として使う
tim2 ds 1
count ds 1 ;宣言
countf ds 1 ;前進カウンター
countb ds 1 ;後退カウンター
org 0
goto start
start
clr ra
clr rb
mov !ra,#01111b ;port ra input
mov !rb,#0 ;port rb output

main
call start_flsh ;フラッシュ スタート


ruoop
mov w,#00000001b ;前進スタート
mov rb,w
mov tim0,#26
call frdrive


ropc mov w,#00000110b ;左曲がり後退
mov rb,w
mov tim0,#25
call bkdrive ;BKDRIVE挿入

ropd mov w,#00000101b ;右曲がり前進 修正
mov rb,w
mov tim0,#30
call frdrive

mov w,#00000101b ;左曲り前進
mov rb,w
mov tim0,#40
call frdrive

roopb mov w,#00001001b ;右曲がり前進
mov rb,w
mov tim0,#40
call frdrive

fropa mov w,#00000110b ;右曲がり後退
mov rb,w
mov tim0,#35
call bkdrive ;BKDRIVE挿入

fropb mov w,#00000101b ;右曲り前進  修正
mov rb,w
mov tim0,#50
call frdrive

fropc mov w,#00001001b ;左曲り前進
mov rb,w
mov tim0,#50
call frdrive


goto ruoop



stop mov w,#00000000b ;停止
mov rb,w
mov tim0,#7
call wait

goto stop ;ropc


wait
wa0 clr tim1
wa1 mov tim2,80
wa2 nop
djnz tim2,wa2
djnz tim1,wa1
djnz tim0,wa0
ret

frdrive
frdrive0 clr tim1
frdrive1 mov tim2,#50
frdrive2 call frsens_ck
djnz tim2,frdrive2
djnz tim1,frdrive1
djnz tim0,frdrive0
ret


bkdrive
bkdrive0 clr tim1
bkdrive1 mov tim2,#50
bkdrive2 call bksens_ck
djnz tim2,bkdrive2
djnz tim1,bkdrive1
djnz tim0,bkdrive0
ret



frsens_ck snb inp_0
call sub_0
snb inp_1
call sub_1


bksens_ck snb inp_2
call sub_2
snb inp_3
call sub_3
ret

;センサー0  後 左 検出を検出時の処理
sub_0 mov w,#00000110b ;後退 右曲 ハンドル
mov rb,w
mov tim0,#10 ;wait 10 set
call wait
mov w,#00000010b ;後退 右曲り 直進後退に修正
mov rb,w
mov tim0,#10 ;wait10
call bkdrive
goto ruoop ;ruoop 前進 へ行く ( 直し済み )


sub_1 mov w,#00001010b ;センサー1 前 の右 を検出した時の処理
mov rb,w ;左ハンドル
mov tim0,#10 ;wait set
call wait
mov w,#00000110b ;ハンドルを右に切り換える
mov rb,w ;左ハンドル
mov tim0,#10 ;wait set
call wait
goto ropc ;goto ropb 後退 ( 直し済み )

sub_2 mov w,#00001001b ;センサー2 前左 検出時の処理  修正
mov rb,w
mov tim0,#25 ;前進 右ハンドル
call wait
mov w,#00000101b ;センサー2 前左 検出時の処理 修正
mov rb,w
mov tim0,#15 ;後退 右ハンドル
call frdrive
goto ropd ;前進 ( 直し済み )


sub_3 mov w,#00000101b ;センサー3 後左 検出時の処理 修正
mov rb,w
mov tim0,#25
call frdrive ;前進
mov w,#00000101b ;センサー3 後右 検出時の処理
mov rb,w
mov tim0,#15 ;wait set
call frdrive
goto roopb ;ropb 後退 へ行く


start_flsh
mov count,#10
st_fls mov rb,#10000000b
mov tim0,#5
call wait
mov rb,#00000000b
mov tim0,#5
call wait
djnz count,st_fls
ret

bkstp mov w,#00000010b ;frdrive
mov rb,w
mov tim0,#15
call wait
mov w,#00000001b ;bkdrive
mov tim0,#5
call wait
ret

frstp mov w,#00000001b
mov rb,w
mov tim0,#15
call wait
mov w,#00000010b
mov rb,w
mov tim0,#5
call wait
ret



frsens
snb inp_0
call fsub_0 ;sub_0へ行く
snb inp_1
call fsub_1 ;sub_1へ行く
ret


bksens
snb inp_2
call bsub_2 ;sub_2へ行く
snb inp_3
call bsub_3 ;sub_3へ行く
ret

frnt_brk mov w,#00000010b ;前進時ブレーキソフト
mov rb,w
mov tim0,#5
call wait
ret



fsub_0 mov rb,#10000000b
goto fsub_0

fsub_1 mov rb,#01000000b
goto fsub_1

bsub_2 mov rb,#00100000b
goto bsub_2

bsub_3 mov rb,#00010000b
goto bsub_3


PIC による チョロQ のアセンブラプログラムです
  目  次
  トップページ
 リモコン式チョロQ
  自走式チョロQ
   走行台
 プログラムの準備 
   プログラム
   

 ここでいらんお世話かと思いますが、 製作した PIC で チョロQ は磁気センサー でマグネットの位置を検出しますが、プログラムを 良く見て頂くと、磁気で検出した信号を無視する プログラムがかなり挿入されています。 これが思わぬ動作をする原因ですが 製作者としてはこの方が面白いので こんな形にしています。