クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

レジスタとビット操作

このレッスンのあとで: レジスタのビットを読み、セット、クリア、反転することができる。

50分のレッスンコマンド2件組み込みシステムラボ:シミュレートしたチップでレジスタ、ピン、PWM、割り込みを学ぶ

レジスタとは何ですか

レジスタとは、マイコンの中にある小さな記憶場所のことです。洗濯機のボタンも、ライトの点灯も、レジスタの数を読み書きして動かします。

このレッスンでは、レジスタの中のビットを読み、セットし、クリアし、反転する方法を学びます。

このレッスンのゴール

メモ

レジスタのビットを読み、セット、クリア、反転することができる。

キーワード

ことばいみれい
レジスタチップの中にある、数を入れる小さな場所
ビット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 で試す

コード: 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を使えば、選んだビットだけが変わります。

このラボとソースについて: 組み込みシステムラボ:シミュレートしたチップでレジスタ、ピン、PWM、割り込みを学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。