基板上に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つのポートがあります.
「ピン」のことを「足」とも言いますが,同じものです.
それぞれのピンは,入力と出力の両方に使えます. ただし,入力と出力は同時にできないので,モードを切り替える必用があります. DDRxというレジスタ(C言語でいう変数)に数値を書き込むことで設定できます. 「x」の部分にはポート名が入ります.
DDRxのビットが「0」のピンは入力,「1」のピンは出力になります.
LEDが繋がっているのは,ポートDなので,DDRDで設定します. 変数名,最後の「D」は「ポートD」の意味です.
今回は,とりあえず全てのピンを出力にするので,0xFFです.
PORTxというレジスタに値を書き込むと,0ならばL,1ならばHがピンから出力されます. これも,「x」の部分にはポート名が入ります.
ポート単位で操作するので,書き込む値は8ビットの整数となります.
おまけとして,C言語で数字を2進数で表記する方法. ただし,必ず使えるわけでは無いので普段は使わないようにしてください.
数値の前に「0b」を付けると2進数とみなされます.
例:
a = 0b11111111;
「a = 255;」 や 「a = 0xFF」と同じ結果になります.
この機能は,標準ではありません. Macのgccでは使えないみたいですが,情報工の学生なので大丈夫ですよね?
led_test.cというような名前で保存してください.
#include<avr/io.h> // 指定された時間だけ待つ void wait(uint16_t w){ while(w--){ volatile uint16_t i=200; while(i--); } } int main() { DDRD=0xFF; for(;;) { PORTD = 0b1111; // ON wait(1000); // 少し待つ PORTD = 0b0000; // OFF wait(1000); // 少し待つ } }