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

フラッシュROMにデータを置いて読む [AVR]

フラッシュROM
.db と書くとフラッシュromに保存されるそうな。
それをPD0ピンのスイッチを押すごとにlpmで呼んでいくサンプル

ちなみにこれもデジット
マイコン製作会
で懇切丁寧に教えてもらったものです。

.include "m168def.inc"
                                
.org 	0x0000		jmp	reset 	;initialize

reset:		ldi	r16, low(ramend)
			out	spl, r16
			ldi	r16, high(ramend)
			out	sph, r16

			ldi r16, 0x00
			out ddrd, r16	; d input
			ldi r16, 0xff
			out ddrb, r16	; b output
			out portb, r16

main:		ldi	zl,low(LEDDATA<<1)
			ldi	zh,high(LEDDATA<<1)
			ldi r16,low(LEDDATA)
			clr r19

main1:		inc r19
			lpm	r18,z+
			cpi r19, 6
			breq main
main2:		rcall delay1ms
			in	r16,pind
			cpi	r16,0b1111_1110
			brne main2
			out	portb,r18
main3:		rcall delay1ms
			in	r16,pind
			cpi	r16,0b1111_1111
			breq main1
			rjmp main3

LEDDATA:	.db 0x00,0x01
			.db 0x02,0x04
			.db 0x08,0x0F


delay1ms:	push r16
			in r16,sreg
			push r16
			push r17
;			100000-10=99990
			ldi r17,198
delay2:		ldi r16,100
delay1:		dec r16
			nop
			cpi r16,0
			brne delay1
			dec r17
			cpi r17,0
			brne delay2
;			999990-(100*5+4)*198=198
			ldi r16,46
delay3:		dec r16
			cpi r16,0
			brne delay3
;			198-46*4=14
			nop
			nop
			nop
			pop r17
			pop r16
			out sreg,r16
			pop r16
			ret



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



AVRアセンブラはじめました [AVR]

デジットマイコン製作会で習ってきました。
とりあえずLチカ
.include "m168def.inc"

.org	0x00	jmp	reset

reset:							; initialization
		ldi	r16, low(ramend)
		out	spl, r16
		ldi	r16, high(ramend)
		out	sph, r16
		
		ldi	r16, 0xff
		out	ddrb, r16			; set direction on portb

		ldi	r16, 2
		out	portb, r16			; turn off portb pin2, others are on 

main:
		rjmp main


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