製作・改造なんでもやっちゃう広くて浅い活動日誌

2011/01123456789101112131415161718192021222324252627282930312011/02

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2進数で数字を扱うにあたって、正負を表すのに2の補数という表現方法があります。
例えば2進数4bitで7を表すと0111ですが、同様に-7は1001と表せ、これらを足し合わせたら0000(最上位の繰り上がりは無視)、つまり0になるという方法で、いろんな所で使われている方法です。

より詳しくは、Wikipedia等で調べる方がわかりやすいので、詳しい説明は割愛します。
2の補数 - Wikipedia


ここで話したいことは、例えばLTC1407のように、14bit 2の補数表示で結果が出力されるADCを16回加算して平均をだそうとしたらどうすればいいの?みたいな話です。

話を簡単にするために、4bitのADCということにしてみます。
4bitを16回加算するということは、最大で8bitの桁が必要ですね。
(最大で 11112 * 11112 = 111111112)

しかし、8bit用意したからといって、4bitの値をそのまま足していけるかというと、正の数では問題ないですが、2の補数で負の値を扱う場合は最終的なビット数に移してから計算しなくてはなりません。

解説のため、以下に2~6bitの2の補数をまとめてみました。(クリックで大きくなります)
2の補数一覧


上の画像を見ると、負の一例として-3は3bitでは101、4bitでは1101、5bitでは11101、6bitでは111101となっていることがわかります。
10進数では同じ値であっても、使うビット数によって2進数での表し方が変わってきます。
一方で、正の数の場合5は4bitでは0101、5bitでは00101、6bitでは000101といった具合です。

つまり、ビット数を増やすには、元の値の最上位ビットを計算に用いたいビット数の差分だけ上位ビットに加えれば良いことがわかります。

以上の処理をした後に加算していけば、問題なく計算できます。
スポンサーサイト
今日はプログラムを書いていて、
仮想シリアルポートのソフトである
com0comに助けられたのでそれについて少々。

と言っても、
仮想シリアル(COMポート)ドライバのご紹介
辺りで詳しい説明があるんで、インストール方法等は省きます。

要は、RS-232ポートやケーブルを使うことなく、
PC内に仮想的に2つのポートを作ってそれをケーブルで繋いじゃって、
ソフト間のシリアル通信を可能にするソフトです。
(……よけいややこしいかな)
GPLライセンスのようなので、フリーで使えます。

1つのPCでポートが2つとか、
USB-シリアル変換ケーブルとか持ってれば
必要ないんだろうけど、
それでもケーブルを引き回すよりは楽だと思います。

今回僕は、シリアル通信でPCから周辺機器にアクセスしようとした時に、
TeraTermで直接打ちこんでやてば動くのに
C#で書いた自分のプログラムではうまく動作してくれなくて、
コマンド送信の挙動を見てみようと思ったんで使ってみました。

結局、自分のコマンドを見てみれば一目瞭然で、
改行コマンドに何を使っているのかって話しでした。
C#のシリアル通信の送信関数であるWriteLine()では
改行コードがCR+LFであるのに対し、
求められているのはCRだけだったという……。
結果、毎回LFというゴミが残ってコマンドが正しく伝わらなかったみたいです。

修正方法はまた次回。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。