Entry

1200 から 2313 へ

2004年05月25日

AT90S1200 から AT90S2313 に移行してみて,ハマったところをちょっとだけメモメモです。

AVR をいぢっているといっても,液晶モジュールを制御してニヤニヤしたり,簡単なタイマを作ったりしてるくらいだから,上位チップに変える必要はないんですけどね。1200 と 2313 は 70 円くらいしか価格が変わらないから,衝動的に買っちゃっただけだったりします。

1200 と 2313 はピンコンパチだから,同じ HEX ファイルを焼けばそのまま動くと思ってたんですけど,そうは問屋が卸してくれませんでした(当たり前)。結局データシート [PDF] を読む羽目になったので,この際メモメモです。

まず,2313 は割り込みが強化されて10個に増えているので,1200 と同じ割り込みテーブルは使えません。リセットだけを有効にしたものをざっと書くと,こんな感じ。

.org 0
        rjmp    reset    ; reset
        reti             ; external interrupt 0
        reti             ; external interrupt 1
        reti             ; timer/counter1 capture event
        reti             ; timer/counter1 compare match
        reti             ; timer/counter1 overflow
        reti             ; timer/counter0 overflow
        reti             ; UART RX complete
        reti             ; UART data register empty
        reti             ; UART TX complete
        reti             ; analog comparator

reset:
    ...

1200 のときは4つしかなかったけれど,これを見ると 2313 の多機能っぷりがよく分かります。

もう1つ。

AT90S1200 はハードウェアスタックを使ってサブルーチンを呼んでいるけれど,AT90S2313 は SRAM でスタックを管理することになっています。そんなもんで,1200 ではメモリ周りを触らなくてもサブルーチンが呼べたのに対して,2313 の場合は,スタックとして使えるデータアドレスを指定しておかないと,サブルーチンを使えません。

具体的には,スタックポインタを扱っているレジスタ SPL ($3D($5D))に始まりのアドレスを書き込んでおくことになります。データシートそのまんまですけど,大体こんな感じ。

.def    temp    =r16

        ldi    temp low(RAMEND)
        out    SPL, temp

スタックポインタの挙動は,

The Stack Pointer is decremented by 1 when data is pushed onto the stack with the PUSH instruction, and it is decremented by 2 when an address is pushed onto the stack with subroutine calls and interrupts.

らしいので,指定した位置から若いアドレス($60 方向)に向かって積まれていくようです。

また,スタックは SRAM 上に作られるから,SRAM のデータアドレス($60-$DF)を指定する必要があります。ここでは,データアドレスの最後($DF)を指しているから,SRAM をめいっぱいスタックに使う設定になっているようです(自分で書いててよく分かってない)。ともあれ,1200 の貧弱なスタックに比べたら,もうちょっとマシなことができそうな感じです。

当たり前ですけど,この設定は,サブルーチンを呼ぶ前と割り込みを有効化する前(つまりスタックを使う前)に設定しておく必要があります。あちこちのソースコードを拾い読みする限り,リセットルーチンあたりで真っ先に書いておくのが定石のようです。

2313 のデータシートを見ると 1200 に無い機能が盛りたくさんでワクワクしてしまいます。70 円多めに投資する価値はありそうですね。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN