So-net無料ブログ作成
検索選択

AVRアセンブラでCTCタイマー [AVR]

AVRマイコンプログラミング入門(廣田修一)
をみながら勉強中。
ほぼコピペですけど動いたのがうれしいので掲載。

CTC割り込み
1MHzで動かしていたなら、その1/1024が100回で割り込み発生
するので、(1/1M)*1024*100=100ms おきにLチカが発生。

.include "m168def.inc"

.def	STACK	=	r16
.def	R_TEMP1	=	r17
.def	R_TEMP2	=	r18

.equ	P_LED	=	portb
.equ	B_LED	=	0

.org	0x00		jmp	reset			;initialize
.org	0x1c		jmp tim0_compa		;タイマ/カウンタ0比較A一致

tim0_compa:
		in	STACK,	sreg				; evaculate registers
		
		in	R_TEMP1, P_LED
		ldi	R_TEMP2, 0x00
		sbr	R_TEMP2, (1<<B_LED)
		eor	R_TEMP1, R_TEMP2			; take 1 xor x toggle the bit of x
		out	P_LED, R_TEMP1

		out	sreg, STACK					; restore registers
		
		reti

reset:
		cli								; prevent interrupt

		ldi	R_TEMP1, 0xff
		ldi R_TEMP2, 0x01
		out	ddrb, R_TEMP1
		out portb, R_TEMP2

		ldi	R_TEMP1, 0x02
		out	tccr0a, R_TEMP1				; set timer 0 ctc mode

		ldi	R_TEMP1, 0x05
		out	tccr0b, R_TEMP1				; prescaler 1024 (means interrupt every 1024 clocks)

		ldi	R_TEMP1, 0x62				; count up to 100 til interrupt
		out	ocr0a, R_TEMP1

		lds	R_TEMP1, timsk0				; set timer mask
		sbr	R_TEMP1, (1<<ocie0a)
		sts timsk0, R_TEMP1				; start timer

		sei								; allow interrupt

main:
		rjmp main



nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

石原健二

はじめまして。
やぶからぼうで失礼ですが、インターネットのAVR Assembler siteで、
解からないところが、ありましたのでお伺いさせて頂きます。

例を申しあげますと、マクロ命令をご使用されておられる方が
おられまして、例えば、

; jbic PORTB, b, adr
_macro jbic
sbis @0, @1
rjmp @2
.endm
のような書式の命令です。 私、まだ Avr Assemblerについて
初心者ですので、もし、お解かりでしたら、教えて頂けませんか。
宜しく、ご指導のほど、お願い致します。
以上です。
E-mail address: nanohana_007@mail.goo.ne.jp

by 石原健二 (2014-03-03 20:21) 

tacobell

遅くなって申し訳ありません。今コメントに気づきました。
私も初心者の域を出ていないですが、おそらくこういうことかと。

jbic PORTB, b, adr

という風に書いている行を

sbis PORTB, b
rjmp adr

に置き換えるということなのですが、 sbis が何かわからないので調べました。
データシートに
SBIS A, b : Skip if Bit in I/O Register Set
とあるので PORTB の b 番目のビットが 1 なら次の行をスキップ
ということのようです。

従いまして "もし PORTB の b 番目が 0 なら adr に飛ぶ"という分岐処理を
一行で書けるようにしたものと思われます。

by tacobell (2014-04-19 04:18) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。