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つのポートがあります(Cは6本しか使えないので計22本).

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

入出力の設定

それぞれのピンは,入力と出力の両方に使えます.ただし,一つのピンで入力と出力は同時にできないので,入力と出力どちらにするかを切り替える必用があります.

入出力はDDRx(Data Direction Register)というレジスタ(C言語でいう変数)に数値を書き込むことで設定できます.「x」の部分にはポート名が入ります.

avr02-02.pngavr02-03.png

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秒待つ
    }
}

4つのLEDが点滅しましたか?余裕があるなら点滅のパターンを変えてみてください.

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.