13. I/O ポート

13.1 概要

 AVRマイコンのすべてのポートは、汎用デジタルI/Oポートとして使用する場合、完全なリード・モディファイ・ライト機能を備えています。これは、ポートの入出力方向を、SBI、CBI命令によって、意図していない他の端子の入出力方向に影響を与えずに変更可能であることを意味します。出力値を変更するとき(出力として設定されている場合)、および、プルアップ抵抗を有効化・無効化する場合(入力として設定されている場合)にも、同じことがあてはまります。各出力バッファは大きなシンク電流とソース電流を駆動可能な対称的ドライブ能力を備えています。各端子のドライバーはLED表示器を直接ドライブするのに十分な力をもっています。すべてのポートの端子には、供給電圧に関係なく一定の抵抗値の、端子ごとに選択可能なプルアップ抵抗があります。すべての入出力端子には、Figure 13-1にあるとおり、VccとGNDにつながった保護ダイオードがついています。回路定数の一覧については、「電気的特性」(p.302)を参照してください。


Figure 13-1. 入出力端子等価回路

 このセクションでは、すべてのレジスタと各ビットの名称は、一般化された形式で記されています。小文字の"x"はポート番号を表すアルファベットを、小文字の"n"はビット番号を表しています。プログラム中で各レジスタやビットの定義を用いる場合は、正しい形式を使用しなければなりません。例えば、PORTBのビット3を表す"PORTB3"は、一般化した形式で"PORTxn"と記載されています。入出力レジスタのアドレスと各ビットの配置については、「レジスタ詳細」(p.86)に一覧があります。

 それぞれのポートには三つのI/Oメモリアドレス、すなわちデータレジスタ PORTx、データ方向レジスタ DDRx、そしてポート入力ピン PINx、が割り当てられています。ポート入力ピンのI/Oアドレスは読み取り専用ですが、データレジスタおよびデータ方向レジスタは読み書きともに可能です。ただし、PINxレジスタに論理値1を書き込むことで、対応するデータレジスタのビットの値がトグル(反転)します。また、プルアップ無効ビット(MCUCRレジスタのPUDビット)をセットすると、すべてのポートのすべての端子のプルアップ機能が無効になります。

 I/Oポートを汎用デジタル入出力としてつかう方法は、「汎用デジタル入出力としてのポート」(p.71)に記載されています。ほぼ全てのポートの端子は、デバイス上の周辺回路の他の機能と同一の端子に重複して割り当てられています。各機能を切り替えて使用する場合に、どのポートのどの端子と衝突するかについては、「ポートの機能切り替え」(p.75)に記載されています。同一端子上で切り替えて使用する機能のすべての内容については、個別のモジュールについてのセクションを参照してください。なお、あるポートの端子を他の機能に切り替えて使用しても、汎用デジタル入出力として使用している同一ポート内の他の端子には影響はありません。

13.2 汎用デジタル入出力としてのポート

 各ポートは双方向の入出力ポートで、切り離し可能な内蔵プルアップ機能を備えています。Figure 13-2に入出力ポートの一つの端子(ここでは一般化した表記でPxnとします)に備わっている機能について記します。


Figure 13-2. 汎用デジタルI/O

注意 1. WRx, WPx, WDx, RRx, RPx, および RDx は、すべての端子について同一ポート上では共通。
clkI/O, SLEEP, および PUD はすべてのポートで共通。

