[目次]

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「初期診断プログラムのソースリスト」に掲載されている。


1.初期診断プログラムの概要

 この章では初期診断プログラムの目的及び初期診断プログラムの基本的仕様について述べる。

[目的]
 初期診断プログラム(ITP:Initial Test Program)は、MIRS競技用プログラムに組み込まれ、競技の直前にCPUの機能及びCPUと各機能のインタフェース状態を診断することを目的とする。

[基本仕様]
動作状態  MIRSシステムのすべてのハードウェアを実装した状態
動作タイミング  MIRSのメインスイッチが押されたとき

 MIRSのリセットボタンが押されたとき

動作時間  システム初期状態が正常とみなされたとき ---- 約8秒

 システム初期状態が異常とみなされたとき ---- 停 止

プログラムの大きさ  約2.2KB(エントリー,I/O操作関数群を含む)


2.初期診断プログラムの構成

 この章では初期診断プログラムのモジュール間構成及び各モジュールの詳細について述べる。

2.1 モジュール構成


 初期診断プログラムは以下に示す11個のモジュールあるいは関数群から成る。

  1)  初期診断プログラムメインモジュール
  2)  CPU試験モジュール
  3)  ROM試験モジュール
  4)  RAM試験モジュール
  5)  マンマシンインタフェースボード試験モジュール
  6)  ロータリエンコーダ・タッチセンサボード試験モジュール
  7)  PWM回路試験モジュール
  8)  超音波センサ回路・赤外線センサ回路試験モジュール
  9)  初期化関数群
  10) 7セグメントLED表示用モジュール
  11) I/O操作関数群

 [各モジュールの詳細については2.2章参照]
 これら11個のモジュール構成をFig.1に示す。

Fig.1 初期診断プログラムモジュール構成
11KB


2.2 各モジュール詳細

 この章では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に示す。

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に示す。

Table 2 I/O操作関数群の詳細
関 数 名 プロトタイプ 機  能
バイト入力関数 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)に書き込む。


3.競技用プログラムへの組み込み

 この章では初期診断プログラムの競技用プログラムの中での使用法について述べる。

3.1 初期診断プログラムの組み込み


  初期診断プログラムを組み込むにあたって以下が必要である。
  1)itp()のextern宣言
  2)グローバル変数green,red,led[]の宣言
  3)割込みハンドラの定義
 初期診断プログラムは競技用プログラムのメイン関数に入って最初に呼ばれるようにする。
 競技用プログラムにおいて、"def.h"をインクルードすることによってレジスタ・シンボルが使用できる。また、inportb(),outportb(),inportl(),outportl(),led_set(),led_set_all()をextern宣言することによって、それら関数が使用できる。
 競技用プログラムの書式例を下に示す。

	#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() {.....}


3.2 システムの初期化について


 初期診断プログラムはその過程で各ボードのポートモード,リセット等の初期化を行なうため、初期診断プログラムが終了した時点でシステムの初期化が完了していることになる。
 ただし、タイマ割込みの周期設定は競技用プログラムのプログラマに委ねる。
  タイマ割込み周期設定 : outportb(ICR0,dd);
   dd : 設定値は Real Time Clock マニュアル参照。
タイマをスタート/ストップを行なう命令を以下に示す。
  タイマスタート : outportb(RTMR,0x18);
  タイマストップ : outportb(RTMR,0x00);
 また、各割込みを許可するためには以下の命令を実行する必要がある。
タイマ割込み許可   : outportb(MSR,0x44);
  スイッチ割込み許可  : outportb(PBCR0,0x84);
  タッチセンサ割込み許可: outportb(VIMR,0x10); outportb(TSIE,0x01);
  超音波センサ割込み許可: outportb(VIMR,0x02); outportb(PACR2,0x7b);
  赤外線センサ割込み許可: outportb(VIMR,0x02); outportb(PBCR2,0x32);
さらにこれらの割込みを許可するためには次の命令が必要である。
  asm(" MOVE #$2000,SR ");
尚、ICR0,RTMR,MSR,PBCR0,VIMR,TSIE,PACR2,PBCR2 は”def.h”で定義されている。



4.ROMへの書き込み

 この章では初期診断プログラムを組み込んだ競技用プログラムのROMへの書き込み方法について述べる。

4.1 実行形式ファイルの生成


 プログラムをROMライターに転送するためにモトローラSフォーマット2)の実行形式を得る必要がある。モトローラSフォーマットの実行形式を生成するためには、コマンドファイル(拡張子.cmd)において”format s”を有効にする。
 2)転送フォーマットに関してはROMライターマニュアルの資料第A章参照。

 ROMライター(PECKER11)のコマンドの詳細についてはROMライターのマニュアル(PKW−1100 USER’S MANUAL)に委ねる。


4.2 ROMライターセットアップ


 ROMライターの電源を入れ以下の設定を行なう。
 1)RS-232C ビットフォーム設定
   転送ビットフォームを”データ長8bit ストップビット1bit パリティなし”に設定。
   command : [SET][0] { [SET]or[-]で"D8 S1 No"を選択 } [JOB]

 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]


4.3 コード転送


 ワークステーションからROMライターにプログラムコードを転送する。
 RS-232C 受信コマンド、
 command : [JOB][D][0][SET]
を実行すると、ワークステーションからのデータ待ちとなる。その後、ワークステーションからROMユーティリティを実行形式のファイル名を引数として実行する。
 % /usr/local/bin/rom ********.x ("********"はファイル名、拡張子".x"は省略可)


4.4 チェックサムの算出


 プログラムのチェックサムを求める。
 ここではROMサイズが128KBの場合3)で説明をすすめる。
 対象デバイス・アドレス領域設定・コマンドで、領域を0000000016〜0000FFFD16に設定する。
 command : [JOB][SET][6] 00000000 [SET] 0000FFFD [SET]
その後、チェックサム・コマンドを実行することによってこの領域のチェックサムが表示される。
 command : [JOB][7][JOB]
SumB=VVWWは偶数バイトの、SumC=XXYYは奇数バイトのチェックサムである。この2つのサムをメモしておく。バッファRAM編集・コマンドでチェックサムをバッファRAMに書き込む。書き込むアドレスは VV を 0001FFFC16 番地に、WW を 0001FFFD16 番地に、XX を 0001FFFE16 番地に、YY を 0001FFFF16 番地に格納する。
 command : [JOB][0] 0001FFFC [SET] VV [SET] WW [SET] XX [SET] YY [SET]
 3)ROMサイズが128KBでない場合は、"itp_def.h" の ROM_SIZEを(ROMサイズ)/2-2, CHK_SUM_Eを00F0000016+(ROMサイズ)-4,CHK_SUM_Oを00F0000016+(ROM»²½Þ)-2にし、対象デバイス・アドレス領域は00000000〜(ROM_SIZE-1)に設定する。


4.5 ROM焼き


 プログラムをROMに焼き付ける。
 対象デバイス・アドレス領域設定・コマンドで、領域を0000000016〜0001FFFF164)に設定する。
 command : [JOB][SET][6] 00000000 [SET] 0001FFFF [SET]
その後、オートプログラム・コマンドを実行してバッファRAMの内容をROMに書き込む。
 command : [PROG][SET]
しばらくしてROMの横のランプが赤く点灯したら書き込み失敗を示す。ROMが破損してなく、かつ消去済みならばかきこみは成功する。
 4)ROMが128KBでない場合は、対象デバイス・アドレス領域を00000000〜(ROMサイズ-1)に設定する。


'94MIRS V-Project仕様書体系へ戻る