質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2527閲覧

BCDで保持しているリアルタイムクロックの値を10進数の変数のように扱ったらまずいですか?

takey

総合スコア312

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/01/07 07:39

以下のコードのように、リアルタイムクロックに「年」、「月」、「日」などを保持する変数があります。

C

1typedef union 2{ 3 struct 4 { 5 unsigned char wday; // BCD codification for day of the week, 00-06 6 unsigned char mday; // BCD codification for day of the month, 01-31 7 unsigned char mon; // BCD codification for month, 01-12 8 unsigned char year; // BCD codification for years, 00-99 9 }; // field access 10 unsigned char b[4]; // byte access 11 unsigned short w[2]; // 16 bits access 12 unsigned long l; // 32 bits access 13}rtccDate;

「年」を保持する変数yearがBCD表現で00~99とあるのですが、なぜBCD表現である必要があるのかわかりません。
変数yearを10進数の変数のように扱い、値を代入したら何か問題があるのでしょうか?

たとえば、NTPサーバとの同期で現在の年が2016だとわかったときに、

C

1dt.year = 0x16;

とするのが正しいと思うのですが、これを

C

1dt.year = 16;

としたら何か問題があるのでしょうか?

また、変数yearを10進数の変数のように扱えば、0~255までの256年間を表現できると考えたのですが、このような使い方をするのはまずいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

もう答えは出ているようですが、

なぜBCD表現である必要があるのかわかりません

に関して、なぜ BCD 表現である必要があるかというと、
最終的には設計者に聞かないとわかりませんが、
予想できる理由としては

  • そのほうがハードウェアを簡略化できる
  • あるいは、そのようにハードウェアを簡略しなければならないほど技術的制約が厳しい時代に設計された過去のハードウェアとの互換性のため
  • 7SegLCDなどのBCDでインターフェースするハードウェアをつなぐため

あたりが考えられます。

投稿2016/01/07 08:16

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/01/07 08:44

ありがとうございます。 >そのほうがハードウェアを簡略化できる BCDにするとなぜ簡略化になるのかがよくわかりません。 >あるいは、そのようにハードウェアを簡略しなければならないほど技術的制約が厳しい時代に設計された過去のハードウェアとの互換性のため これはありそうです。 >7SegLCDなどのBCDでインターフェースするハードウェアをつなぐため 確かに外部インターフェイスとの通信を行うときに、BCDでの通信が前提になっているのかもしれません。調べていませんでした。
kozuchi

2016/01/07 10:44

すいません、ちょっと考えが整理できていませんでした。 カウンタのハードウェア自体は、二進化十進にすることで少し複雑になります。 ハードウェアが簡略化できるのは十進数を扱う別のハードウェアを 接続する場合です。 つまり、最初の2項目と最後の1項目はほぼ同じことを言っていますね。 そして、ハードウェアが簡略化できる理由ですが、 論理回路をちゃんと勉強したのはかなり昔なので、 ちょっとこころもとないのですが、 出来る範囲で説明します。 基本的には、 「カウンタ値のオンオフ状態をそのまま、各桁の表示回路につなぐだけで 十進値の表示が実現できる」 からです。 例えば、44 という値を、2つの7segLED で表示することを考えてみます。 BCD の場合44は、 01000100 となります。 01は電子回路においては信号の ON/OFF ですので、 信号線1 OFF 信号線2 ON 信号線3 OFF 信号線4 OFF という状態になった場合に、「4」と表示するように回路を組んでおき、 同じ回路を二つ並べて、上位4ケタと下位4ケタにそのままつなぐだけで、 44という表示を行う回路ができます。 では、同じ値を通常の保持方法で持っていたとしましょう 00101100 この状態から、上位桁用の信号と下位桁用の信号を取り出すのは 少なくとも、BCDを使った場合よりも難しいと思います。
takey

2016/01/07 23:41

やはり外部インターフェイスと接続する際に簡単にやりとりできるということですね。ありがとうございました。
guest

0

ベストアンサー

こんにちは。

としたら何か問題があるのでしょうか?

10進数表現の16は16進数表現ですと0x10ですね。
これをリアルタイムクロックへ設定すると2010年になってしまいますね。

また、変数yearを10進数の変数のように扱えば、0~255までの256年間を表現できると考えたのですが、このような使い方をするのはまずいでしょうか?

takeyさんが仕様を変更できるようなリアルタイムクロックであれば、そのように仕様変更すれば可能と思いますが、リアルタイムクロックは通常ハードウェアで作られていますので難しいのではないでしょうか?

投稿2016/01/07 07:46

編集2016/01/07 07:51
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/01/07 07:50

ありがとうございます。解釈する側の問題なのですね。BCDで表現しろと書いてあるので、やっぱりBCDで表現したほうがよいですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問