基本情報技術者 2010年 秋期 午後 問01
温度モニタに関する次の記述を読んで、設問1~3に答えよ。
図1に温度モニタのシステム構成図の一部を示す。
温度の検出範囲は0~99℃とし、対応するA/D変換器の出力値は、0~99の16ビット符号なし2進数とする。このシステムは、タイマ割込み発生時に起動される割込みプログラムの中で温度検出器の出力値をA/D変換器を介して取り込み、2個の7セグメントLEDからなる表示器に表示する。1個の7セグメントLEDには10進数の数字1けたを表示する。検出された温度0~99℃に対して、表示器では“00”~“99”として表示する。
LEDの各セグメントは、対応する出力ポートのビットの値が1のとき点灯し、0のとき消灯する。7セグメントLEDに、“0”~“9”の数字を表示するために、対応する8ビットのデータを数字の字形に合わせて設定する。これらを形状データという。
割込みプログラムが起動するA/D変換の開始から、表示処理の完了までの時間は、タイマ割込み間隔に比べて十分短い。

割込みプログラム中で、各機器に対するデータの読込み及び書込みは各機器に割り当てられたI/Oポート番号を指定して行う。7セグメントLEDが接続されている出力ポートにはI/Oポート番号1が、A/D変換器にはI/Oポート番号2と3がそれぞれ割り当てられている。表1に出力ポートとA/D変換器の動作概要を示す。

設問1:
問題文を見る 下位けたの7セグメントLEDに図2のように“5”を表示したい。出力ポートのビット7〜0に設定すべき形状データとして正しい答えを、解答群の中から選べ。ここで、形状データはビット7を最上位ビットとする16進数で表記する。

解答群
ア:66
イ:B6
ウ:BE
エ:DA
オ:F2
模範解答
イ
解説
解答の導き方
この設問では、下位けたの7セグメントLEDに「5」を表示するため、出力ポートのビット7〜0にどの値を設定するかを考えます。
本文には「LEDの各セグメントは、対応する出力ポートのビットの値が1のとき点灯し、0のとき消灯する」とあります。つまり、「5」の形を作るセグメントに対応するビットを1にし、それ以外を0にします。
図1の配線に従うと、下位けたではビット7から順に、上段、右上、右下、下段、左下、左上、中央のセグメント、小数点に対応します。図2の「5」を見て、各ビットの値を整理すると次のようになります。
したがって、ビット7からビット0までを並べた2進数は「10110110」です。
設問では16進数で答えるよう指定されています。2進数を4ビットずつ区切ると、1011と0110です。1011は16進数でB、0110は6なので、形状データは「B6」です。よって、該当する選択肢はイです。
誤りやすいポイント
- ビットの並びを逆にしないようにします。設問ではビット7が最上位ビットなので、ビット7からビット0へ並べます。
- 点灯するセグメントだけでなく、小数点に対応するビットも考えます。図1では小数点は消灯なので、ビット0は0です。
- ビットの値は「点灯なら1、消灯なら0」です。消灯する部分のビットを1にしないよう注意してください。
- 2進数を16進数に直すときは、右から4ビットずつ区切ります。1011と0110をそれぞれ16進数に変換します。
FAQ
Q: 7セグメントLEDなのに、なぜビットが8個あるのですか?
A: 7個の数字表示用セグメントに加えて、小数点を表示する部分があるためです。合わせて8ビットになります。
A: 7個の数字表示用セグメントに加えて、小数点を表示する部分があるためです。合わせて8ビットになります。
Q: 「5」では、どの部分を点灯させますか?
A: 上段、右下、下段、左上、中央です。図2でも、この5か所が点灯しています。
A: 上段、右下、下段、左上、中央です。図2でも、この5か所が点灯しています。
Q: 2進数の1011が16進数のBになるのはなぜですか?
A: 4ビットの2進数は、0000から1111までを16進数の0からFに対応させます。1011は10進数で11に当たり、16進数ではBです。
A: 4ビットの2進数は、0000から1111までを16進数の0からFに対応させます。1011は10進数で11に当たり、16進数ではBです。
関連キーワード: 7セグメントLED、2進数、16進数、ビット、出力ポート
設問2:
問題文を見る タイマ割込み発生時に起動される割込みプログラムについて、その処理の流れを図3に示す。図3の処理中のに入れる正しい答えを、解答群の中から選べ。
なお、処理中で使用している擬似命令の意味は表2のとおりとする。


解答群
ア:INPUT 1
イ:INPUT 2
ウ:OUTPUT 1
エ:OUTPUT 2
オ:OUTPUT 3
模範解答
a:エ、b:イ
解説
解答の導き方
図3では、A/D変換を始めてから、変換中かどうかを確かめ、完了したら変換結果を読み込む順に処理します。
A/D変換(Analog-to-Digital:温度などの連続した信号を数値に変換すること)には、開始の指示を出すI/Oポートと、変換結果を読み込むI/Oポートがあります。I/O(Input/Output:機器とのデータの入出力)ポートの役割は、表1に示されています。
-
aでは、A/D変換を開始します。
図3の直前で「GR ← 1」としているので、GR(CPUがデータを一時的に置いておくレジスタ)には値1が入っています。表1には「番号2のI/Oポートに値1を書き込むとA/D変換が開始される」とあります。そのため、GRの値1を番号2のI/Oポートへ書き込む必要があり、aは「OUTPUT 2」です。 -
bでは、変換中かどうかを確認します。
表1によると、番号2のI/Oポートから読み込んだ値が0なら変換中、0以外なら変換完了です。読み込んだ値をGRに設定する命令は「INPUT」なので、bは「INPUT 2」です。 -
GRの値で、次の処理が決まります。
「GR = 0」なら変換中なので、図3のループに従って、もう一度「INPUT 2」で状態を確認します。このループは[A/D変換開始]には戻らないため、変換開始を繰り返すのではなく、完了するまで状態だけを確認します。
「GR = 0」でなければ変換完了です。そこで「INPUT 3」を実行し、番号3のI/Oポートから変換結果を読み込みます。
なお、7セグメントLED(Light Emitting Diode:電気を流すと光る素子)の表示には番号1のI/Oポートを使います。しかし、aは表示ではなくA/D変換の開始、bは変換状態の確認なので、どちらにも番号1は使いません。
誤りやすいポイント
-
aで「OUTPUT 1」を選ぶ
番号1はLED表示用です。A/D変換を開始するには、表1にあるとおり番号2へ値1を書き込みます。 -
bで「INPUT 3」を選ぶ
番号3から読み込むのは、変換が完了した後の温度データです。変換中かどうかの確認には、番号2を使います。 -
GR = 0を、温度が0℃という意味だと考える
この時点でGRに入っているのは番号2のI/Oポートから読み込んだ状態確認の値です。温度データは、変換完了後に番号3から読み込みます。
FAQ
Q: なぜ変換中は、A/D変換の開始命令をもう一度実行しないのですか?
A: 変換開始を繰り返すと、変換が完了する前に再度開始することになります。図3では開始処理の後、状態確認だけを繰り返す流れになっています。
A: 変換開始を繰り返すと、変換が完了する前に再度開始することになります。図3では開始処理の後、状態確認だけを繰り返す流れになっています。
Q: 変換が完了したかどうかは、何を見て判断しますか?
A: 番号2のI/Oポートから読み込んだ値です。0なら変換中、0以外なら変換完了です。
A: 番号2のI/Oポートから読み込んだ値です。0なら変換中、0以外なら変換完了です。
Q: 温度データはどのポートから読み込みますか?
A: 変換が完了した後に、番号3のI/Oポートから読み込みます。
A: 変換が完了した後に、番号3のI/Oポートから読み込みます。
関連キーワード: A/D変換、I/Oポート、割込み処理、レジスタ、ポーリング
設問3:
問題文を見る 割込みプログラムの中で呼び出す手続DISPLAYの仕様と実行例は次のとおりである。実行例に関する記述中のに入れる正しい答えを、解答群の中から選べ。
〔手続DISPLAYの仕様〕
DISPLAYはGRに設定されたデータが示す値を表示器に表示する。7セグメントLEDに“0”〜“9”の数字を表示するために、それぞれ8ビットからなる10個の形状データを表としてプログラム中に保持している。
GRに設定されたデータは、検出した温度に対応する0〜99の16ビット符号なし2進数であり、このまま出力ポートに設定しても意図した表示にはならない。GRの内容を図4のとおり2けたのBCD(2進化10進数)に変換し、表を引き、各けたに対応した形状データを図5のとおりにGRに設定して出力ポートに書き込む。

