PORTレジスタで設定する内容はDDRレジスタで設定したのが入力か出力かで異なります。
入力->内部プルアップを有効にするか無効にするか設定
出力->ピンの電圧をHighにするかLowにするか設定
内部プルアップ…後でふれるプルアップというものをマイコン内部で行ってくれます。詳しくは
プルアップ・プルダウンで説明します
PORTレジスタの設定方法はDDRレジスタと同様で、設定内容は以下の通りです。(PORTレジスタの例:PORTB、PORTD)
|
0 |
1 |
入力設定時 |
内部プルアップを無効 |
内部プルアップを有効 |
出力設定時 |
ピンの電圧をLow |
ピンの電圧をHigh |
DDRB = 0b11110000;
PORTB = 0b11001100;
さて、上記のようにDDRレジスタ、PORTレジスタを設定すると、各ピンはどのように設定されるでしょうか。
答えは、
PB7,6:ピンの電圧をHigh
PB5,4:ピンの電圧をLow
PB3,2:内部プルアップを有効
PB1,0:内部プルアップを無効
では、これまでやったDDRレジスタとPORTレジスタを使ったプログラムをマイコンに書き込んで実行してみましょう。
#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)
{
PORTC = 0b1111111;//PCすべての電圧をHighに
_delay_ms(500);//500ms(0.5秒)待つ
PORTC = 0b0000000;//PCすべての電圧をLowに
_delay_ms(500);//500ms(0.5秒)待つ
}
}
書き込んだら、PC0~6のどれでもいいので、LEDを繋いでみてください。そうすると、LEDは1秒周期で点滅すると思います。
次は、点滅の間の時間を変えてみましょう。そこで、関数の紹介ですが、
_delay_ms();
これは、()の中の時間[ms]だけ待つという関数です。
さぁ!みなさん時間を変えてみましょう!
ちなみに、点滅を周期が10msになるように設定してみるとちょっと不思議な事が起こると思います。
この不思議な事の正体は後の回を受けるとわかると思います。
最終更新:2015年08月17日 09:07