• ベストアンサー

マイコンでの計算方法?

8bitまたは16bitのマイコンで質問です。 計測器から取り込んだ20bitのBCDデータから±10%の数値を出したいのですが、これは可能でしょうか? どのようなアルゴリズムでプログラムすれば良いか教えていただけると助かります。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

BCD20桁ということは10進5桁ですね。 泥臭い方法かもしれませんが、20ワード準備します。(5桁×4個分) 5ワードづつの組をA,B,C,Dで表します。 BCDをデコードして10進1桁づつAに入れます。 Aを右に1つづつずらしてBに入れます。 A+Bを桁ごとに計算してCに入れます。 次に右から順番に桁上げをします。 +10%はこれで終わりです。 -10%ですが、同じ考え方でDにA-Bで結果を出し、右から順に桁下げをします。 (負になっているところに上の桁から1借りて10を足す) 四捨五入は考えていませんので必要に応じて追加してください。

diode5
質問者

お礼

回答ありがとうございます。 なるほど、こうすれば良いのかと理解できそうなのですが... ここ十年ぐらいソフトは人まかせできたので理解するのに手間取っています...

その他の回答 (3)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

No.1、No.2のymmasayanです。補足にお答えします。 >>20ワード準備します。(5桁×4個分) >なぜワードなのだろうと考えていたのですが、これは16bitマイコンの場合 >ということなのでしょうか?8bitマイコンの場合には20バイトで良いと >いうことでしょうか? 20ワードと書きましたが10進2桁程度の加減算ができればいいのです。 ただし補数については厳密に保証される必要があります。 ということで条件さえ合えばワードでもバイトでも構いません。 >桁を動かさずにそのまま取り出すには16bit(ワード)では足りないし、 >桁を考えずに数値だけを取り出すのであれば8bitで間に合うし、ワードということに >どんな意味があるのだろうと考えていました。 最初に泥臭いといったのはそういう意味です。計算のしやすい区切りはワード だろうということからです。確かにメモリーはもったいないですね。 >アセンブラでプログラムしていた頃は、数値を扱うことがほとんどなかったので >理解に苦しんでいます... >ちなみにアセンブラは初心者以下のレベルです。 試しに+10%のケースをやってみましょう。     1    2    3    4    5   A   5    4    3    6    7  B        5    4    3    6  C   5    9    7    9   13 C'  5    9    8    0    3     

diode5
質問者

お礼

大変良く理解できました。 Cが桁上げする前、C'が桁上げした後ということですね! いろいろありがとうございました。 ぜひ応用させていただきます。

  • paspas
  • ベストアンサー率52% (47/90)
回答No.3

基本的な考え方はNo.1の方の通りでよいと思います。 b19-+ b18 |10^4 b17 | b16-+  b15-+ b14 |10^3 b13 | b12-+ b11-+ b10 |10^2 b09 | b08-+ b07-+ b06 |10^1 b05 | b04-+ b03-+ b02 |10^0 b01 | b00-+ 20bitを4ビットごとに区切り、4ビットずつ入力します。 取り込んだ数値に重みを付け(10^4~10^0)加算します。 I/OビットがたくさんあればI/Oポートに全部割り振ればよいでしょうし、なければラッチなどに記憶し、順番に桁数毎にスキャンすればよいでしょう。  計測器の仕様にもよりますが、計測器にラッチ入力があればマイコン側でラッチする必要はありません。  ラッチを掛けないとどうなるかというと、スキャン中に4999から5000に変化したら、4000と読み込んでしまったり5999と読み込んでしまったりする可能性があります。  また、マイコン側でラッチ信号を使用する場合ですが、マイコンからのラッチ出力がフォトカプラなどでアイソレートされている場合、フォトカプラの2次側にラッチ信号が伝搬するのに時間がかかる場合があり、しばらく時間をおかないとラッチがかからない場合があります。  ご注意ください。

diode5
質問者

お礼

ありがとうございます。 仕事がハード関係になるので、おっしゃっている事は理解できました。 ゲート数節約のためにラッチをかけずにパリティエラーになったことがあったので良くわかります。 計測器によって仕様がことなるということは知らなかったので注意して見てみたいと思います。 どうもありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

No.1のymmasayanです。 不明確なところが出てきたら補足ください。 追加説明いたします。

diode5
質問者

お礼

ありがとうございます。 >20ワード準備します。(5桁×4個分) なぜワードなのだろうと考えていたのですが、これは16bitマイコンの場合ということなのでしょうか? 8bitマイコンの場合には20バイトで良いということでしょうか? 桁を動かさずにそのまま取り出すには16bit(ワード)では足りないし、桁を考えずに数値だけを取り出すのであれば8bitで間に合うし、ワードということにどんな意味があるのだろうと考えていました。 アセンブラでプログラムしていた頃は、数値を扱うことがほとんどなかったので理解に苦しんでいます... ちなみにアセンブラは初心者以下のレベルです。 よろしくお願いします m(_ _)m