*2007年10月31日の日記 [#nfc275cd]
**助けてください [#l0701e37]
相変わらずコソコソと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が交互に光ります。
&attachref(MAV_0009.3G2);
しかし、これをAVRStudioのエミュレータで走らせると、スタックがウンタラヌカして、割り込みで飛んだ先でループします。orz~
これに限らず、割り込みを掛けるとエラーがドバっと出て、ロクに動きません。~
これって悪いの俺なのか、それともAVRStudioなんだろ?
とりあえずハラ減った。~
メシ買うてこ。
**自己解決 [#e321dfb9]
こういう事でした。
reset:
ldi TMP,LOW(RAMEND)
out SPL,TMP
原因は、スタックポインタレジスタの初期化をしていなかったって事ですわ。
SRAM内蔵の石は、スタックポインタレジスタをRAMのケツに置くようなんですが、その位置を上のようなおまじないで決めてやらんとあかんみたいです。
ちなみに内蔵SRAM256バイト以下の石は下位バイトのみ、ソレ以上は上位も入れてやる必要があるらしい。
***コメント [#s21d23fe]
- ありがちな失敗ですね。自分も良く忘れました。 -- [[オジギ草]] &new{2007-11-02 02:04:37 (金)};
-- 世間で見かけるお手本で、1200やmega系はそれなりに有るのですが、意外にTiny2313って少ないみたいです。(^^;)それと大昔にX68Kで少しアセンブラかじった事ありますが、まあ全くのド初心者なもので、普通にソースを頭で負えないのが辛かったです。今ならそれなりに慣れてきましたが、まだまだイッパツでは決まりませんねぇ。(^^;)修行あるのみです。-- [[しらいまさや]] &new{2007-11-03 12:23:57 (土)};
- 昔はROMを焼くのに5分消すのに10分以上かかったもんです。今はすぐ書き換えられるからカットアンドトライもしやすくなりましたよね。うちのAVRはまだ書き込み出来ません。 -- [[コー]] &new{2007-11-03 12:51:54 (土)};
- そう、コンパイルに10分、消して焼くのに15分、サボリーマンにはその余裕こそ大切です。ゆとりマンセー(デスマーチ時除く) -- [[たけちよ]] &new{2007-11-03 21:26:46 (土)};
- 確かに。焼いてる間にタバコ吸ってましたね。急ぐときは1本、急がないときは・・・ -- [[コー]] &new{2007-11-04 18:03:21 (日)};
#commentx
#back