2011年 春期 応用情報技術者試験 問7
LEDを使用したディジタル時計の設計に関する次の記述を読んで,設問1〜3に答えよ。
Z社では,6個の7セグメントLEDで年月日及び時分秒を表示するディジタル時計の設計を行っている。
[ディジタル時計の機器構成]
ディジタル時計のブロック図を,図1に示す。このディジタル時計は,LED,MPU,クロックカウンタ,リアルタイムクロック(以下,RTCという),機械的な押しボタン式スイッチ(以下,SWという),及びプログラムで入出力を設定できるプログラマブル入出力装置(以下,PIOという)で構成される。
・LED制御信号:LEDの表示制御を行う信号
・SWの状態:押しボタンスイッチの状態信号
・割込み,時刻データ:RTCからの割込み信号と時刻データ
・割込み:クロックカウンタからの割込み信号
・初期設定データ:各装置への初期設定用データ
[ディジタル時計の動作]
(1) 電源を入れると,初期化プログラムによってRTC,クロックカウンタ,PIOにそれぞれ初期設定データを書き込み,初期化する。SWを押しているときは年月日を表示し,押していないときは時分秒を表示する。
(2) RTCは年月日,時分秒データ(以下,時刻データという)を保持し,RTC自身が時刻を更新する。RTCは1秒ごとにMPUに割込みを行い,RTC割込みハンドラを起動する。RTC割込みハンドラは,RTCから時刻データを読み込む。読み込んだデータは,配列Dateに,西暦年の下2桁た,月,日が格納され,配列Timeに,時,分,秒が格納される。例えば,読み込んだ時刻データが2011年4月17日,12時34分56秒ならば,Date[0]~Date[5]に1,1,0,4,1,7が,Time[0]~Time[5]に1,2,3,4,5,6が格納される。
(3) クロックカウンタは,クロックをカウントし,1ミリ秒ごとにMPUに割込みを行い,クロックカウンタ割込みハンドラを起動する。
[PIO]
PIOの構成を図2に示す。PIOは,それぞれ16ビットで構成される入出力制御レジスタ(以下,PIO_Rという)とデータレジスタ(以下,PIO_Dという)から成る。
PIOには16個の入力又は出力の設定が可能な端子があり,それぞれPIO_Dの1ビットに割り当てられる。
(1) PIO_Rは,PIO_Dの各ビットを入力にするか出力にするかを決める。PIO_Rのビット Ri を1にするとPIO_Dのビット Di は出力に指定され,0にすると入力に指定される。
(2) PIO_Dにデータを書き込むと,PIO_Rによって出力に指定されたビットのデータだけが端子から出力される。一方,PIO_Dのデータを読み込むと,PIO_Rによって入力に指定された端子のデータだけが読み込まれる。入力に指定されていないビットのデータを読み込むと不定の値となる。
レジスタ | R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PIO_R | R15 | R14 | R13 | R12 | R11 | R10 | R9 | R8 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 |
PIO_D | D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
(3) PIO_Dの D14 に割り当てられた端子には,SWが接続される。SWを押している間はオンとなり,そのとき PIO_D を読み込むとそのビットは1,SWがオフのときそのビットは0となる。PIO_Dを読み込むとそのときの D14 の値がSWの状態となる。
[ダイナミック点灯方式]
このディジタル時計で使用しているLEDの表示方法は,ダイナミック点灯方式である。ダイナミック点灯方式は,短時間に一つのLEDだけを点灯し,点灯するLEDを順に切り替え,あたかも全体が点灯しているかのように見せる方式である。
図3にLEDのセグメント割当てを,図4にLED表示部の構成を示す。
(1) PIO_Dの下位8ビット D0~D7 のうち,D0~D6 にはLEDのセグメント a~g を割り当てて,D7 には小数点 dp を割り当てる。具体的には,D0 をLEDのセグメント a に,D1 を b に,...,D6 を g に割り当てる。
(2) PIO_Dの上位8ビット D8~D15 のうち,D8~D13 には,LED0~LED5を割り当てて,D14 にはSWを割り当てる(D15は使用しない)。具体的には,D13 をLED5に,D12 をLED4に,...,D8 をLED0に割り当てる。
(3) LEDを点灯するためには,点灯するセグメントに対応するビット D0~D7 に1を書き込み,点灯するLEDに対応するビット D8~D13 に1を書き込む。
例えば,表示する時分秒のうち,"分"の10分台の数字はLED3,1分台の数字はLED2である。LED3に4を表示させるためには,PIO_Dに16進数0866を書き込む。
セグメント | LED5 LED4 | LED3 LED2 | LED1 LED0 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PIO_Dの下位8ビット | LED駆動回路 | - | ||||||||||||||||
a (D0) | dp (D7), g (D6), f (D5), e (D4), d (D3), c (D2), b (D1), a (D0) | SW | LED駆動回路 | - | ||||||||||||||
b (D1) | - | - | ||||||||||||||||
c (D2) | - | D15 | D14 | D13 | D12 | D11 | D10 | |||||||||||
d (D3) | PIO_Dの上位8ビット | - | ||||||||||||||||
e (D4) | - | 図4 LED表示部の構成 | ||||||||||||||||
f (D5) | - | - | ||||||||||||||||
g (D6) | - | - | ||||||||||||||||
o dp (D7) | 図3 セグメント割当て | - |
[クロックカウンタ割込みハンドラ]
クロックカウンタ割込みハンドラは,ダイナミック点灯の制御及びSWの入力の判定を行う。その流れ図を図5に示す。
配列Pattern[0]~[9]はそれぞれ16ビットの符号なし整数で,LEDに0~9を表示するための点灯セグメントの情報を格納する。例えば,Pattern[4]はLEDに4を表示するため,16進数0066を格納している。
i はLEDを示すカウンタ,cnt はSWの切替え時に状態が安定するまで待ち合わせるためのカウンタで,それぞれ16ビットの符号なし整数であり,初期値はいずれも0である。
swState はSWの状態を表す1ビットの変数であり,prev は直前の割込み処理で検出したSWの値を表す1ビットの変数である。初期値はいずれも0である。
work 及び pwork は,16ビット符号なし整数であり,作業用の変数である。
図5中の①の処理は,SWの状態が変化したときに,状態が安定するまで待ち合わせる処理である。
設問1 初期化プログラムによって,PIO_Rを初期化する設定値を16進数4桁で答えよ。ただし,PIO_Dの未使用のビットは入力として設定すること。
設問2 図5中のa~dについて,(1),(2)に答えよ。 (1) a,bに入れる適切な配列名を答えよ。 (2) c,dに入れる適切な式を答えよ。
設問3 図5中の①の処理で,SWの状態を直ちに反映しない理由を,30字以内で述べよ。