13.2.1 端子の機能を設定する

 ポートの各端子は、三つのレジスタのビット、DDxn、PORTxn、PINxnによって構成されています。「レジスタ詳細」(p.86)にあるとおり、DDxnビットはDDRxレジスタのI/Oアドレスで、PORTxnビットはPORTxレジスタのI/Oアドレスで、そしてPINxnビットはPINxレジスタのI/Oアドレスで、アクセスします。

 DDRxレジスタのDDxnビットは該当する端子の入出力方向を選択します。DDxnビットに論理値1が書き込まれているとき、Pxn端子は出力端子として設定されます。DDxnビットに論理値0が書き込まれていれば、Pxn端子は入力端子として設定されます。

 入力端子として設定されているPORTxnビットに論理値1を書き込むと、プルアップ抵抗が有効になります。プルアップ抵抗を切り離すには、PORTxnビットに論理値0を書き込むか、出力端子として設定しなければなりません。リセット状態となったときは、CPUクロックが全くない状態であっても、ポートの端子はハイ・インピーダンス状態に設定されています。

 出力端子として設定されているPORTxnビットに論理値1を書き込むと、該当するポートの端子がHi(1)になります。出力端子として設定されているPORTxnビットに論理値0を書き込むと、該当するポートの端子がLow(0)になります。

13.2.2 端子の値を反転する

 PINxnビットに論理値1を書き込むと、DDRxnビットの値に関係なく、PORTxnビットの値が反転します。SBI命令を用いて、ポートの1ビットのみを反転できるということです。

13.2.3 入力と出力を切り替える

 ハイ・インピーダンス状態 ({DDxn, PORTxn} = 0b00) とHi出力状態 ({DDxn, PORTxn} = 0b11) を切り替えるとき、プルアップ抵抗が有効な状態 ({DDxn, PORTxn} = 0b01) 、またはLow出力状態 ({DDxn, PORTxn} = 0b10) を経由しなければなりません。ハイ・インピーダンスの回路では、Hiに強くドライブされている状態とプルアップ状態との違いは動作に影響がないので、通常は全く問題ありません。もし、問題がある場合は、MCUCRレジスタのPUDビットをセットして全てのプルアップ抵抗を全ポートの端子で無効にすることができます。

 プルアップが有効な入力状態とLow出力状態を切り替える場合にも同じ問題が生じます。ハイ・インピーダンス状態 ({DDxn, PORTxn} = 0b00) 、またはHi出力状態 ({DDxn, PORTxn} = 0b11) のいずれかを、中間的な状態として使用しなければなりません。

 Table 13-1 に、端子の状態を制御する信号についてまとめます。

Table 13-1. ポートの端子設定

DDxn PORTxn PUD (MCUCRレジスタ内) 入出力 プルアップ抵抗 コメント
0 0 X 入力 なし 3ステート (ハイ・インピーダンス)
0 1 0 入力 あり Lowに接続されていると、Pxnからソース電流が流れます
0 1 1 入力 なし 3ステート (ハイ・インピーダンス)
1 0 X 出力 なし Low出力(シンク)
1 1 X 出力 なし Hi出力(ソース)

13.2.4 端子の値を読む

 データ方向レジスタのビットDDxnの設定に関係なく、ポートの端子の状態を、PINxnレジスタのビットから読み取ることが可能です。Figure 13-2に示されている通り、PINxnレジスタのビット値と、その前段のラッチにより同期式の回路が構成されています。この回路は、実際の端子にかかる電圧が内部クロックのエッジ付近で変化した場合に不安定になるのをさけるために必要なものですが、同時に遅延が生じます。Figure 13-3に、外部端子の論理値を読み取る際の、同期動作のタイミング・ダイアグラムを示します。最大、および最小伝達遅延時間が、それぞれ、tpd,max、および tpd,minで示されています。


Figure 13-3. 外部端子の論理値を読み取る際の同期タイミング

 システム・クロックの最初の立ちさがり直後のクロック周期について考察してみましょう。クロックがLowの時はラッチは閉鎖されており、クロックがHi("SYNC LATCH"信号の影のついている部分で示されている)のとき透過状態となります。入力信号の値はシステム・クロックがLowになるとき、ラッチされ、それに続くクロックの立ち上がりエッジでPINxnレジスタに入力されます。二つの矢印、 tpd,max と tpd,min、で示されるように、1回の信号伝達は、入力信号の変化のタイミングによって0.5ないし1.5システム・クロック時間、遅延することになります。

 ソフトウェアによって変更された端子の論理値を再度読み取る場合、Figure 13-4に示す通り、NOP命令を挿入する必要があります。OUT命令は、システム・クロックの立ち上がりエッジで "SYNC LATCH" 信号をセットします。この場合、同期回路を通しての伝達遅延時間tpdは、1システム・クロック時間となります。


