LEDを使う
基板上に4つあるLEDを光らせてみます.前回書き込んだプログラムの解説みたいなものです.
回路
LEDはPD-0~PD-3に繋がっています.
「PD-0」というのは「ポートDの0番目のピン」という意味です.詳しくは下で説明するので読んでください.
AVR | LED |
---|---|
PD0 | LED0 |
PD1 | LED1 |
PD2 | LED2 |
PD3 | LED3 |
ポートの扱い
今回使う,ATMEGA88というAVRは,28本の足があって,そのうち22本をプログラムから操作できます(本当はもう1本あるがリセットに使っている).また,ピン8本がセットになった「ポート」というものを1単位として操作します.MEGA88にはB,C,Dの3つのポートがあります(Cは6本しか使えないので計22本).
「ピン」のことを「足」とも言いますが,同じものです.
入出力の設定
それぞれのピンは,入力と出力の両方に使えます.ただし,一つのピンで入力と出力は同時にできないので,入力と出力どちらにするかを切り替える必用があります.
入出力はDDRx(Data Direction Register)というレジスタ(C言語でいう変数)に数値を書き込むことで設定できます.「x」の部分にはポート名が入ります.
- DDRx 入出力切り替え
- PORTx ピンに出力する値
- PINx ピンから入力された値
DDRxのビットが「0」のピンは入力,「1」のピンは出力になります.
LEDが繋がっているのは,ポートDなので,DDRDで設定します.変数名,最後の「D」は「ポートD」の意味です.
今回は,ポートDは出力にしか使わないので,0xff(全て1)にします.
DDRD = 0xff; // ポートDは全て出力
出力の方法
PORTxというレジスタに値を書き込むと,0ならばL(0V),1ならばH(5V)がピンに出力されます.これも,「x」の部分にはポート名が入ります.
ポート単位で操作するので,書き込む値は8ビットの値となります.
2進数の表記法
おまけとして,C言語で数字を2進数で表記する方法.ただし,必ず使えるわけでは無いので普段は使わないようにしてください.
数値の前に「0b」を付けると2進数とみなされます.(この機能は,標準ではありません.WinAVR以外では使えないみたいですが,情報工の学生なので大丈夫ですよね?)
例:
a = 0b11111111; a = 0xff; a = 255;
上の3行は全て同じ意味で,a には255が代入されます.
プログラム
C言語を始めて使ったときには,stdio.hをおまじないのようにインクルードしたと思いますが,今回も似たようなものがあります.
#define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h>
この3行がAVRのおまじないです.avr/io.hでAVRの基本的な機能が使えるようになります.util/delay.hは時間待ちのためのものです.時間を調節するためにF_CPUでクロック周波数を指定します
以下のプログラムを led_test.c というような名前で保存してください.
led_test.c
#define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> // 指定された時間だけ待つ void wait(uint16_t w){ while (w-->0) _delay_ms(1); } int main() { DDRD = 0xff; // ポートDは全て出力 for(;;) { PORTD = 0b1111; // ON wait(500); // 0.5秒待つ PORTD = 0b0000; // OFF wait(500); // 0.5秒待つ } }
- uint16_tは unsigned short型 と同等です
- _delay_msは delay.h内で宣言されていて,指定したミリ秒だけ待ちます
4つのLEDが点滅しましたか?余裕があるなら点滅のパターンを変えてみてください.
この文書の履歴
- 2006-06-29 慌てて作成
- 2009-07-08 _delay_ms()を使うように