レジスタとは何ですか
レジスタとは、マイコンの中にある小さな記憶場所のことです。洗濯機のボタンも、ライトの点灯も、レジスタの数を読み書きして動かします。
このレッスンでは、レジスタの中のビットを読み、セットし、クリアし、反転する方法を学びます。
このレッスンのゴール
メモ
レジスタのビットを読み、セット、クリア、反転することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| レジスタ | チップの中にある、数を入れる小さな場所 | |
| ビット | 0か1のどちらかを表す、最も小さな単位 | 1 |
| マスク | 変えたいビットだけが1の数 | 0b00001000 |
| セット | ビットを1にすること | |
| クリア | ビットを0にすること | |
| 反転 | ビットを0なら1に、1なら0に変えること |
学生が入力するセルは、このプレビューでは空白です。
レジスタは8ビットの記憶場所
このラボのチップには、レジスタが7つあります。どれも8ビット、つまり0と1が8個並んだ1バイトです。値は0から255までです。
右端がビット0で、左端がビット7です。チップは、ビット1つ1つに別の意味を持たせています。
このチップは作り物です
重要
ラボのチップは、実在しない小さなマイコンを Python で作ったシミュレータです。実機のマイコンとは、レジスタの名前も数も違います。実機では、メーカーのデータシートを読みます。
次の Run の画面は英語です
ラボのスクリプトは、英語の語を出力します。registers after reset: という行のあとに、7つのレジスタが並びます。
各行は、名前、2進数、16進数、10進数の順です。リセットの直後なので、7つとも値は0になります。
レジスタを全部表示する
docker exec jupyter python3 steps/registers.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ラボのチップの7つのレジスタ
| 名前 | 役目 |
|---|---|
| DDR | 各ピンを出力にするかを決める |
| PORT | 出力ピンに出す値を持つ |
| PIN | ピンの今の高さを読む |
| TCCR | タイマーの動きを決める |
| TCNT | タイマーが数えている値 |
| OCR | タイマーの数と比べる値 |
| IFR | 割り込みが起きた印 |
学生が入力するセルは、このプレビューでは空白です。
マスクで選んだビットだけ変える
マスクは、変えたいビットだけが1の数です。ビット3を選ぶなら、1 << 3 で 0b00001000 になります。
ORでセット、反転したマスクとANDでクリア、XORで反転します。ほかのビットは変わりません。
3つの操作を並べた表
| したいこと | 式 | ビット1での結果 |
|---|---|---|
| セット | value | (1 << 1) | 0 なら 1 になる |
| クリア | value & ~(1 << 1) | 1 なら 0 になる |
| 反転 | value ^ (1 << 1) | 0 と 1 が入れかわる |
学生が入力するセルは、このプレビューでは空白です。
マスクを手元の Python で試す
port = 0b01100110
port = port | (1 << 0) # ビット0をセットする
print("セットのあと", format(port, "08b"))
port = port & ~(1 << 5) # ビット5をクリアする
print("クリアのあと", format(port, "08b"))
port = port ^ (1 << 7) # ビット7を反転する
print("反転のあと", format(port, "08b"))
print("ビット1は", (port >> 1) & 1)
# 練習: ビット2をセットする行を足して、もう一度実行しましょう。
ラボのスクリプトも同じ操作
次の Run は、ラボの bits.py です。出力の語は英語で、PORT が 0b00001010 から始まります。
ビット0のセットで 0b00001011、ビット1のクリアで 0b00001001 になります。ビット3の反転で 0b00000001、もう一度の反転で 0b00001001 に戻ります。
ビット操作のスクリプトを動かす
docker exec jupyter python3 steps/bits.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ビットを読むときは右へずらす
最後の2行は、ビットの読み方です。& 0x0F は、下の4ビットだけを残します。出力は 1001 です。
1ビットだけを読むなら、そのビットを右端までずらして、1とANDします。ビット0なら答えは1です。
よくある間違い
注意
「ビットをセットするには、レジスタにマスクを代入すればよい」と考える人が多くいます。代入すると、ほかのビットがすべて消えます。ORを使えば、選んだビットだけが変わります。