Figure 13-4. ソフトウェアで書き込んだポートの値を読み取る場合の同期タイミング

 下記のコーディング例では、ポートBの端子0と端子1をHiに、端子2と端子3をLowに、端子4から端子7までを入力とし、端子6と端子7でプルアップ抵抗を有効にする方法を表しています。設定後、端子の論理値を読み取っていますが、さきに説明したとおり、直前に設定された端子の値を読み取ることができるように、NOP命令が含まれています。


Assembly Code Example(1)
			 ...
			 ; プルアップするビット、Hi出力のビットを設定
			 ; ポート端子の入出力方向を設定
			 ldi	r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
			 ldi	r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
			 out	PORTB,r16
			 out	DDRB,r17
			 ; 同期のため、NOP命令を挿入
			 nop
			 ; ポート端子を読み取る
			 in	r16,PINB
			 ...

C Code Example
		 unsigned char i;
			 ...
			 /* プルアップするビット、Hi出力のビットを設定 */
			 /* ポート端子の入出力方向を設定 */
			 PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
			 DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
			 /* 同期のため、NOP命令を挿入 */
			 __no_operation();
			 /* ポート端子を読み取る */
			 i = PINB;
			 ...

注意:
1. アセンブリ言語では、端子0、1、6、7のプルアップを有効にしてから、データ方向ビットを正しく設定して、ビット2とビット3をLowに、ビット0とビット1を強いHi状態にするまでの時間を最小化するため、二つのレジスタを一時的に使用しています。

13.2.5 デジタル入力の有効化とスリープモード 

 Figure 13-2に示すとおり、デジタル入力信号はシュミット・トリガー・ゲートの入力の箇所でグラウンドにクランプできるようになっています。図中のSLEEPと記された信号は、パワーダウン・モード、パワーセーブ・モード、スタンバイ・モードにおいて、MCUスリープ・コントローラーによりセットされ、入力がフロート状態やVCC/2に近い状態のときに大きな電力が消費されるのを防止します。

 SLEEP信号は、外部割り込み端子として有効になっているポートの端子に対しては無効になっています。外部割り込み要求が無効の場合も、SLEEP信号は当該の端子で有効になります。また、SLEEP信号に対しては、「ポート機能の切り替え」(p.75)にあるとおり、様々な他の切り替え機能が優先される場合があります。

 「端子電圧の立ち上がりエッジ、たち下がりエッジ、またはあらゆる論理値の変化による割り込み」として設定された非同期の外部割り込み端子に、論理Hiレベル(論理値1)が印加されている状態で、外部割り込みが無効になっていると、上記に述べたスリープ・モードから復帰するときに、このスリープ・モードのクランプ回路により、要求されている論理変化が発生し、対応する外部割り込みフラグがセットされます。

13.2.6 未使用の端子について

 使われていない端子がある場合には、それらの端子が論理値として正しい電圧を保持するようにしておくことを推奨します。ほぼ全てのデジタル入力はディープ・スリープ・モードでは上記に述べたとおり無効化されていますが、それ以外のあらゆるモード(リセット・モード、アクティブ・モード、アイドル・モード)では入力端子が有効になっており、電流消費を減らす上で、入力端子をフロート状態のままにしておくのは避けるべきです。

 未使用端子に有効な電圧がかかるようにする一番簡単な方法は、内部プルアップ抵抗を有効にすることです。この方法では、プルアップ抵抗はリセット状態の間は無効になります。リセット中の低消費電力が重要である場合、外部のプルアップまたはプルダウン抵抗を使用することを推奨します。未使用端子を直接VCCやGNDに接続することは推奨しません。なぜなら、もし、その端子が何かの間違いで出力に設定されると、過大電流が流れるかもしれないからです。

