エンベデッドシステムスペシャリスト 2021年 午前2 問04
問題文
8ビットの方向レジスタ及びデータレジスタで構成されるI/Oポートがあり、各ビットにLEDが一つずつ負論理で接続されている。システム起動時にLEDの不要な点灯を避けるための手続として、適切なものはどれか。ここで、レジスタに書き込む値は16進数で表現している。

選択肢
ア:データレジスタに00を書き込んでから、方向レジスタにFFを書き込む。
イ:データレジスタにFFを書き込んでから、方向レジスタにFFを書き込む。(正解)
ウ:方向レジスタにFFを書き込んでから、データレジスタに00を書き込む。
エ:方向レジスタにFFを書き込んでから、データレジスタにFFを書き込む。
🔒 解説は解答すると表示されます
負論理I/Oポートの初期化【午前2解説】
正解の理由
LEDは負論理で接続されており、データレジスタの値が 0なら点灯、1なら消灯 します。また、方向レジスタは 0が入力、1が出力 です。
起動時のデータレジスタの値は不定です。そのまま出力に切り替えると、不定値に応じてLEDが点灯するおそれがあります。そこで、まずデータレジスタに
FF を書き込み、全ビットを「消灯」を表す1にします。その後、方向レジスタに FF を書き込み、全ビットを出力にします。この順序に該当するのはイです。
解法ステップ
-
LEDを消灯させるデータ値を確認します。
「0:点灯、1:消灯」なので、全LEDを消灯するには全ビットを1にします。8ビットすべてが1の値はFFです。 -
出力に切り替える前にデータを設定します。
データレジスタは起動時に不定です。先に出力にすると、不定値がLEDに出力される可能性があります。 -
レジスタへの書込み順序を選びます。
データレジスタにFFを書いて消灯状態を準備し、その後、方向レジスタにFFを書いて出力にします。したがって、イが適切です。
選択肢別の誤答解説
-
ア:データレジスタに
00、方向レジスタにFF
データの0はLEDの点灯を表します。全LEDを点灯させる値なので、目的に反します。 -
イ:データレジスタに
FF、方向レジスタにFF
先に全ビットを消灯値の1にし、その後で全ビットを出力にします。不要な点灯を避ける順序です。 -
ウ:方向レジスタに
FF、データレジスタに00
データが不定のまま先に出力へ切り替えます。その時点でLEDが不要に点灯するおそれがあり、さらに後から書く00は点灯を表します。 -
エ:方向レジスタに
FF、データレジスタにFF
最終的には全LEDが消灯しますが、先に出力へ切り替えるため、その瞬間には不定値が出力される可能性があります。書込み順序が不適切です。
よくある誤解
-
「負論理」だから、レジスタには0を書けば消灯する
この問題では、図に「0:点灯、1:消灯」と明示されています。負論理では、一般的な感覚とは逆の値が動作に対応することがあります。 -
最後に消灯値を書けば、途中の順序は気にしなくてよい
起動時の不要な点灯を避けるには、最終状態だけでなく、出力に切り替える前に安全なデータ値を設定することが重要です。 -
方向レジスタの
FFは入力を意味する
この問題では「0:入力、1:出力」です。FFは全ビットを出力に設定します。
補足コラム
方向レジスタで入力から出力へ切り替えると、データレジスタに設定された値が外部端子に現れます。そのため、出力を有効にする前に、出力したい安全な値をデータレジスタへ設定しておくのが基本です。
この問題では、LEDを消灯させる値が
FF なので、データ設定 → 出力設定 の順にします。FAQ
Q. データレジスタに
A. 方向レジスタが入力状態の間は、出力として端子に値を反映しません。その後、出力に切り替えると、設定済みの
FF を書いた時点で、LEDは消灯しますか?A. 方向レジスタが入力状態の間は、出力として端子に値を反映しません。その後、出力に切り替えると、設定済みの
FF が出力されてLEDが消灯します。Q. なぜ方向レジスタのリセット値も確認するのですか?
A. リセット時は全ビットが0で、入力状態です。そのため、起動直後にデータレジスタの値が不定でも、まず安全な値を設定してから出力に切り替える、という手順を判断できます。
A. リセット時は全ビットが0で、入力状態です。そのため、起動直後にデータレジスタの値が不定でも、まず安全な値を設定してから出力に切り替える、という手順を判断できます。
関連キーワード: 負論理、I/Oポート、方向レジスタ、データレジスタ、初期化順序

\ せっかくなら /
エンベデッドシステムスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

