« もう1つのオチ | トップページ | 軽量化 »

2007.11.11

■備忘録■tiny26 と tiny261/461/861の違い

GCCを使ってtiny861でタイマ割り込みによる一定間隔でAD変換を行い、UARTでPCに送るところまでテスト完了。

これまで tiny26で組んでいたものを tiny861に移植するにあたって、その違いにより少しハマったところをざっと記しておく。
(従来のアセンブラソース→Cへの違いを除いたプロセッサ仕様上の違い。)

ATtiny261/461/861はATtiny26の機能強化版。ATtiny261/461/861はそれぞれ、メモリ容量が
 ATtiny261: 2KB , 128B , 128B
 ATtiny461: 4KB , 256B , 256B
 ATtiny861: 8KB , 512B , 512B
と違っている他の仕様は同じ。
(左からプログラム領域のFLASH, SRAM , EEPROM)

ちなみにATtiny26 は
 ATtiny26 : 2KB , 128B , 128B

機能上の主な強化点は タイマ関連とADC関連、あと新機能として外部からの供給クロックを分周してシステムクロックとする機能。
このあたりの微妙な違いによってtiny26のソースがそのままでは意図どおり動作してくれなくなる。

■システムクロックを外部供給された物から分周
 外部クロックで動かす場合、クロック分周はI/OレジスタCLKPRのCLKPS0~3で分周無しから最大256分周の範囲で設定できるようになったようだが、その初期値はヒューズビット CKDIV8 によって決まってくる。
 CKDIV8 がプログラム(0)されると起動時はこれが8分周される設定となる。
 つまり、10MHz与えてもシステムクロックは1.25MHzとして動作する。
 非プログラム(1)の場合は分周なしで起動。 即ち10MHz与えたら最初から10MHzで駆動する。

 出荷時設定はヒューズビットCKDIV8 はプログラム(0)となっているようなので、注意が必要。
 最初、こんなのが追加されていることを知らなかったのでうまく通信が出来なくてハマりました。

Robo20071111_1AVR Studioのライタで見た場合は、[Fuses]タブで "Devide clock by 8 internally; [CKDIV8=0]" にチェックが入った状態で出荷されている。

このチェックが入っていると、供給クロックを8分周したものが起動時のシステムクロックとなる。
外せば起動時で分周なし。

分周値は動的に変更可能なので、チェックが入ったままで起動時に分周値を1に変更してやってもいい。

余談となるが、この動的なシステムクロック分周変更をうまく使えば、システムクロック256分周、タイマ0前置分周1024として16ビットタイマのオーバフロー割り込みとすれば、10MHzの外部クロックでも最大1718秒もの長周期のタイマ割り込みが使えることになる。
処理のときはシステムクロックを1/1にしてやればいいので、処理時のプロセッサパワーと待機時の低消費電力を両立できる。

■タイマ0が16ビット化(または8ビットx2)されている。
 機能拡張に伴い、従来とタイマ関連のI/Oレジスタ名等が変更されている。

■ADCで内部基準電圧を使う場合、これまでのソースコードのままだと1.1Vが基準になってしまう。
 ATtiny26の場合内部基準電圧は2.56Vのみだったが、ATtiny861では2.56Vと1.1Vが選択可能となっており、その切り替えは新設されたI/OレジスタADCSRBのREFS2ビットで行われる(デフォルトは1.1V)。
 そのため、内部基準電圧2.56Vの従来通りのソースをそのまま動かす(ADCSRレジスタはADCSRAに変更が必要)と、1.1Vが内部基準電圧として使われることとなり、取得値も当然違ってくる。

およそこんなところか。

必要に応じてデータシートを見比べる必要があります。
HERO'S Downloadで日本語訳されたデータシートで比較するとATtiny26とATtiny261/461/861で1.5倍ほどのボリューム差があります...

|

« もう1つのオチ | トップページ | 軽量化 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« もう1つのオチ | トップページ | 軽量化 »