LED点灯 ( IO入出力 )

AVR2313

スイッチ入力情報を検知し、LEDをスイッチで点灯させる。


スイッチを入れるとLEDが点灯する。これで入力と出力をC言語で処理

LEDをスイッチで点灯

AVRの入出力

 

ATTINY2313 (内部発振8MHz動作)

 

出力 入力
PD4--LED     PD2--SW(ON=GND
PD5--LED     PD3--SW(ON=GND

 

 

プログラム

 

もともとの初期設定=工場出荷時で実行しました。プログラムは以前つくったものなので周波数、設定などのコメントが違うことあり

 

ファイル名


 

#include 

int main()
{


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

  	PORTD = 0x0C;		//          0000 1100  #2,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×)で1にすると
     内部プルアップ設定になる (すべてのIOポートに内部プルアップ可能)
  • 方向設定レジスタ(DRR×)を出力設定にして 入力用データレジスタ(PIN×)で1にすると
     出力データが反転になる

【 マクロ など 】

●ビットアクセス

マクロ _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の間この処理を行う
}

 

 


スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena