LEDループで点滅(アセンブラ)

AVR2313

LEDの点滅プログラムをアセンブラで作る


空ループやタイマー割り込みなどを使い、ウエイト間隔で LEDの点滅

ループでLED点滅

AVR2313を使用

 

LED SW入出力テストと同じ (内部発振1MHz動作)

 

出力 入力(使用せず)
PD4--LED     PD2--SW(ON=GND
PD5--LED     PD3--SW(ON=GND

 

プログラム

 

PD4にLED 接続 (PORTD.B4) し
空ループ時間待ちで間隔を作り点灯させるプログラム

 

1.ヒューズで内部発信器設定

 

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

 

LED点滅loop


 ;****************************************************************
;ループでLED点滅
;  内蔵8MHz、1/8分周 
;
; PD4にLED 接続 (PORTD.B4)
; LED(PD4:PORTD.B4)をループ時間待ちで点灯させるプログラム
;
;****************************************************************
.include "tn2313def.inc"

.def TEMP = R16 ; レジスタR16にTEMPと命名

.org 0x0000     ; リセット時にプログラムメモリの0番地から実行

RESET:
	LDI		R16,LOW(RAMEND)		;スタック設定 SRAMの最後
	OUT		SPL,R16

	ldi     TEMP,  0xFF      ; TEMPに 0xFF を書き込む
	out     DDRD,  TEMP      ; PORTDを全出力に設定

MAIN:

 LED_ON:
	ldi		TEMP, 0b00010000
	out		PORTD,TEMP			;PORTD.B4=1			

 	RCALL wait05				;約0.5Sウエイト
 		 
 LED_OFF:
	ldi		TEMP,	0b00000000	
	out		PORTD,TEMP			;PORTD.B4=0

 	RCALL wait05				;約0.5Sウエイト

	RJMP	MAIN

;0.5s待ちループ(1MHzクロック時)
wait05:
	LDI		R18,5

wait052:
	RCALL	wait01
	DEC		R18
	BRNE	wait052
	RET

;0.1s待ちループ(1MHzクロック時)
wait01:
	LDI		R19,100

wait012:
	RCALL	wait1m
	DEC		R19
	BRNE	wait012
	RET			
		

;1ミリs待ちループ(1MHzクロック時)
wait1m:
	LDI		R20,250

wait1m2:
	NOP					;合計4クロック
	DEC		R20			;
	BRNE	wait1m2		;
	RET										

                                          
       

 

空ループ処理

 

1M発振設定で

  1. 4クロックの250回のループ  = 1ms
  2. それを100回呼び出すループ = 0.1s
  3. さらにそれを5回呼び出すループ = 0.5s

で時間間隔を作る

 

 

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