13.3 ポートの機能切り替え

 ポートのほとんどの端子は、汎用デジタル入出力としてのほかに、他の切り替えて使用する機能が備わっています。Figure 13-5の図は、Figure 13-2に示した端子制御信号を、どのようにして他の機能に切り替えているかを、もう少し詳しく示しています。切り替え信号は全てのポートの端子に必ずしも備わっていないかもしれませんが、この図は、AVRマイコン・ファミリーの全ポートの端子について、一般的な構造を示すものといえます。


Figure 13-5. 端子の機能切り替え

注意:1. WRx, WPx, WDx, RRx, RPx, および RDx は同一ポート上の全ての端子について共通。
clkI/O, SLEEP, および PUD は全ポートについて共通。その他全ての信号は各端子固有のもの。

 Table 13-2に、機能切り替えの優先信号についてまとめます。Figure 13-5中の、端子とポートの添字はこの表では記されていません。優先信号は、切り替えて使用する端子に接続されるモジュール内部で生成されます。

Table 13-2. 機能切り替えの優先信号についての一般的な内容

信号 信号の名称 内容
PUOE Pull-up Override Enable この信号がセットされると、PUOV信号の値にしたがってプルアップ抵抗が有効になります。クリア状態では、{DDxn, PORTxn, PUD} = 0b010 のとき、プルアップ抵抗が有効になります。
PUOV Pull-up Override Value PUOEがセットされると、DDxn, PORTxn, PUDの値に関係なく、PUOV信号が「セット/クリア」状態で、プルアップ抵抗が「あり/なし」となります。
DDOE Data Direction Override Enable この信号がセットされると、DDOV信号にしたがって出力ドライバ・イネーブル信号が制御されます。クリア状態のときは、出力ドライバはDDxnビットにより有効になります。
DDOV Data Direction Override Value DDOEがセットされているとき、DDxnビットの値に関係なく、DDOVの値が「セット/クリア」状態で、出力ドライバが「有効/無効」になります。
PVOE Port Value Override Enable この信号がセットされており、出力ドライバが有効の場合、端子の論理値はPVOV信号によって制御されます。PVOEがクリアされており、出力ドライバが有効の場合、端子の値はPORTxnビットの値となります。
PVOV Port Value Override Value PVOEがセットされているとき、PORTxnビットの値に関係なく、端子の論理値がPVOVにセットされます。
PTOE Port Toggle Override Enable PTOEがセットされると、PORTxnビットの値が反転します。
DIEOE Digital Input Enable Override Enable このビットがセットされていると、デジタル入力の有効/無効はDIEOV信号によって制御されます。クリアされていると、デジタル入力の有効/無効はMCUの状態(ノーマル・モード、スリープ・モード)によって決まります。
DIEOV Digital Input Enable Override Value このビットがセットされていると、デジタル入力の「有効/無効」は、MCUの状態(ノーマル・モード、スリープ・モード)に関係なく、DIEOVが「セット/クリア」で決まります。
DI Digital Input 他の機能モジュールへのデジタル入力。図中では、この信号はシュミット・トリガー・ゲートの出力に同期回路の前で接続されています。デジタル入力がクロック源として使用されている場合をのぞいて、機能切り替えで使用される各モジュールは独自の同期回路を用いています。
AIO Analog Input/Output 他の機能モジュールのアナログ入出力に接続。この信号は、直接端子につながっており、入出力双方向で使用されます。

 以下のサブ・セクションでは各ポートの機能切り替え、および機能切り替えの優先信号について、簡潔にまとめています。より詳細については、切り替えて使用する各機能の項目を参照してください。

