Top / 日記 / 2007 / 10 / 31

2007年10月31日の日記

助けてください

相変わらずコソコソとAVRで遊んでます。 で、最近どうしても解決出来ない悩み事。

.include "tn2313def.inc"
.cseg
		rjmp	reset
		reti
		reti
		reti
		reti
		reti
		rjmp	tim0_ovf

tim0_ovf:
		in		r14, SREG
		sbi		PORTB,0
		ldi		r16,255
		dec		r16
		brne	PC-1
		dec		r17
		cbi		PORTB,0
		out		SREG,r14
		reti

reset:	
		ldi		r16,255
		out		DDRB,r16
		
		ldi		r16, 0b00000101		;1/1024
;		ldi		r16, 0b00000001		;1/1 Debug
		out		TCCR0B, r16
		ldi		r16, (1<<TOV0)
		out		TIMSK, r16
		sei
		sbi		PORTB,3

loop:
		ldi		r17,10
		sbi		PORTB,1
		cbi		PORTB,2
		cpi		r17,0
		brne	PC-1

		ldi		r17,10
		cbi		PORTB,1
		sbi		PORTB,2
		cpi		r17,0
		brne	PC-1


		rjmp	loop

実験的にこういうモノを書いてみますた。
実際にアセンブルして焼いてみたら、思惑通りにPB3のLEDが点灯し、PB0のLEDがピコピコ光りつつ、PB1とPB2のLEDが交互に光ります。

fileMAV_0009.3G2

しかし、これをAVRStudioのエミュレータで走らせると、スタックがウンタラヌカして、割り込みで飛んだ先でループします。orz
これに限らず、割り込みを掛けるとエラーがドバっと出て、ロクに動きません。
これって悪いの俺なのか、それともAVRStudioなんだろ?

とりあえずハラ減った。
メシ買うてこ。

自己解決

こういう事でした。

reset:
	ldi	TMP,LOW(RAMEND)
	out	SPL,TMP

原因は、スタックポインタレジスタの初期化をしていなかったって事ですわ。 SRAM内蔵の石は、スタックポインタレジスタをRAMのケツに置くようなんですが、その位置を上のようなおまじないで決めてやらんとあかんみたいです。 ちなみに内蔵SRAM256バイト以下の石は下位バイトのみ、ソレ以上は上位も入れてやる必要があるらしい。

コメント

  • ありがちな失敗ですね。自分も良く忘れました。 -- オジギ草? 2007-11-02 02:04:37 (金)
    • 世間で見かけるお手本で、1200やmega系はそれなりに有るのですが、意外にTiny2313って少ないみたいです。(^^;)それと大昔にX68Kで少しアセンブラかじった事ありますが、まあ全くのド初心者なもので、普通にソースを頭で負えないのが辛かったです。今ならそれなりに慣れてきましたが、まだまだイッパツでは決まりませんねぇ。(^^;)修行あるのみです。-- しらいまさや 2007-11-03 12:23:57 (土)
  • 昔はROMを焼くのに5分消すのに10分以上かかったもんです。今はすぐ書き換えられるからカットアンドトライもしやすくなりましたよね。うちのAVRはまだ書き込み出来ません。 -- コー 2007-11-03 12:51:54 (土)


      コメント欄の使い方の説明       カキコミの練習はこちらでどうぞ

[ 戻る ]
Top / 日記 / 2007 / 10 / 31
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS