PINレジスタ

  • PINレジスタとは
これまでやったDDRレジスタやPORTレジスタでは、値を代入し、設定を行いましたが、PINレジスタはちょっとそれらとは異なり、PINレジスタには、DDRレジスタで入力に設定したピンの電圧がHighかLowかがそのピンに対応するBitに格納されています。

  • PINレジスタの使い方
PINレジスタは主にif文などの条件文の中で使われ、PINレジスタに入っている値では、Lowになっているピンに対応するBitは0に、Highになっているピンに対応するBitは1になっています。(PINレジスタの例:PINB,PIND)

では、実際にプログラムを実行してみましょう。
#define F_CPU 1000000
#include<avr/io.h>
#include<util/delay.h>

int main(void)
{
	DDRB = 0b00000000;//ポートBのピンは入力に設定
	PORTB = 0b00000000;//内部プルアップを無効
	DDRC = 0b1111111;//ポートCのピンは出力に設定
	PORTC = 0b0000000;//PCすべての電圧をLowに設定

	while(1)
	{
		if( (PINB & 0b00000001) == 0b00000001 )//PB0の電圧がHighなら
		{
			PORTC = 0b0000001;//PC0の電圧だけをHighにする
		}
		if( (PINB & 0b00000001) == 0b00000000)//PB0の電圧がLowなら
		{
			PORTC = 0b0000010;//PC1の電圧だけをHighにする
		}
	}
}
上記のプログラムをマイコンに書き込んだら、PC0,1にLEDを繋げ、PB0をVccか、GNDに繋いでみてください。PB0がVccに繋がっているか、GNDに繋がっているかで、光るLEDが変わると思います。

プログラム内で出てきた「&」についてですが、これは第5回の「C言語について」でふれたと思いますが、なぜここで「&」が出てきたかというと
PINB & 0b00000001
という風に書くと計算結果では「&」の次の数字で0なっているBitは必ず0に、次の数が1になっているBitはPINBのそのBitの数になります。つまり、PBの内電圧状態を見たいピンのBitだけを表してくれ、それ以外のBitは0にして隠してくれます。これ処理をマスク処理といいます。
実際プログラムを書くときは、しっかりマスク処理をしてあげないと、正常な動きをしてくれないので、ちゃんとマスク処理を行うようにしましょう。

ここで、上記で作った回路において、PB0をVcc、GNDどちらにも繋げないようにしてみてください。そうすると、光るLEDが一つに定まらないのではないでしょうか。それはなぜかというと、いま、PB0のピンの電圧は不定の状態となっていて、マイコンがその状態をHighととるかLowとるかは不明で、どちらのif文に入るかは不明瞭だからです。
これは、誤動作の元なので、いつもピンの電圧はHigh、Lowどちらかになっていなければなりません。
最終更新:2015年08月17日 07:57