俺の電子工作室
 電子工作を始める⇒PSoCで遊んでみよう
  ⇒⇒
「数値」と「High/Low の組み合わせ」の関係数を理解する
本文へジャンプ
 
 [1] 2 進数って何? ビットって何? バイトって何?
 
(1) 2 進数って何?
   2 進数の概念を 10 進数と対比しながら取り上げます。「2 進数」という言葉は多くの人が耳に
  している言葉だと思いますが、ここで整理しておきます。
(2) ビットって何? バイトって何?
   ビットとバイトの概念を取り上げます。
(3) どうやって数値を表す?
   ビット毎の重みと全体として数値をどう表すかを説明します。
(4) 「数値」と「High/Low の組み合わせ」の関係
   本題に入ります。
(5) ポートという概念
   PSoCの入出力端子の構成について触れています。
(6) 16 進数
   ヘックス(Hex)とかヘクサデシマルとか呼ばれる数値表現について取り上げます。
(7) もうひとつの数値表現
   負の数を扱う概念について取り上げます。

 
 (1-1) 2 進数って何?
 御心配なく。「数値」と「High/Low の組み合わせ」の関係についての説明である。説明に入る前に2進数という概念を説明しないと話が前に進まないので・・・。ちょっと我慢して付き合って頂きたい。
 普段我々が使っている10進数についてその一桁目に注目して見てみる。 0 から始まって一つずつ増えていく様子をみてみると、0, 1, 2, ....8, 9, 0 と 9 から 0 に戻る時、上の桁に繰り上がる。10進数では 0 〜 9 の 10 種類の数字を使い果たすと上の桁に繰り上がって 0 に戻る。
 同じような考え方で 2 進数ならどうなるかを考えてみる。 10 進数では 10 種類の数字を使って一桁目を表しているのだから、 2 進数では 2 種類の数字だけを使って一桁目を表すと予測できるだろう。 2 進数では 0 と 1 の 2 種類の数字だけを使って数を表す。表「一桁目に注目」をみると 0 と 1 の二つの数字を使い切って 0 に戻る度に上の桁へ繰り上がる様子が分かると思う。その上の桁でも 0 と 1 の二つの数字を使い切って 0 に戻る度にもう一つ上の桁へ繰り上がる。
 10 進数でもこの様に上の桁が最大になったら更に上の桁に、その桁も最大になったら更にその上の桁に順繰りで繰り上がっていく振る舞いを、殆どの人が感覚的に理解していることと思う。 2 進数でも繰り上がりの頻度はかなり多いが同じ振る舞いをすることで順次上の桁へ繰り上がって行く。

 電子回路の世界では「数」は 2 進数で扱う。前述の Status Rgister では電気信号の High/Low (5V/0V) からCPUで扱える 1/0 の情報に変換し、Control Register では1/0 の情報を High/Low の電気信号に変換することを説明した。
 電気信号で「数」を扱おうとすると、この様に High/Low を 1/0 に対応させると扱い易くなる。即ち、数を表すのに 1 と 0 しか使わない 2 進数で扱うのが最も合理的である。
 ということで、電子回路(デジタル回路)の世界では「数」は 2 進数で扱う。

【数字と数値】
 「数字と数値」、両者の違いを意識しているだろうか。"1"という「数字」はいろいろな書き方が出来る。"一", "壱", "@", "T", "@", etc. 。 一方「数値」の方はどうだろう?一般的にはアラビア数字で表記されるが文字や字体にはあまり意味はなく、表された数の大きさそのものに意味がある。
 以降、「数字」と「数値」は本質的に意味の違う言葉として使い分ける。
 
 (1-2) ビットって何? バイトって何?
  ビット、バイトという言葉について説明する。2 進数の一桁を 1 ビット(1 bit)と呼び、 8 桁をまとめて 1 バイト(1 byte)と呼ぶ。1 バイトは 2 進数における最も基本的な単位である。
 1 バイトの中で数値がどのように扱われるかを説明するが、桁が増えて 2 バイトになっても 3 バイトになっても同じように考えればよい。
 1 バイトの中の 8 つのビットにはそれぞれ番号がついている。下の桁から 0 〜 7 の番号がついていて、それぞれのビットには、bit0, bit1, bit2, ・・・ bit7 または b0, b1, b2, ・・・ b7 などと名前がついている。
 各ビットにはそれぞれ固有の数値が割り当てられている。上の繰り上がりを示した表「一桁目に注目」を見て欲しい。一番下の段が bit0 に相当し、二番目が bit1 、三番目が bit2 に相当している。表では bit1 が 10 進数で表した「二」の倍数ごとに、 bit2 が 10 進数で表した「四」の倍数ごとに変化しているのが分かる。bit1 は「二」で 0 ⇒ 1 と変化し、「四」で 1 ⇒ 0 と変化して bit2 へ繰り上がる。更に bit3 へは 10 進数「八」で繰り上がっている。即ち、各ビットは一、二、四、八を表している。更に見方を変えると各ビットは 2 の「ビット番号」乗を表す(表「1 バイトの構成」の最下段参照)。
 
 (1-3) どうやって数値を表す?
  1 バイトの 2 進数が全体として表す数値 N は
   N = 128×b764×b632×b516×b48×b34×b22×b11×b0
となる。ここで、b7 〜 b0 は各ビットの値(1 又は 0)である。例えば「1010 1010」という 1 バイトの 2 進数が表す数値 N は
   N = 128×1 + 64×0 +32×1 +16×0   +8×1 +4×0 +2×1 +1×0
     = 128 + 32 + 8 + 2 = 170
