LEDを使う

基板上に4つあるLEDを光らせてみます. 前回書き込んだプログラムの解説みたいなものです.

avr02-01.jpg

回路

LEDはPD-0~PD-3に繋がっています.

「PD-0」というのは「ポートDの0番目のピン」という意味です. 詳しくは下で説明するので読んでください.

AVRLED
PD0LED0
PD1LED1
PD2LED2
PD3LED3

ポートの設定

今回使う,ATMEGA88というAVRは,28本の足があって,そのうち22本を プログラムから操作できます(本当はもう1本あるがリセットに使っている). また,ピン8本がセットになった「ポート」というものを1単位として操作します. MEGA88にはB,C,Dの3つのポートがあります.

「ピン」のことを「足」とも言いますが,同じものです.

それぞれのピンは,入力と出力の両方に使えます. ただし,入力と出力は同時にできないので,モードを切り替える必用があります. DDRxというレジスタ(C言語でいう変数)に数値を書き込むことで設定できます. 「x」の部分にはポート名が入ります.

avr02-02.png avr02-03.png

DDRxのビットが「0」のピンは入力,「1」のピンは出力になります.

LEDが繋がっているのは,ポートDなので,DDRDで設定します. 変数名,最後の「D」は「ポートD」の意味です.

今回は,とりあえず全てのピンを出力にするので,0xFFです.

出力の方法

PORTxというレジスタに値を書き込むと,0ならばL,1ならばHがピンから出力されます. これも,「x」の部分にはポート名が入ります.

ポート単位で操作するので,書き込む値は8ビットの整数となります.

2進数の表記法

おまけとして,C言語で数字を2進数で表記する方法. ただし,必ず使えるわけでは無いので普段は使わないようにしてください.

数値の前に「0b」を付けると2進数とみなされます.

例:

a = 0b11111111;

「a = 255;」 や 「a = 0xFF」と同じ結果になります.

この機能は,標準ではありません. Macのgccでは使えないみたいですが,情報工の学生なので大丈夫ですよね?

プログラム

led_test.cというような名前で保存してください.

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); // 少し待つ
	}
}

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.