〔手続DISPLAYの実行例〕
図5のGRの内容が16進数表記でFEFCであったとき、BCD値を格納していた図4のGRの内容は16進数表記でcであり、割込みプログラムから手続DISPLAYに渡されたGRの内容は16進数表記でdである。
cに関する解答群
ア:0008
イ:0309
ウ:0800
エ:0903
オ:0907
dに関する解答群
ア:0008
イ:0027
ウ:0050
エ:005D
オ:0061模範解答
c:ウ、d:ウ
解説
解答の導き方
この問題では、表示器に出す形状データから数字を読み取り、その数字をBCDで表した値と、変換前の数値を求めます。GRは、処理中のデータを一時的に入れておくレジスタ(記憶場所)です。
-
図5の形状データから、表示する数字を読み取ります。図5のGRの内容は16進数表記でFEFCです。図5では、上位けたの形状データが上位8ビット、下位けたの形状データが下位8ビットに置かれています。したがって、上位けたはFE、下位けたはFCです。それぞれを2進数で表すと、次のとおりです。
- FE:11111110
- FC:11111100
7セグメントLED(Light Emitting Diode:発光ダイオードを使い、7本の光る部分で数字を表す表示器)では、7本の部分の点灯・消灯の組合せで数字を表します。問題文には、ビットの値が1なら点灯し、0なら消灯するとあります。また、図1の注記では、ビット0とビット8は小数点用で、常に0に設定するとされています。FEは、小数点用のビットを除く7本がすべて点灯する形なので「8」です。FCは「8」から中央の横棒を消した形なので「0」です。よって、図5の形状データが示す数字は、上位けたが8、下位けたが0です。 -
数字「80」を図4の配置でBCDにします。BCD(Binary Coded Decimal:10進数の各けたをそれぞれ4ビットで表す方式)では、8を1000、0を0000で表します。図4では、上位けたのBCDと下位けたのBCDの間などに、値を入れない4ビットの部分があります。図4の配置に従うと、GRは次の並びになります。0000 1000 0000 0000これを16進数で表すと0800です。したがって、cは解答群のウです。
-
BCDに変換する前の数値を16進数にします。BCDが表している数値は10進数の80です。16進数の50は、 なので、10進数の80に当たります。GRは16ビットなので、上位に0を補って0050と表します。したがって、dも解答群のウです。
誤りやすいポイント
- FEFCを、そのまま温度の数値と考えないようにします。ここでは、FEとFCはそれぞれLEDの点灯パターンを表す形状データです。
- BCDの値と、変換前の数値を混同しないようにします。図4の配置で表したBCDの0800と、10進数の80を16進数にした0050は、同じ数値を異なる形式で表しています。
- 16進数の50を10進数の50と読み違えないようにします。16進数の50は、 です。
- 小数点のビットは数字の形を作る7本の部分とは別です。問題文では、小数点用のビットは0で消灯するとされています。
FAQ
Q: BCDの値が0800になるのはなぜですか?
A: BCDでは、8と0をそれぞれ4ビットで表します。図4の配置では、上位けたの8を上位側の指定された場所に置き、下位けたの0を下位側の指定された場所に置くため、16進数表記で0800になります。
A: BCDでは、8と0をそれぞれ4ビットで表します。図4の配置では、上位けたの8を上位側の指定された場所に置き、下位けたの0を下位側の指定された場所に置くため、16進数表記で0800になります。
Q: 形状データのFEFCを、温度の数値として扱わないのはなぜですか?
A: 手続DISPLAYでは、数値をけたごとの形状データに置き換えてから出力します。FEFCは数値そのものではなく、「8」と「0」を点灯させるためのデータだからです。
A: 手続DISPLAYでは、数値をけたごとの形状データに置き換えてから出力します。FEFCは数値そのものではなく、「8」と「0」を点灯させるためのデータだからです。
Q: 10進数の80を16進数で0050とするのはなぜですか?
A: 16進数の各けたは16を単位に表します。5×16に0を足すと80になるため、80は16進数で50です。16ビットの表記にそろえるため、先頭に0を補って0050とします。
A: 16進数の各けたは16を単位に表します。5×16に0を足すと80になるため、80は16進数で50です。16ビットの表記にそろえるため、先頭に0を補って0050とします。
関連キーワード: A/D変換、BCD、7セグメントLED、形状データ、16進数



