›ã‚‹ã€‚
本文へスキップ

アトメル社のAVRマイコンをつかった電子工作および無線を使った電子工作を紹介します。





ホーム > ソフト室 >AVRマイコンで始めるC言語の使い方 >LEDを点灯させる。

AVRマイコンで始めるC言語の使い方

LEDを点灯させる。

AVRマイコンのポートに接続されているLEDの点灯させます。
LEDの点灯については工作室の「はじめの一歩LEDの点灯」頁も参照してください。

1.マイコンの初期設定

マイコンの初期(電気を入れた後)のポートの状態は入力に設定されています。
LEDを点灯させるには、接続されているマイコンのポートを出力に設定します。
次に’H’(今回の学習用ハードの場合)をポートに出力します。ポートに’H’つまり5Vを出力するとポート→抵抗680Ω→LED→グランドと電気が流れてLEDが点灯します。
その他のポートはどうするかというと出力に設定しておきます。このマイコンはCMOSででできているためにノイズ等で貫通電流が流れる可能性があるためです。最近のマイコンは内部的にこのようなことが起こらないようになっているらしいのですが、ATmega328Pのマニュアルに未使用ピンの取り扱いについて明確に記載されいません。そのためここでは未使用の端子は出力に設定しておきます。
ATmega328PではポートはPB0~PB7、PC0~PC5(PC6はリセット端子として使用します。)、PD0~PD7です。
ポートの入力または出力の設定はレジスタDDRxで行います。(xはB、C、Dが入ポートPB、ポートPC、ポートPDに対応しています。)入力または出力の設定は1ビット毎に設定できます。
DDRxレジスタ
DDx7 DDx6 DDx5 DDx4 DDx3 DDx2 DDx1 DDx0
初期値 0 0 0 0 0 0 0 0
出力の状態'H'または'L'の設定はレジスタPORTxでおこない、'0'を設定すると'L'を出力し、'1'を設定すると'H'を出力します。
PORTxレジスタ
PORTx7 PORTx6 PORTx5 PORTx4 PORTx3 PORTx2 PORTx1 PORTx0
初期値 0 0 0 0 0 0 0 0

学習ハードでは、PD4からP7がLED(出力)に接続されています。PD0~PD3がスイッチ(入力)に接続されています。、PB0~PB7がLCDに接続されています。
では、ポートの設定はプログラムではどのようにするかというと
[入出力の設定]
DDRD = 0b11110000;  //PD7~PD4が出力、PD0~PD3が入力に設定することを示します。2進数で表示しています。
DDRB = 0b11111111; //PB7~PB0を出力に設定することを示します。2進数で表示しています。
DDRC = 0b00111111; //PC7とPC6はポートとしては使用しないので'0'(初期状態のまま)としておきます。
            他は出力に設定します。2進数で表示しています。
[出力ポートは'L'に設定]
PORTD = 0b00000000; //PD7~PD4は'L'出力、PD3~PD0は入力ポートなので初期値’0’のままとします。
                                     // 2進数で表示しています。
PORTB = 0b00000000; //PB7~PB0は'L'出力。2進数で表示しています。
PORTC = 0b00000000; //PC7~PC0は'L'出力。2進数で表示しています。
以上で初期設定は終了です。

設定方法は上記のほかに以下の書き方があります。
(1)DDRB = 0b1111111;   // 2進数で表現します。上記の方法です。
(2)DDRB = 0xff;               // 16進で表現します。
(3)DDRB = (1 << DDB7) | (1 << DDB6) | (1 << DDB5) | (1 << DDB4) | (1 << DDB3) | ( 1 << DDB2) |
               (1 << DDB1) | (DDB0);
                        DDBxはヘッダファイルに以下のように定義されています。
                           #define DDB0 0
                           #define DDB1 1
                           #define DDB2 2
                           #define DDB3 3
                           #define DDB4 4
                           #define DDB5 5
                           #define DDB6 6
                           #define DDB7 7
          "<<"はシフト演算子といいます。使い方は「ツール->Tips->シフト演算子」参照してください。
(4)PD7とPD6を'H'から'L'にかえたいときは以下のようにします。
          PORTD &= 0x3f;
          PORTD &= ~(( 1 << PORTD7) | (1 << PORTD6))
(5)PD7とPD6を'L'から'H'に変えたいときは以下のようにします。
          PORTD |= 0xc0;
          PORTD |= (1 << PORTD7) | (1 << PORTD6);

2.プログラムの作成

AVR Studio 6を起動し、マイコンの形名をATmega328Pを選択します。プロジェクト名は適当に決めます。
AVR Studio 6の使い方については「ツールのAVR Studio 6インストール及び使用方法」を参照してください。
初期のプログラムを以下に示します。

/*
 *avr001t.c
 *
 * Created: 
 *  Author:
 */ 


#include <avr/io.h>

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
while繰り返しループについて
while(条件式){.....}で表され条件式が成立(真または0でないといいます)している間は{.....}内を繰り返し実行します。while繰り返しループから抜けるのは条件式が成立しなかったとき(偽または0の時と言います。)です。
while(1)は条件式が1ですので条件式は常に成立しますので{....}内を無限に繰り返します。

プログラムはwhile(1)の前に書きます。初期設定を行った後にLEDを点灯させるためにポートに'H'を出力します。
以下にプログラムを示します。
プログラムのマイコンへの書き込みは「ツールのプログラマAVRISP mkⅡ」を参照してください。
/*
 * avr001.c
 *
 * Created:
 *  Author:
 */ 


#include <avr/io.h>

int main(void)
{
    // ポートB初期設定
    DDRB = 0xff;    // 0b11111111と同じ意味で16進表示しています。PB7~PB0を出力に設定します。
    PORTB = 0;      // 0b00000000と同じ意味で16進表示しています。PB7~PB0に'L'を出力します。ポートC初期設定
    DDRC = 0x3f;    // 0b00111111と同じ意味で16進表示しています。PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
    PORTC = 0;      // 0b00000000と同じ意味で16進表示しています。PC7~PC0に'L'を出力します。
    // ポートD初期設定
    DDRD = 0xf0;    // 0b11110000と同じ意味で16進表示しています。
                    // PD7~PD4は出力、PD3~PD0は入力に設定します。
    PORTD = 0;      // 0b00000000と同じ意味で16進表示しています。
    
    // LED4つとも点灯させます。
    PORTD = 0xf0; // PD7~PD4に'H'を出力してLEDを点灯させます。
    
  while(1)
    {
        //TODO:: Please write your application code 
    }
}
初期設定をした後にLEDが点灯するようにポートに'H'を出力します。点灯した後はその状態をずっと保持しておきますので、while(1){}で無限ルーフとします。一般にマイコンのプログラムはプログラムを終了させることなく無限ループで動作状態を保つようにします。
うまく点灯したでしょうか? 次回はLEDの点滅をします。
前ページ次ページ