13.3.1 ポートBの機能切り替え

 ポートBの各端子の機能切り替えについて、Table13-3に記します。

Table 13-3. ポートB端子の機能切り替え

端子 切り替え可能な機能
PB7
XTAL2 (クロック発振器端子2)
TOSC2 (タイマー発振器端子2)
PCINT7 (ピン・チェンジ割り込み7)
PB6
XTAL1 (クロック発振器端子1、または外部クロック入力)
TOSC1 (タイマー発振器端子1)
PCINT6 (ピン・チェンジ割り込み6)
PB5
SCK (SPIバス マスター・クロック入力)
PCINT5 (ピン・チェンジ割り込み5)
PB4
MISO (SPIバス マスター・イン/スレーブ・アウト)
PCINT4 (ピン・チェンジ割り込み4)
PB3
MOSI (SPIバス マスター・アウト/スレーブ・イン)
OC2A (タイマー/カウンター2 コンペア・マッチA出力)
PCINT3 (ピン・チェンジ割り込み3)
PB2
SS(SPIバス マスター・スレーブ・セレクト)
OC1B (タイマー/カウンター1 コンペア・マッチB出力)
PCINT2 (ピン・チェンジ割り込み2)
PB1
OC1A (タイマー/カウンター1 コンペア・マッチA出力)
PCINT1 (ピン・チェンジ割り込み1)
PB0
ICP1 (タイマー/カウンター1 インプット・キャプチャ入力)
CLKO (分周システム・クロック出力)
PCINT0 (ピン・チェンジ割り込み0)

 端子の機能切り替えについては以下のとおりです。

Table 13-4 および Table 13-5 はポートBの機能切り替えを、Figure 13-5 (p.75)中にある優先信号に関連付けて書いたものです。SPI MSTR INPUT および SPI SLAVE OUTPUT により MISO 信号が構成され、MOSI 信号は SPI MSTR OUTPUT と SPI SLAVE INPUTに分割されています。


 Table 13-4. PB7からPB4の機能切り替え優先信号

注意
1. INTRC は、内蔵RC発振器のいずれかが(CKSELヒューズによって)選択されている状態、EXTCK は、外部クロックが(CKSELヒューズによって)選択されている状態


 Table 13-5. PB3からPB0の機能切り替え優先信号

13.3.2 ポートCの機能切り替え

 ポートCの各端子の機能切り替えについて、Table13-6に記します。

Table 13-6. ポートC端子の機能切り替え

端子 切り替え可能な機能
PC6
RESET(リセット端子)
PCINT14 (ピン・チェンジ割り込み14)
PC5
ADC5 (A/Dコンバーター入力チャンネル5)
SCL (2線式シリアルバス クロック)
PCINT13 (ピン・チェンジ割り込み13)
PC4
ADC4 (A/Dコンバーター入力チャンネル4)
SDA (2線式シリアルバス データ入出力)
PCINT12 (ピン・チェンジ割り込み12)
PC3
ADC3 (A/Dコンバーター入力チャンネル3)
PCINT11 (ピン・チェンジ割り込み11)
PC2
ADC2 (A/Dコンバーター入力チャンネル2)
PCINT10 (ピン・チェンジ割り込み10)
PC1
ADC1 (A/Dコンバーター入力チャンネル1)
PCINT9 (ピン・チェンジ割り込み9)
PC0
ADC0 (A/Dコンバーター入力チャンネル0)
PCINT8 (ピン・チェンジ割り込み8)

 端子の機能切り替えについては以下のとおりです。

Table 13-7 および Table 13-8 はポートCの機能切り替えを、Figure 13-5 (p.75)中にある優先信号に関連付けて書いたものです。


Table 13-7. PC6らPC4の機能切り替え優先信号

注意:
1 2線式シリアル・インターフェースが有効になっていると、PC4およびPC5出力端子のスルーレート抑制が有効になります。これは、図中には記されていません。また、ポート構成図に描かれたAIO出力と端子間、およびTWIモジュールの回路と端子の間にはスパイク・ノイズ・フィルターが接続されています。


