
8bit AVRマイコンの進化形、ATXmegaのテストを始めました。
使用するチップは、[ATXmega128A1-AU] です。
まだ情報や製作例がほとんど無いため、少しずつテストをしながら、使用方法を模索していきたいと思います。
● ATXmegaとは?
Atmel社のRISCベースの8bitマイクロコントローラで、同社では16bitのマイコンを持たない代わりに、8bitのマイコンを進化させ続けているようです。
AT90S , ATtiny , ATmega , ATXmega (USBAVR , CANAVR)

|
ATXmegaの特徴
・動作電圧は、1.6V〜3.6V。
・最大32MHzの高速動作。
・32MHz, 2MHz, 32kHzの内部発振器。
・1〜31逓倍PLL。
・44ピンから100ピンのパッケージ。
・第2世代のピコパワー・テクノロジー。(省電力の進化)
・高速動作のための革新的なイベントシステム。
(CPUから独立した、周辺機器間のコミュニケーション)
・4チャンネルのDMAコントローラで、MCUの性能を向上。
・100%予測可能なタイミング。
・高速な12bitのADC(A/D変換器)とDAC(D/A変換器)。
・AESおよびDESに対応した、高速暗号化をサポート。
・RTC(リアルタイム・クロック)を搭載。
・従来のAVRと、命令の互換性あり。 |
型番の末尾 |
ピン数 |
I/O数 |
A1 |
100 |
78 |
A3 |
64 |
50 |
A4 |
44(49) |
36 |
|
開発環境 |
1.書込器(ライター)
2009年7月現在、下記2種類の書込器が使用可能です。
・ATMEL純正ライター 「AVRISP mkII」 ([AVR Studio 4] のプログラマーを使用)
・ATMEL純正デバッガー 「JTAGICE mkII」 (クローン)
2.書込インタフェース
・これまでのAVRでは、ISP(イン・システム・プログラミング)とパラレル書き込みが使用でき
ましたが、Xmegaでは、新しいPDI (Programming and Debugging Interface) と、JTAG
インタフェースが使用可能です。
・PDIは、ISPと同じ6ピンのコネクターが使用でき、VCCとGND及び [PDI_DATA] と [PDI_CLK] の
4本のラインを使用します。
・残りの2ピンは、使用しません。
3.テストボードの製作
・現時点では、QFPとBGAパッケージのみの販売なので、0.5mm QFPパッケージを購入し、
2.54mmピッチ変換基板にのせて、ユニバーサル基板上でテスト回路を組みます。
・テストボード上には、下記の回路を搭載します。
○ レジスタなどの情報を表示するための、キャラクタLCD。
○ ポートの信号を、ブレッドボード等に出すためのピンフレーム。 (PORT A,B,C,D,E)
○ 外部メモリーのテスト用に、256KbitのSRAM。 (SRM2B256SLMX55)
○ パソコンとの接続に、FT232RL USBシリアルインタフェース。 (秋月電子AE-UM232R)
注意! この図面を使用した、いかなる損害にも責任を負いません。
4.ソフトウェア開発環境
・Xmegaの命令セットは、暗号化用の[DES] 命令と、拡張されたSPM (#2)命令が追加され、
一部の命令で実行クロック数が変わった程度です。
・しかし、I/Oレジスタは格段に増えたため、I/Oレジスタを操作するプログラムは、互換性が
ありません。
・現時点では、まだBASCOM-AVRがXmegaに対応できていないので、直接レジスタに値を
書き込みながら、動作確認をしていきます。
・[ATXmega128A1] 用のレジファイルは用意されているので、コンパイルは可能です。
・コンパイル後のHEXファイルを、[AVR Studio 4] のプログラマーで書き込みます。
 |
[AVR Studio 4] の[AVRISP mkII] Mainタグで下記の設定を行い、
[Read Signature] ボタンでOK!が出れば接続完了です。
・「Device and Signature Bytes」を、「ATxmega128A1」
・「Programming Mode and Target Settings」を、「PDI mode」
|
|
テストプログラム |
1.キャラクタLCDへの表示
・I/Oレジスタの制御が必要なので、標準の「CONFIG LCDPIN」命令は使用できません。
・そこで、Xmega専用の4bitモードLCDライブラリを作り、これを組み込むことで、BASICの
LCD命令等を使用可能にしました。
・上記ファイルを「C:\Program Files\MCS Electronics\BASCOM-AVR\LIB\」に保存します。
|
2.動作クロックの変更
・従来のAVRでは、事前にヒューズビットでAVRの動作クロックを決定する必要があり、
クロックを変更するには、再度ヒューズを書き換える必要がありました。
・Xmegaでは、リセット後は常に2MHzの内部発振器で動作を開始し、プログラム内で
クロック速度を自由に変更することができます。
(これにより、ヒューズの書き間違いで、AVR自体が動かないと言うトラブルは無くなります)
・クロックは、下記の中から選択できます。
内部発振器 |
2MHz
32MHz |
|
クリスタル用発振器 |
0.4〜16MHz |
XTAL1・XTAL2 端子 |
クリスタル用発振器 |
32kHz |
TOSC1・TOSC2 端子 |
外部クロック信号 |
MAX 16MHz? (不明) |
XTAL1端子に入力 |
P L L |
上記クロック信号を1〜31逓倍 |
PLL出力は10MHz以上必要
(32kHzクリスタル用発振器は除く) |
・この他に、TOSCピンに接続された32kHzクリスタルで、内部発振器の2MHz・32MHzを校正する
DFLL機能や、外部クロック(Xtalを含む)が何らかのトラブルで停止した場合に、自動的に
内部発振器に切り換える監視機能などもあります。
2.1 内部発振器 32MHz 動作
・外部クロック以外に変更する場合は、まず、それぞれの発振器を作動させる必要があります。
(複数の発振器を、同時に作動させることもできます)
・リセット時には、2MHz内部発振器のみが動作しているので、32MHz内部発振器を作動させます。
(この場合、[OSC_CTRL] レジスタの [bit1] を(1)にセットします)
・各発振器は、発振周波数が安定して、システムクロックとして使用する準備が整った時に、
ステータスレジスタ [OSC_STATUS] の対応するビットが、セット(1)されます。
(安定していない状態では、下記命令を実行しても、動作クロックが変更されません)
・このあと、動作クロックを変更するのですが、重要なレジスタを変更する場合には、特別な
おまじないが必要となります。
・特別に保護されたI/Oレジスタを変更する場合には、設定変更保護レジスタ [CPU_CCP] に、
[$D8]と言うコードを書いた後、4CPUクロック以内にI/Oレジスタを変更します。
・動作クロックの変更は、[CLK_CTRL] レジスタに、クロックを選択する値を書き込みます。
・任意で、[OSC_CTRL] レジスタの、2MHz内部発振器を停止させておきます。
・下記プログラムでは、動作クロックを32MHzに変更した後に、PORTCのbit0に248nSのパルスを
出力します。 31nS(CPUクロック) × 4(2クロック命令×2) × 2(トグル出力) = 248nS
|
$regfile = "xm128A1def.dat" |
' 使用するAVRを設定。 |
$crystal = 32000000 |
' AVRクロックを設定。 |
Set OSC_CTRL.1 |
' 32MHz内部発振器を許可する。 |
Bitwait OSC_STATUS.1 , Set |
' 32MHz内部発振器が安定するまで待つ。 |
CPU_CCP = &HD8 |
' 設定変更保護レジスタに[$D8]を書き込む。 |
CLK_CTRL = &B00000001 |
' 動作クロックを32MHz内部発振器に変更する。 |
Reset OSC_CTRL.0 |
' 2MHz内部発振器を停止させる。 |
' |
|
PORTC_DIR = &B11111111 |
' PORTCを出力に設定する。 |
$asm |
' ここからアセンブラ命令であることを宣言する。 |
LDI R16,1 |
' レジスタR16に$01を読み込む。 |
Lp: |
|
STS PORTC_OUTTGL,R16 |
' PORTCのbit0を反転させる。 |
RJMP LP |
' ラベル[Lp]までを繰り返す。 |
$end Asm |
' ここでアセンブラ命令を終了する。 |
End |
' プログラムの終了。 |
|
2.2 クリスタル発振器 16MHz 動作
・ XTAL1、XTAL2端子に、16MHzの水晶発振子を接続します。
(外付けコンデンサは、周波数によりマニュアルを参照して下さい)
・クリスタル発振器の場合は、まず [OSC_XOSCCTRL] レジスタで、発振周波数帯と始動時間を
選択します。 (これは、従来のAVRヒューズと同様の設定です)
・[OSC_CTRL] レジスタの [bit3] を(1)にセットし、外部用発振器を作動させます。
・発振が安定するのをステータスレジスタで確認し、以下、32MHz内部発振器の場合と同様の
処理を行います。
|
$regfile = "xm128A1def.dat" |
' 使用するAVRを設定。 |
$crystal = 16000000 |
' AVRクロックを設定。 |
OSC_XOSCCTRL = &B11001011 |
' 12MHz〜16MHzの水晶、始動時間16KCLK |
Set OSC_CTRL.3 |
' 外部用発振器を許可する。 |
Bitwait OSC_STATUS.3 , Set |
' 外部用発振器が安定するまで待つ。 |
CPU_CCP = &HD8 |
' 設定変更保護レジスタに[$D8]を書き込む。 |
CLK_CTRL = &B00000011 |
' 動作クロックを外部用発振器に変更する。 |
Reset OSC_CTRL.0 |
' 2MHz内部発振器を停止させる。 |
' |
|
End |
' プログラムの終了。 |
|
・上記のパルス発生プログラムを追加すれば、PORTCのbit0に496nSのパルスが出力されます。
62nS(CPUクロック) × 4(2クロック命令×2) × 2(トグル出力) = 496nS
2.3 クリスタル発振器16MHzを、PLLで32MHz 動作
・ XTAL1、XTAL2端子に、16MHzの水晶発振子を接続します。
(外付けコンデンサは、周波数によりマニュアルを参照して下さい)
・水晶発振子に合わせて [OSC_XOSCCTRL] レジスタで、発振周波数帯と始動時間を選択します。
(これは、従来のAVRヒューズと同様の設定です)
・[OSC_CTRL] レジスタの [bit3] を(1)にセットし、外部用発振器を作動させます。
・発振が安定するのを、ステータスレジスタ [OSC_STATUS] で確認します。
・PLLのクロック供給源と、逓倍率 (1〜31) を、[OSC_PLLCTRL] レジスタに設定します。
(この場合は、クロック供給源=外部クロック、逓倍率=2)
・[OSC_CTRL] レジスタの [bit4] を(1)にセットし、PLLを許可します。
・PLLがロックするのを、ステータスレジスタ [OSC_STATUS] で確認します。
・以下、32MHz内部発振器の場合と同様の処理を行います。
|
$regfile = "xm128A1def.dat" |
' 使用するAVRを設定。 |
$crystal = 32000000 |
' AVRクロックを設定。 |
OSC_XOSCCTRL = &B11001011 |
' 12MHz〜16MHzの水晶、始動時間16KCLK |
Set OSC_CTRL.3 |
' 外部用発振器を許可する。 |
Bitwait OSC_STATUS.3 , Set |
' 外部用発振器が安定するまで待つ。 |
OSC_PLLCTRL = &B11000010 |
' PLLクロック供給源=外部クロック、逓倍率=2。 |
Set OSC_CTRL.4 |
' PLLを許可する。 |
Bitwait OSC_STATUS.4 , Set |
' PLLがロックするまで待つ。 |
CPU_CCP = &HD8 |
' 設定変更保護レジスタに[$D8]を書き込む。 |
CLK_CTRL = &B00000100 |
' 動作クロックをPLLに変更する。 |
Reset OSC_CTRL.0 |
' 2MHz内部発振器を停止させる。 |
' |
|
End |
' プログラムの終了。 |
|
・上記のパルス発生プログラムを追加すれば、PORTCのbit0に248nSのパルスが出力されます。
31nS(CPUクロック) × 4(2クロック命令×2) × 2(トグル出力) = 248nS
補足
・PLLのテストで、2MHzクロックの逓倍を上げていくと、何と25逓倍、50MHzまで動作しました。
・オーバースペックを楽しむ趣味はないのですが、興味のある方は耐久テストをして見て下さい。
|
3.I/Oポートの操作
・Xmegaでは、大量のI/Oレジスタが追加され、マニュアルを見ただけでも、うんざりする状態でした。
・しかし、よく内容を確認していくと、従来の命令セットに、安易に命令を追加してプログラムの
互換性を無くすのではなく、命令セットの弱点を、実にうまくI/Oレジスタの工夫で克服している
ことがわかりました。
3.1 IN・OUT・SBIC・SBIS・SBI・CBI 命令の弱点
・IN・OUT 命令は、I/Oアドレスに対して0〜63($00〜$3F)番地、SBIC・SBIS・SBI・CBI 命令は、
I/Oアドレスに対して0〜31($00〜$1F)番地にしかアクセスできません。
・これ以上のアドレスにあるI/Oレジスタには、メモリーに対する命令(LDS・STS等)を使用する
ことになります。
・しかし、ビット操作を行う場合などには、一度汎用レジスタ(R00〜R31)に出力状態を読み込んで、
ANDやORのビット操作を行った後に、再度I/Oレジスタに書き込む作業が必要でした。
3.2 弱点に対処するための、3つの改良点
1. 従来からある、I/Oポートに8bitのデータを書き込むレジスタの他に、任意のI/Oビットを、
セット(1)やクリア(0)、そして反転(Toggle)することができる、ビット操作専用のI/Oレジスタが
増やされました。
2. I/Oアドレスの($00〜$0F)番地に、16個の「汎用I/Oレジスタ(GPIO)」が配置されました。
・メモリーと同じ扱いのI/Oレジスタですが、IN・OUT・SBIC・SBIS・SBI・CBI 命令を、仮想的な
I/Oに見立てて使用できます。
3. 仮想ポート(Virtual Port)が、4つ新設されました。
・仮想ポートとは、I/Oアドレスの($10〜$1F)番地に、従来のAVRと同じ、方向(DIR)と入力(IN)
出力(OUT)のみを備えた仮のポートを4セット配置し、それぞれを、PORTA〜PORTRに割り付け
できます。
・これにより、IN・OUT・SBIC・SBIS・SBI・CBI 命令が、上位のアドレスに配置されたI/Oポートに
対しても使えるようになっています。
・これをうまく使うことで、I/O命令に対しても、プログラムの互換性を実現できる可能性があります。
実によく考えられた設計だと、改めて感心しました!
(実際のプログラムでは確認しておりませんので、マニュアルの読み違いにはご容赦下さい)
|
|