1.初期診断プログラムの概要 --------------------------------------------- 1
2.初期診断プログラムの構成
2.1 モジュール構成 ------------------------------------------------- 2
2.2 各モジュール詳細 ----------------------------------------------- 3
2.2.1 初期診断プログラムメインモジュール --------------------- 3
2.2.2 CPU試験モジュール ----------------------------------- 3
2.2.3 ROM試験モジュール ----------------------------------- 3
2.2.4 RAM試験モジュール ----------------------------------- 3
2.2.5 マンマシンインタフェースボード試験モジュール ----------- 3
2.2.6 ロータリエンコーダ・タッチセンサボード試験モジュール --- 4
2.2.7 PWM回路試験モジュール ------------------------------- 4
2.2.8 超音波センサ回路・赤外線センサ回路試験モジュール ------- 4
2.2.9 初期化関数群 ------------------------------------------- 4
2.2.10 7セグメントLED表示用モジュール --------------------- 5
2.2.11 I/O操作関数群 --------------------------------------- 6
3.競技用プログラムへの組み込み
3.1 初期診断プログラムの組み込み ----------------------------------- 7
3.2 システムの初期化について --------------------------------------- 8
4.ROMへの書き込み
4.1 実行形式ファイルの生成 ----------------------------------------- 9
4.2 ROMライターセットアップ ------------------------------------- 9
4.3 コード転送 ----------------------------------------------------- 9
4.4 チェックサムの算出 --------------------------------------------- 10
4.5 ROM焼き ----------------------------------------------------- 10
注)初期診断プログラムのソースファイルは、NCT−電子制御−9404−1−4「初期診断プログラムのソースリスト」に掲載されている。
この章では初期診断プログラムの目的及び初期診断プログラムの基本的仕様について述べる。
[目的]
初期診断プログラム(ITP:Initial Test Program)は、MIRS競技用プログラムに組み込まれ、競技の直前にCPUの機能及びCPUと各機能のインタフェース状態を診断することを目的とする。
[基本仕様]
動作状態 | MIRSシステムのすべてのハードウェアを実装した状態 | |
動作タイミング | MIRSのメインスイッチが押されたとき MIRSのリセットボタンが押されたとき | |
動作時間 | システム初期状態が正常とみなされたとき ---- 約8秒 システム初期状態が異常とみなされたとき ---- 停 止 | |
プログラムの大きさ | 約2.2KB(エントリー,I/O操作関数群を含む) |
この章では初期診断プログラムのモジュール間構成及び各モジュールの詳細について述べる。
1) 初期診断プログラムメインモジュール
2) CPU試験モジュール
3) ROM試験モジュール
4) RAM試験モジュール
5) マンマシンインタフェースボード試験モジュール
6) ロータリエンコーダ・タッチセンサボード試験モジュール
7) PWM回路試験モジュール
8) 超音波センサ回路・赤外線センサ回路試験モジュール
9) 初期化関数群
10) 7セグメントLED表示用モジュール
11) I/O操作関数群
[各モジュールの詳細については2.2章参照]
これら11個のモジュール構成をFig.1に示す。
この章では2.1章で挙げられた11個の各々のモジュールについて詳しく述べていく。
2.2.1 初期診断プログラムメインモジュール
初期診断プログラムメインモジュールは各試験モジュールを順次呼び出し、異常が確認されれば停止(無限ループ)する。
prototype : void itp(void)
2.2.2 CPU試験モジュール
CPU試験モジュールはD0〜D7の8個のデータレジスタについてテストを行なう。
D0〜D7の各々のレジスタについて自身との排他的論理輪をとり、1つでも0にならないレジスタがあればCPU異常とみなす。
prototype : int cpu(void)
戻り値 : 正常→0,異常→1
2.2.3 ROM試験モジュール
ROM試験モジュールはチェックサム格納領域を除くすべてのROM領域についてチェックサム計算をし比較する。
[チェックサムの格納方法については4章を参照]
prototype : int rom(void)
戻り値 : 正常→0,異常→1
2.2.4 RAM試験モジュール
RAM試験モジュールはスタックトップ以降のRAM領域に対して0クリアとFF16フィルを行なう。
RAMに書いたデータとRAMから読んだデータが異なればRAM異常とみなす。
prototype : int ram(void)
戻り値 : 正常→0,異常→1
2.2.5 マンマシンインタフェースボード試験モジュール
マンマシンインタフェースボード試験モジュールはポートの折り返し試験1)と勝敗判定信号のチェックを行なう。
PB4に書いたデータとPB5から読んだデータが異なる、あるいは勝敗判定信号が0でなければ異常とみなす。
prototype : int mmi(void)
戻り値 : 正常→0,異常→1
1)折り返し試験については”自律知能ロボット用制御システムの開発(その1 システム概要とテストプログラム)”の3−1章参照。
2.2.6 ロータリエンコーダ・タッチセンサボード試験モジュール
ロータリエンコーダ・タッチセンサボード試験モジュールはカウンタとタッチセンサデータの初期状態を確かめる。
カウンタが0でない、またはタッチセンサが反応している場合、異常があるとみなす。
prototype : int re_ts(void)
戻り値 : 正常→0,異常→1
2.2.7 PWM回路試験モジュール
PWM回路試験モジュールはポートの折り返し試験を行なう。
PA0に書いたデータとPC0から読んだデータが異なる、あるいはPB0に書いたデータとPC1から読んだデータが異なれば異常とみなす。
prototype : int pwm(void)
戻り値 : 正常→0,異常→1
2.2.8 超音波センサ回路・赤外線センサ回路試験モジュール
超音波センサ回路・赤外線センサ回路試験モジュールはポートの折り返し試験を行なう。
PA0,PA1に書いたデータとPA4,PA5から読んだデータが異なれば異常とみなす。
prototype : int sss_ps(void)
戻り値 : 正常→0,異常→1
2.2.9 初期化関数群
初期化関数群は以下に示す6個の関数から成る。
1)リアルタイムクロック・クリア関数
2)タイマ初期化関数
3)7セグメントLED初期化関数
4)マンマシンインタフェースボード初期化関数
5)ロータリエンコーダ・タッチセンサボード初期化関数
6)PWM回路初期化関数
7)超音波センサ回路・赤外線センサ回路初期化関数
この7個の関数のシンタックス,機能をTable 1に示す。
関 数 名[プロトタイプ] | 機 能 | |
リアルタイムクロック・クリア関数 prototype : void rtc_clr(void) | CPUボード上のリアルタイムクロックのレジスターをクリアする。 | |
タイマ初期化関数 prototype : void tm_init(void) | リアルタイマを初期化する。 | |
7セグメントLED初期化関数 prototype : void led_init(void) | CPUボード上PI/Tを初期化する。[mode0 submode1X(PortA)] | |
マンマシンインタフェースボード初期化関数 prototype : void mmi_init(void) | CPUボード上PI/Tを初期化する。[mode0 submode1X(PortB)] | |
ロータリエンコーダ・タッチセンサボード初期化関数 prototype : void re_ts_init(void) | カウンタをリセットする。 | |
PWM回路初期化関数 prototype : void pwm_init(void) | IP-Digital48のPI/T(X)を初期化する。[mode0 submode1X] | |
超音波センサ回路・赤外線センサ回路初期化関数 prototype : void sss_ps_init(void) | IP-Digital48のPI/T(Y)を初期化する。 [mode0 submode01(PortA)] [mode0 submode00(PortB)] |
2.2.10 7セグメントLED表示用モジュール
7セグメントLED表示用モジュールは、
1)7seg.LEDセット関数
2)7seg.LEDオールセット関数
から成る。
[7seg.LEDセット関数]
7seg.LEDセット関数は、指示した桁の7セグメントLEDに指示した値を表示させる関数である。
prototype : void led_set(int led_no,int data)
引数 : led_no→セット桁,data→表示データ
[7seg.LEDオールセット関数]
7seg.LEDオールセット関数は、7セグメントLED4桁に10進数(0000〜9999)を表示させる関数である。
prototype : void led_set_all(int data)
引数 : data→10進データ(0000〜9999)
2.2.11 I/O操作関数群
I/O操作関数群は、
1)バイト入力関数BR>
2)バイト出力関数
3)ロングワード入力関数
4)ロングワード出力関数
から成る。 これらの関数の詳細をTable 2に示す。
関 数 名 | プロトタイプ | 機 能 | |
バイト入力関数 | int inportb(char *port) | portで指定されるI/Oアドレスからデータを読む。 | |
バイト出力関数 | int outportb(char *port ,int data) | portで指定されるI/Oアドレスにdataを書き込む。 | |
ロングワード入力関数 | int inportl(char *port) | hh : I/Oアドレス(port+2)のデータ mm : I/Oアドレス(port+4)のデータ ll : I/Oアドレス(port+6)のデータ として(hhmmll)というデータを返す。 | |
ロングワード出力関数 | int outportl(char *port ,int data) | data = (hhmmll)に対し、hhを(port+2)に、mmを(port+4)に、llを(port+6)に書き込む。 |
この章では初期診断プログラムの競技用プログラムの中での使用法について述べる。
#include "def.h" extern void itp(); extern int inportb(),outportb(),inportl(),outportl(); extern void led_set(),led_set_all(); int led[LED_NO]; /* 7seg.LED用BUFFER */ int green,red; /* 緑LED,赤LED用変数 */ main() { itp(); /* 初期診断プログラム実行 */ /* MIRS MAIN PROGRAM */ ....... ....... ........ } interrupt tmint() { ..... outportb(MRS,TMRST); /* タイマリセット */ } interrupt swint() { outportb(PSR0,0x08); /* H4S クリア */ ..... } interrupt tsint() {.....} interrupt sssint() {.....} interrupt psint() {.....}
この章では初期診断プログラムを組み込んだ競技用プログラムのROMへの書き込み方法について述べる。
ROMライター(PECKER11)のコマンドの詳細についてはROMライターのマニュアル(PKW−1100 USER’S MANUAL)に委ねる。
2)RS-232C 転送速度設定
転送速度(ボーレート)を”9600bps”に設定。
command : [SET][1] { [SET]or[-]で"9600"を選択 } [JOB]
3)RS-232C XON/XOFF設定
XON/XOFF制御を行なうように設定。
command : [SET][4] { [SET]or[-]で"XON/XOFF"を選択 } [JOB]
4)転送フォーマット設定
転送フォーマットを”モトローラ S フォーマット”に設定。
command : [SET][5] { [SET]or[-]で"Motrola"を選択 } [JOB]
5)オフセットアドレス設定
ROM領域の実際の開始アドレスを設定。新システムは 00F0000016 。
command : [SET][6] 00F00000 [SET]
6)セットプログラム設定
ROMとROMライターのバッファRAMのアドレスの対応形式を”Word”に設定。
command : [JOB][SET][2] { [SET]or[-]で"Word"を選択 } [JOB]