■ AVR ATXmegaのテスト・リポート ■


 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)


回 路 図  GIF版 XmegaTBcir.gif (98KB)
部品配置図  GIF版 XmegaTBpcb.gif (177KB)
                   注意! この図面を使用した、いかなる損害にも責任を負いません。

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命令等を使用可能にしました。
 
 Xmega専用 4bitモードLCDライブラリ  lcd4_XMega.LBX
 ・上記ファイルを「C:\Program Files\MCS Electronics\BASCOM-AVR\LIB\」に保存します。
 
プログラム  テキスト形式 ソースファイル  Xm_Test01.TXT (3KB)
 BASCOM-AVR用 ソースファイル  Xm_Test01.bas (3KB)


 
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命令に対しても、プログラムの互換性を実現できる可能性があります。

 実によく考えられた設計だと、改めて感心しました!
 (実際のプログラムでは確認しておりませんので、マニュアルの読み違いにはご容赦下さい)





   電子工作の部屋 Top へ 前のページへ戻る