Table 13-8. PC3からPC0の機能切り替え優先信号

13.3.3 ポートDの機能切り替え

 ポートDの各端子の機能切り替えについて、Table13-9に記します。

Table 13-9. ポートD端子の機能切り替え

端子 切り替え可能な機能
PD7
AIN1 (アナログ・コンパレーター入力(-))
PCINT23 (ピン・チェンジ割り込み23)
PD6
AIN0 (アナログ・コンパレーター入力(+))
OC0A (タイマー/カウンター0 コンペア・マッチA出力)
PCINT22 (ピン・チェンジ割り込み22)
PD5
T1 (タイマー/カウンター1 カウンター入力)
OC0B (タイマー/カウンター0 コンペア・マッチB出力)
PCINT21 (ピン・チェンジ割り込み21)
PD4
XCK (USART外部クロック入力/出力)
T0 (タイマー/カウンター0 カウンター入力)
PCINT20 (ピン・チェンジ割り込み20)
PD3
INT1 (割り込み入力1)
OC2B (タイマー/カウンター2 コンペア・マッチB出力)
PCINT19 (ピン・チェンジ割り込み19)
PD2
INT0 (割り込み入力0)
PCINT18 (ピン・チェンジ割り込み18)
PD1
TXD (USART出力端子)
PCINT17 (ピン・チェンジ割り込み17)
PD0
RXD (USART入力端子)
PCINT16 (ピン・チェンジ割り込み16)

 端子の機能切り替えについては以下のとおりです。

Table 13-10 および Table 13-11 はポートDの機能切り替えを、Figure 13-5 (p.75)中にある優先信号に関連付けて書いたものです。


Table 13-10. PD7らPD4の機能切り替え優先信号

Table 13-11. PD3らPD0の機能切り替え優先信号

13.4 レジスタ詳細

13.4.1 MCUCR – MCU コントロール・レジスタ

ビット 7 6 5 4 3 2 1 0
0x35(0x55) - - - PUD - - IVSEL IVCE MCUCR
Read/Write R R R R/W R R R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.2 PORTB – ポートB データ・レジスタ

ビット 7 6 5 4 3 2 1 0
0x05(0x25) PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.3 DDRB – ポートB データ方向レジスタ

ビット 7 6 5 4 3 2 1 0
0x04(0x24) DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 DDRB
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.4 PINB – ポートB 入力端子アドレス

ビット 7 6 5 4 3 2 1 0
0x03(0x23) PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 PINB
Read/Write R R R R R R R R
初期値 N/A N/A N/A N/A N/A N/A N/A N/A

13.4.5 PORTC – ポートC データ・レジスタ

ビット 7 6 5 4 3 2 1 0
0x08(0x28) - PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 PORTC
Read/Write R R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.6 DDRC – ポートC データ方向レジスタ

ビット 7 6 5 4 3 2 1 0
0x07(0x27) - DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 DDRC
Read/Write R R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.7 PINC – ポートC 入力端子アドレス

ビット 7 6 5 4 3 2 1 0
0x06(0x26) - PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 PINC
Read/Write R R R R R R R R
初期値 N/A N/A N/A N/A N/A N/A N/A N/A

13.4.8 PORTD – ポートD データ・レジスタ

ビット 7 6 5 4 3 2 1 0
0x0B(0x2B) PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 PORTD
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.9 DDRD – ポートD データ方向レジスタ

ビット 7 6 5 4 3 2 1 0
0x0A(0x2A) DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 DDRD
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 0 0 0 0

13.4.10 PIND – ポートD 入力端子アドレス

ビット 7 6 5 4 3 2 1 0
0x09(0x29) PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 PIND
Read/Write R R R R R R R R
初期値 N/A N/A N/A N/A N/A N/A N/A N/A

目次に戻る