はじめに
マイコンはCPUだけで動作しているわけではなく、周辺機能(LED・スイッチ・UART・タイマなど)と密接に連携しています。
これらの外部ハードウェアを操作するための仕組みが「I/O(Input/Output)レジスタ」です。
CPUは外の世界を直接「見る」ことも「触る」こともできません。
代わりに、**メモリ空間上に用意された特別な住所(I/Oレジスタ)**を通してやりとりします。
つまり、**I/Oレジスタは“外との窓口”**です。
データの流れイメージ
「CPU → I/Oレジスタ → ピン → 外部回路」
CPU(演算・制御)
├─汎用レジスタ(R0~R15)
│ │
│ ├─ MOV.B / BSET などの命令で操作
│ ▼
│ バス(アドレス線+データ線)
│
▼
メモリ空間(RAM / I/O / ROM)
├─ RAM :一時データの保存
├─ ROM :プログラムや定数
└─ I/O領域:外部とのやりとり(PDR/PODR/PIDR)
│
▼
ポート回路(出力ドライバ・入力バッファ)
│
▼
ピン端子(例:PD6, PD7)
│
▼
外部ハード(LED・スイッチ等)
CPUがLEDを光らせるまでの流れ(分解して理解)
以下一連の流れは すべて「メモリに書き込みをしているだけ」。
マイコンではそのアドレスが「I/Oレジスタ」に割り当てられているため、
結果的に「外部ピンの電圧」が変化する。
-
CPUの命令実行
- 命令
MOV.L #0x0008C00D, R1により、
I/Oレジスタ「PDRD」の住所をR1にセット。
(これは“PDRDというレジスタがどこにあるか”を教える行為)
- 命令
-
方向設定(出力/入力)
- 命令
BSET #6, [R1]
→ R1が指しているアドレス(PDRD)のbit6を1にする。
→ PD6ピンが「出力モード」に設定される。
- 命令
-
出力データの書き込み
- 命令
MOV.L #0x0008C02D, R2で PODRDの住所をR2にセット。 - 命令
BSET #6, [R2]でbit6を1にする。
→ PD6ピンがHigh出力になり、LEDに電流が流れて点灯。
- 命令
-
消灯するとき
-
BCLR #6, [R2]によりbit6を0にする。
→ PD6がLow出力になり、LEDが消灯。
-
I/Oレジスタの代表3つ
マイコンではCPUにピンを操作するための専用レジスタが割り当てられている。
| 名称 | 意味 | 役割 | 操作方向 |
|---|---|---|---|
| PDR (Port Direction Register) | ポート方向 | 入力(0) / 出力(1) を決定 | 書き込み専用 |
| PODR (Port Output Data Register) | 出力データ | 出力ピンに出す値を保持 | 書き込み専用 |
| PIDR (Port Input Data Register) | 入力データ | 入力ピンの状態を読み取る | 読み出し専用 |
[R1] の「[]」の意味(間接参照)
| 書き方 | 意味 | C言語に例えると |
|---|---|---|
R1 |
R1そのものの中身 | R1 |
[R1] |
R1に書かれたアドレスを参照 | *R1 |
つまり、
MOV.B [R1], R2 → “R1が指すメモリ(I/Oレジスタ)の内容をR2に読み出す”
BSET #7, [R1] → “R1が指すアドレス上のビット7を1にする”
さらに理解を深めるポイント
① メモリマップI/O方式
Renesas RXなど多くのマイコンでは「メモリマップI/O」を採用しています。
これは「I/OレジスタをRAMやROMと同じアドレス空間に配置する方式」。
→ そのため、通常の命令(MOVやBSET)でI/Oを操作できる。
② ポートの内部構造
ポート1本(例:PD6)は以下のような構造を持っています:
┌──────────┐
外部 →──▶ 入力バッファ ──▶ PIDRビット
└──────────┘
┌──────────┐
CPU →──▶ PODRビット ──▶ 出力ドライバ ───▶ ピン
└──────────┘
▲
│
PDRビット(方向制御)
このように 1本のピンに対して3種類の制御が紐づいている のが分かります。
③ 双方向ポート(入出力兼用)
I/Oピンによっては、PDRを切り替えることで入力・出力を動的に変更できるものもあります。
→ たとえば通信線(I²C SDAなど)は、一時的に入力に切り替えて相手機器の信号を受け取ることがあります。
まとめ
| 概念 | 役割 | 例 |
|---|---|---|
| 汎用レジスタ | 計算・転送の一時領域 | R0, R1など |
| I/Oレジスタ | 外部とつなぐ窓口 | PDR, PODR, PIDR |
| メモリマップ | すべてをアドレスで扱う仕組み | 0x0008C00D など |
| [R1] | 間接参照(Cの *R1) |
BSET #6, [R1] |
| 結果 | ピンの電圧が変化しLEDが点灯 |