3664F,3694Fで始めるH8 500円で始めるPIC 始めるAVR

LED点灯 ( IO入出力 )


まずは確認にLEDをスイッチで点灯させる。
スイッチを入れるとLEDが点灯する。これで入力と出力をC言語で試す

        

LEDをスイッチで点灯

AVRの入出力

ATTINY2313 (内部発振8MHz動作)

出力 入力
PD4--LED     PD2--SW(ON=GND
PD5--LED     PD3--SW(ON=GND
もともとの初期設定=工場出荷時で実行しました。プログラムは以前つくったものなので周波数、設定などのコメントが違うことあり
/***********************************
	Led SW テスト

 led #4  点灯
 led #5 SW押し間だけ点灯
  
 Circuit
  PortD #2,3 - SW(on=GND)
        #4,5 - LED

************************************/

#include <avr/io.h>

int main()
{


  // 初期化
  //ポート入出力設定
	DDRD = 0xF3;		// ポートDを1111 0011  #2,3だけ入力設定

  	PORTD = 0x0C;		//          0000 1100  #2,3だけ内部プルアップ設定
/*	PORTD |= _BV(PD2);	// ポートD #2内部プルアップ (同↑命令)
	PORTD |= _BV(PD3);	// ポートD #3内部プルアップ
*/

  // 出力	
	PORTD |= 0x10;			// 0001 0000 #4だけ出力 led#4点灯

	while(1){

		if( bit_is_clear (PIND,PD2) ) { 		// ポートD#2 ==0 なら

			PORTD |= _BV(PD5); 		//#2SW押しで Led#5点灯 PD5ピンを orHigh
			
		}else{

			PORTD &= ~_BV(PD5);     //#2SW押さないと Led#5消灯 PD5ピンを andLow
		}  
	}

}
                               コメント 他ビットを変えない目的ビット操作を orHigh 、andLow と記述

●動作

PD4-LED4 最初から点灯
PD2-SWを押している間 PD5 LED5点灯


入出力ポートについて

・入力方向設定レジスタ DDR×
     出力は 1
     入力は 0

IOポート設定は少しPICなどと違うところがあり
データレジスタが出力用読み取り(入力)用に分かれていて、別レジスタでする

   ・ポートB出力レジスタ PORTB (ポートAならPORTA)
   ・ポートB読み取りレジスタ PINB  (ポートAならPINA)

  AVRは変則的 ポート設定方法になっているところもある
・方向設定レジスタ(DRR×) を入力設定にして
 データレジスタ(PORT×)でにすると 内部プルアップ設定になる。 (すべてのIOポートに内部プルアップ可能)

・方向設定レジスタ(DRR×)を出力設定にして
 入力用データレジスタ(PIN×)でにすると 出力データが反転になる。


【 マクロ など 

●ビットアクセス

・マクロ _BV()
<avr/io.h>で、AVR各レジスタのビット名とビット番号(0〜7)の対応が定義
たとえば、_BV(PINA6) (1<<PINA6) を返し、これはPINA6に対応するビット(bit6)をONとした時のPINAの値 64 (二進数で0b00100000)を返します。

ビット操作
   PORTB |= _BV(PB1);     PB1ピンだけをHighにし、残りは変化させない
   PORTB &= ~_BV(PB1);     PB1ピンだけをLowにし、残りは変化させない

 * sbi(),cbi() はすでに廃止、削除されたとのこと

●ビットチェック  bit_is_set() ,  bit_is_clear()

・bit_is_set()    指定レジスタの指定のビットがセット(1)されているかどうかチェック
・bit_is_clear()   セット(1)されてされていないかチェック

●ビットチェックループ用 loop_until_bit_is_set() , loop_until_bit_is_clear()
例)
   while( bit_is_clear(PINB,PINB3) )
   {
     //PINB3が0の間この処理を行う
   }

   参考資料
     ・AVR Wiki
      I/Oレジスタ、入出力ポートの使い方> より

     ・AVR libc 日本語訳
      

入出力関連レジスタ



DDR×レジスタ 方向入出力設定
7 6 5 4 3 2 1 0
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
各PINに入力、出力の設定をするレジスタ

PORT×レジスタ  出力H、L設定
7 6 5 4 3 2 1 0
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
・DDRで出力ピンに設定してある場合
   このレジスタでH、Lの出力を設定
DDRで入力ピンに設定してある場合
   このレジスタに1を書き込むと内部プルアップの設定

PIN×レジスタ 入力読み取り
7 6 5 4 3 2 1 0
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
入力設定にしたPINの読み取りのときこのレジスタを介して読み取る

3664F,3694Fで始めるH8 500円で始めるPIC 始めるAVR
        メインページへ