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が交互に光ります。
しかし、これを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 (土)
- そう、コンパイルに10分、消して焼くのに15分、サボリーマンにはその余裕こそ大切です。ゆとりマンセー(デスマーチ時除く) -- たけちよ 2007-11-03 21:26:46 (土)
- 確かに。焼いてる間にタバコ吸ってましたね。急ぐときは1本、急がないときは・・・ -- コー 2007-11-04 18:03:21 (日)
[ 戻る ]