HOPE-2023システム詳細

●HOPE-2022● 8bitマイコンを利用して鉄道模型HOゲージを自動運転するシステムです。直列接続した抵抗をマイコン制御のリレーで切り替えて列車の制御をします。ホール素子センサーで列車位置を検出し、往復運転とポイント切り替えによる車庫入れ運転の2種類の自動運転をします。

プログラム解説

概要

今回のHOPE-2022システムのプログラム解説です。
まだこのプログラムには改善の余地がありそうです。

    10 '---20220509ProgStopV5_kaisetsu.txt

行 30-40 システムの初期設定をする

    30 OUT $E3,$82
    40 OUT $E7,$80
30~40 出入力用MSM82C55Aのコントロールワードを設定

解説

行 50 現在地の初期設定をする

    50 P%=1
50 現在位置P%(POINT)を1に設定

解説

行 60-70 フラグの初期設定をする

    60 SUB%=0:ST%=0
    70 MUKI%=0:PMUKI%=0
60 ポイント切り替えの制御SUB%を本線側にして、車両を待避線に格納するかどうかのST%(STOP)を格納しないように設定する
70 現在の進行方向MUKI%と目的地に到着してからの進行方向をPMUKI%(POINT-MUKI)を右に設定する

解説

行 80-90 システムの出力を一時停止させる

    80 OUT $E0,0
    90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,239
80 列車を停止させる
90 ポイント切り替えを制御するソレノイドの電源を切る

解説

行 100 入力されたデータを変数に格納する

   100 INPUT "PROG?1-5>>>"PROG$
100 命令入力をPROG$に格納する

解説

行 110 入力されたデータの文字数を数える

   110 N%=LEN(PROG$)
110 命令入力の文字数をカウントし、N%に格納する

解説

行 112-118 発車音を鳴らす

   112 '---TONE=F
   115 BEEP INT(50000/440.0)
   118 GOSUB 600
115 発車音代わりに0.1秒間"ラ"の音を鳴らす
118 行番号600(FOR文による遅延プログラム)で発車までの間隔をあける

解説

行 120-150 初期設定をして列車を発車させる

   120 OUT $E0,254
   130 HUA%=0:HUB%=0
   150 SHUT$="O"
120 列車を発車させる
130 踏切用フラグHUA%,HUB%(HUMIKIRI-A,HUMIKIRI-B)をそれぞれ0にする
150 踏切開閉を制御するSHUT$をO(OPEN)にする

解説

行 160 入力されたデータの文字数をループ回数に設定する

   160 FOR C%=1 TO N%
160 メインシステムのループを、N%(L-110)回繰り返す

解説

行 170-180 入力されたデータから順番に一文字ずつ抜き出す

   170 P%=VAL(RIGHT$(LEFT$(PROG$,C%),1))
   180 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
170~180 プログラムを1文字ずつ順番に抜き出してP%(POINT),PF%(POINT-FUTURE)に格納する

解説

行 190-195 デバッグ用に変数を表示する

   190 PRINT " LOOP >>> ",C%
   195 PRINT P%,PF%
190~195 デバッグ用プリント

解説

行 210-230 入力されたデータをもとに到着後の方向を割り出す

   210 IF P%<PF% THEN PMUKI%=0
   220 IF P%>PF% THEN PMUKI%=1
   230 IF P%=PF% GOTO 660
210~220 目的地とスタート位置から到着後の方向を割り出す
230 目的地とスタート位置が同じ場合、GOTO 660(NEXT C%)でループを飛ばす

解説

行 263-270 緊急停止ボタンの設定

   263 H%=IN($E1)
   270 IF (BIT(H%,3)=0)*(ST%=0)THEN P%=3:PF%=2:PRINT "STOP":ST%=1:GOTO 210
263-270 ボタン1が押され、かつ車両格納フラグが0の場合、車両格納フラグを1にして、GOTO 210(PMUKI%の更新)をする

解説

行 280-430 ホールICセンサーの出力を読み取ってフラグを入力する

   280 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
   290 '
   300 IF BIT(H%,1)=1 THEN MUKI%=0
   310 IF (BIT(H%,1))*(ST%=1) THEN ST%=0:GOTO 730
   315 IF (BIT(H%,1))*(C%=1) THEN SUB%=1
   320 '
   330 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 690
   340 IF (BIT(H%,5))*(P%=3)THEN MUKI%=PMUKI%
   350 IF (BIT(H%,5))*(P%>3)THEN MUKI%=0
   360 IF (BIT(H%,5))*(P%<3)THEN MUKI%=1
   370 '
   380 IF BIT(H%,4)=1 THEN HUB%=1
   390 IF (BIT(H%,4))*(P%=4)THEN MUKI%=PMUKI%
   400 IF (BIT(H%,4))*(P%>4)THEN MUKI%=0
   410 IF (BIT(H%,4))*(P%<4)THEN MUKI%=1
   420 '
   430 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
280~430 ホールICの入力によって踏切制御HUA%,HUB%とMUKI%を設定する

解説

行 435-450 2つのフラグを踏切の開閉フラグにまとめる

   435 IF HUA%+HUB%=0 THEN SHUT$="O"
   440 IF HUA%+HUB%=1 THEN SHUT$="C"
   450 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 600
435~450 踏切の開閉を認識する

解説

行 470-480 踏切開閉の操作

   470 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
   480 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
470~480 踏切の開閉を出力する

解説

行 500-533 ポイント切り替えの動作

   500 PT%=255
   510 IF SUB%=0 THEN RES PT%,7
   520 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
   530 OUT $E5,PT%
   533 GOSUB 600
500~530 ポイント切り替えの出力をする
533 遅延プログラムに移動

解説

行 540-590 センサー番号からポート番号に変換する

   540 IF P%=1 THEN A%=7
   550 IF P%=2 THEN A%=1
   560 IF P%=3 THEN A%=5
   570 IF P%=4 THEN A%=4
   580 IF P%=5 THEN A%=6
   590 IF BIT(H%,A%)GOTO 650 ELSE GOTO 250
540~590 センサー番号からポート番号に変換する

解説

行 600-640 FOR文を用いた遅延サブルーチン

   600 FOR LOOP%=1 TO 300
   630 NEXT LOOP%
   640 RETURN 
600~640 FOR文を用いた遅延プログラム

解説

行 650-670 ループの頭へ戻り、すべてのループが終了したあとに入力待ち状態へ移行する

   650 PRINT "PASS POINT>>>",A%
   660 NEXT C%
   670 GOTO 80
650 ディスプレイ用出力
660~670 FOR文の終了と、入力待ち状態への移行

解説

行 690-710 方向を制御して出力する

   690 IF PF%=2 THEN SUB%=1:MUKI%=1
   700 IF PF%=1 THEN SUB%=0:MUKI%=1
   710 RETURN

解説

行 730-760 緊急停止後に駅に戻るかどうか確認する

   730 OUT $E0,0:PRINT "RESET?"
   740 FOR CON%=0 TO 2500
   750 IF BIT(IN($E1),2)=0 THEN PROG$="2351":GOTO 110
   755 IF INT(CON%/250)=(CON%/250) THEN PRINT 10-(CON%/250) 
   760 NEXT CON%

解説

行 770 データの入力待ちに移行する

   770 GOTO 60

解説

プログラム全文

    10 '---20220509ProgStopV5.txt
    30 OUT $E3,$82
    40 OUT $E7,$80
    50 P%=1
    60 SUB%=0:ST%=0
    70 MUKI%=0:PMUKI%=0
    80 OUT $E0,0
    90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,239
   100 INPUT "PROG?1-5>>>"PROG$
   110 N%=LEN(PROG$)
   112 '---TONE=F
   115 BEEP INT(50000/440.0)
   118 GOSUB 600
   119 '
   120 OUT $E0,254
   130 HUA%=0:HUB%=0
   150 SHUT$="O"
   156 '
   160 FOR C%=1 TO N%
   170 P%=VAL(RIGHT$(LEFT$(PROG$,C%),1))
   180 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
   190 PRINT " LOOP >>> ",C%
   195 PRINT P%,PF%
   200 '
   210 IF P%<PF% THEN PMUKI%=0
   220 IF P%>PF% THEN PMUKI%=1
   230 IF P%=PF% GOTO 660
   240 '
   250 '-----MAIN-----
   260 '
   263 H%=IN($E1)
   266 '
   270 IF (BIT(H%,3)=0)*(ST%=0)THEN P%=3:PF%=2:PRINT "STOP":ST%=1:GOTO 210
   275 '
   280 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
   290 '
   300 IF BIT(H%,1)=1 THEN MUKI%=0
   310 IF (BIT(H%,1))*(ST%=1) THEN ST%=0:GOTO 730
   315 IF (BIT(H%,1))*(C%=1) THEN SUB%=1
   320 '
   330 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 690
   340 IF (BIT(H%,5))*(P%=3)THEN MUKI%=PMUKI%
   350 IF (BIT(H%,5))*(P%>3)THEN MUKI%=0
   360 IF (BIT(H%,5))*(P%<3)THEN MUKI%=1
   370 '
   380 IF BIT(H%,4)=1 THEN HUB%=1
   390 IF (BIT(H%,4))*(P%=4)THEN MUKI%=PMUKI%
   400 IF (BIT(H%,4))*(P%>4)THEN MUKI%=0
   410 IF (BIT(H%,4))*(P%<4)THEN MUKI%=1
   420 '
   430 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
   433 '
   435 IF HUA%+HUB%=0 THEN SHUT$="O"
   440 IF HUA%+HUB%=1 THEN SHUT$="C"
   450 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 600
   460 '
   470 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
   480 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
   490 '
   500 PT%=255
   510 IF SUB%=0 THEN RES PT%,7
   520 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
   530 OUT $E5,PT%
   533 GOSUB 600
   538 '
   540 IF P%=1 THEN A%=7
   550 IF P%=2 THEN A%=1
   560 IF P%=3 THEN A%=5
   570 IF P%=4 THEN A%=4
   580 IF P%=5 THEN A%=6
   590 IF BIT(H%,A%)GOTO 650 ELSE GOTO 250
   595 '
   600 FOR LOOP%=1 TO 300
   630 NEXT LOOP%
   640 RETURN 
   645 '
   650 PRINT "PASS POINT>>>",A%
   660 NEXT C%
   670 GOTO 80
   680 '
   690 IF PF%=2 THEN SUB%=1:MUKI%=1
   700 IF PF%=1 THEN SUB%=0:MUKI%=1
   710 RETURN
   720 ' 
   730 OUT $E0,0:PRINT "RESET?"
   740 FOR CON%=0 TO 2500
   750 IF BIT(IN($E1),2)=0 THEN PROG$="2351":GOTO 110
   755 IF INT(CON%/250)=(CON%/250) THEN PRINT 10-(CON%/250) 
   760 NEXT CON%
   770 GOTO 60