となる。
 1 バイトで表せる数は「0000 0000」の 0 から「1111 1111」の 255 までである。1 バイトでは 256 種類の数が表せるが 0 からはじまっているので 256 - 1 = 255 までである。2 バイトを使って一つの数値を表せば 256×256−1 = 65,535 までの数が表せる。
 
 (1-4) 「数値」と「High/Low の組み合わせ」の関係
 右図は 8 ビット全てを有効にしたステータスレジスタの各端子に上と同じ並びの「10101010」になる様に電気信号(High/Low)が与えらたものである。これをCPUから読み込むと 170 という値になることが上の説明でわかったと思う。
 プログラム上はStatus_Reg_Read() 関数を実行するとStatus_Reg_Read() の値が 170 になる。
 コントロールレジスタも 8 ビット全てを有効にしておいて、170 という値を書き込むとステータスレジスタと同じ並びの電気信号が出力される。プログラム上は関数 Control_Reg_Write( 170 ) を実行する。
 Status_Reg_Read() の値が 170 になっているのでControl_Reg_Write( Status_Reg_Read() ) は Control_Reg_Write( 170 ) と等価である。
 
 (1-5) ポートという概念
  OnTama プロジェクトでは外部の信号をステータスレジスタやコントロールレジスタに接続する際、ピンというコンポーネントを介して接続した。この様に外部との境界線となって信号を入力したり出力したりする機能のことをポートと呼ぶ。
 ポートは 1 バイト単位で扱われることが多く、PSoC でも 1 バイト単位のポートが定義されている。ピンの名前をP2_1 や P1_5 にしたことを思い出して頂きたい。P はポートの頭文字で P2_1 はポート番号 2 番のビット 1 という意味である。OnTama.cydwr で接続設定をした時に、右側の窓で「Port」の欄で表示される P2[1], P1[5] も同じ意味合いである。
 評価ボードではポートは P0 〜 P4 の 5 つがあり、P0 〜 P3 はビット 0 〜 7 の 8 本全てが端子に出ているが P4 はビット 0 〜 3 の 4 本だけが端子に出ている。評価ボードに印刷された 2.1や 1.5 の数字は P2_1, P1_5を表しているので現物をみて確認して欲しい。
 
 (1-6) 16 進数(Hexadecimal:へックスとも呼ばれる)
  4 ビットをひとまとめにした単位(ニブル)について考えてみる。1 ニブルは「0000」から「1111」で 0 〜 15 までの 16 種類の数値を表すことが出来る。「(1) 2 進数って何?」の説明で数字が 16 種類あれば 16 進数が出来るという事が容易に想像がつくようになったと思う。2 進数を扱う時 1 ニブルを 1 桁で表せると便利なことが多い。
 そこで、a 〜 f 又は A 〜 F数字として扱うことにして 10 〜 15数値を割り当てる。以下の様に 16 個目で上の桁に繰り上がる。この様な約束事をした数値表現方式が 16 進数である。
   00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, ・・・・ 1E, 1F, 20,
 16 進数であることを明記するために「23H」の様に後ろに"H"をつけたり、「0xab」の様に頭に"0x"をつけたりする。ちなみにさっき出てきた10進数の 170 は16 進数で表すとAAH になる。
 他にも希に 2 進数 3 桁をひとまとめにした 8 進数が使われることもある。
 
  (1-7) もう一つの数値表現
  1 バイトの情報は 0 から 255 の数値を表すことを説明したが、この表し方を無符号 2 進数と呼ぶ。この他に、符号付 2 進数という、もう一つの表し方、あるいは解釈の仕方がある。
 符号付 2 進数では最も大きな数を表すビット b7 これをMSB(Most Significant Bit)というが、これを符号ビットとみなす。符号ビットが 1 の時は負の数値を、0 の時は正の数値を表す。そしてその値は次の様に定義する。
 ◎正の場合 --- 無符号 2 進数と同じ。
 ◎負の場合 --- 2 の補数の 2 進数(2's Comprement Binary Number)
 2 の補数というのは「その数に加算してゼロになる数(キャリーは無視する)」である。ややこしいので実例を示して見る。上で使った AAH を例にとる。
 AAH の「2 の補数」を x とすると、AAH + x は下 2 桁が00Hになり、キャリー(繰り上がり)を無視するということなので
AAH + x = 100H
 となる。従って x = 100H - AAH であるから2 進数で計算してみる。
 結果、AAHの「2 の補数」は56Hである。繰り下がりに気をつけて確認してみて欲しい。計算方法は 10 進数の引き算と同じ様な考え方で行えば良い。又、逆に AAH + 56H が100H になることも確認して欲しい。56H は10進数でいうと 86 であるからAAHは -86 である。
 補数の例を右の表に示す。一見ややこしい補数という考え方だが加減算を行う場合に便利なものなのである。 x - y を計算する場合 xy の補数加算してキャリーを無視すればよい。試しに125 - 3 = 122 を計算してみる。上の表から125 は 01111101B、3 の補数は 11111101B であるから 01111101B + 11111101B が 122(1 0111 1010B) (キャリーは無視する)となる。計算してみて欲しい。また、上の表で同じ列の正/負の数を足すと100Hになる。ある数から同じ数を引いた結果である。(上の「01111101B」はBinary(2 進数)であることを示す)
 プログラムで計算を行う場合、数値の符号を判断して加算するか減算するか処理を分けるのは煩わしい。補数表現にしておけば、何も考えずに加算すればすむ。
 2 の補数の簡単な作り方がある。元の数(ex. 10101010B)の 1 と 0 を全桁入れ替えて(01010101B)1 を足す(01010101 + 1 = 01010110)と補数の出来上がりである。上の計算結果と比べて欲しい。
 1 バイトではこのように -128〜127 の数が表せるが、2 バイトを使っても同じような考え方で -32,768〜32,767の数が表せる。

   
inserted by FC2 system