BASCOMによるXMegaの制御

注:本ページの内容の利用等については、末尾にリンクのあるTop Pageにある免責事項を参照されたい。

2012年3月:写真を追加。

 ATMELのAVR, ATXMegaをBASCOMで制御してみたので、その例を示す。XMegaハードに対応した命令についてはBASCOMの最新版(v.2.0.7.3)でもまだ完全にはサポートされているとは言い難いが、いろいろ試した結果を以下に記す。なお、XMegaでない従来のAVRと共通になっているBASCOM命令(XMega用の別の文法がない命令)は、そのまま使用できる。

(1)試作したボード

XMegaBoard ボードの写真。真ん中がサンハヤトの変換基板上のXMega128A。中央下は拡張SRAM。下部左はXBeeコネクタ。その右にあるのはGPIOの引き出しコネクタ。その上にある3極XAコネクタはロータリーエンコーダ用。次に、基板右側にある1列のコネクタはOLED文字表示液晶用コネクタでこの基板のままでいろいろなステータス表示を行えるように付けてある。一番右のフラットケーブルコネクタはカラーグラフィック液晶の制御回路へのインターフェース。

 入手性が容易で、かつ、ポート数の多いATXMega128Aを使用した(共立デジットに有り)。それをサンハヤトのピッチ変換基板 ICB-020によって2.54mmに変換し、ユニバーサルボードに乗せている。

Xmega_TransB

 写真の変換基板の右サイドに赤く見えるのはセラミックコンデンサで、写真でははっきりと写っていないが、表面実装型の小型32.768kHz水晶と変換基板上でつながれている。XMegaでは32MHzのCPUクロックとは別系統でリアルタイムクロックを発振できる。

 回路ではSRAM (32-kB:28-pin DIP)を外部RAMとして使用した。SRAMはRS-Componentsにたまたま有ったAS6C62256(55ns)を使用したが(この場合、no-waitでアクセス可能)、XMegaのプログラムでWait time指定を入れれば、普通に入手可能な100nsアクセスタイムの物でも使用可能である。作成した回路の資料(Eagleフォルダー)を圧縮ファイルで添付する。ボード上にはその他にOLED(有機EL)文字表示器インターフェースも乗っている。XMegaの電源電圧は3.3Vなので、3.3Vで使用可能なOLED(デジットにあり)を使用した。その詳細はグラフィック液晶の制御法と回路の2章を参照されたい。試作したボードでは、その他、ロータリーエンコーダー(共立シリコンハウスのカウンターにあるチャッタリングの少ない物(一番大きなやつ(2cm角ぐらい))を買えばよい。小さいやつはチャッタリングが多く、結構苦労する。)、プッシュスイッチ(タクトスイッチ)x3、XBee+2.54mmピッチ変換基板(千石)、後述するカラーグラフィック液晶インターフェース(34-pinコネクター)、PortCを取り出すGPIOインターフェースコネクター(16ピン)などが搭載されている。PortAに関してはADC入力およびDAC出力の将来拡張のために全て無接続で空けてある。

1−2 プログラムの書き込み(XMegaはSPIでない新しい書込ライン)

 プログラムの書き込みはAVR Studio ver.4の近年のバージョンやそれ以降(ver.5)を使い、そこからAVR ISP-MKIIで書込可能。プログラミング書込はSPIではなく、新しい2本の信号のインターフェースになっているが、上記に示したボードの回路図のように結線すればAVRISP-MKIIで書き込める。なお、SPI書込でないXMegaであることをAVR-Studioで指定するために、まず、ISP-MKIIをUSB接続した後、AVR StudioのConボタンでISPMK-IIをコネクトした後、そこで開くウインドウ上部のMainタブを選択し、CPUタイプ・プルダウンメニューでATxmega128A1を選択した後、Read signatureボタンを押してMega128A1との接続を確認する。(ボードの結線が間違っていたりすると、OKメッセージが返ってこないので、配線や電源が入っているか等を確認。また、ISP-MKIIのクロックがあまりに速い設定だとミスる。その場合は、クロック周波数を下げる設定をすること。)OKメッセージが返ってきたなら、Mega128A1とは接続が可能であることが示されたので、Fusesやprogramタブを選択して従来と同様に書込処理等ができる。プログラム書込なら、BASCOMでコンパイル出力されたHEXファイルを選択し、書き込めばよい。

(2)試してみたXMegaの新機能

 XMegaは他のCPUには無い機能も持っている特異なCPUである。それら特徴的な機能について試行してみた。そのような機能の例としては、例えば、Event Systemという機能では、CPUのソフト処理やインタラプトを経由せずに、ポートの変化やタイマーの満了等のイベントをダイレクトにポート等に出力する。また、DMAハードを内蔵しており、高速にADCデーターをRAMに取り込んだり、RAM領域間のコピー転送や、SPIインターフェースの高速入出力などに使用できる。なお、これら機能のためソフト的には複雑にならざるを得ず、BASCOMでもそれら機能の全てはダイレクトにはBASCOM命令文には取り込めきれていない。そのため、現在最新バージョンのBASCOMでも制御ポートを直接指定して制御ビットを操作する必要があり、プログラムの簡易性からは離れていっている点が悩ましい。筆者は、それらの制御のために、BASCOM最新版(ver.2.0.7.3)のマニュアル以外に、XMega-AのPDF資料、BASCOMのサンプルファイルフォルダー、および、様々な予測したレジスター名によるBASCOMでのコンパイル試行などを行って、ようやっと制御プログラムの完動を行うことが出来た。将来的にはBASCOMもバージョンアップすれば、もう少しやりやすくなると思うが、現在では情報が非常に不足しているので(BASCOM、ATMELとも)、けっこう時間を要する。それらの参考資料として、試行してみたプログラム群を圧縮フォルダーで添付する。なお、その中にあるQuartus_designフォルダー内のDigit_GLCD_cy2_8-bit2プロジェクトフォルダは、後述するカラーグラフィック液晶の制御をするFPGAの設計データーであり、BASCOMとは直接関係はない。

 その他のXMegaの特徴としては、USARTインターフェース(TXD, RXD)、SPI インターフェース、およびタイマーに対して割り当て可能なピンを数多く持っており、ポート使用の自由度が高い(複数の8-bitパラレルポートとして幾つかのポートのピンを全部割り当てなければならない場合でも、TXD/RXDやSCK/MOSI/MISOのピン割り当てを心配する必要がない)。また、インタラプトもほとんど全てのピンで入力可能であり、固定型のインタラプトピン割り当てではないので、これもボード設計上の自由度を増す。
 以上より、ある意味で「全部入り」の機能を贅沢に搭載する場合にもXMegaは便利である。また、ADC分解能もMega AVR(10-bit)より多い12-bit分解能を備えておりこれまでのAVRよりも10倍以上変換速度が速い。さらに、12-bit DACも、4チャンネル装備している。ADCはゲイン設定も可能である。そのため、データー取得等に威力を発揮すると思われる。なお、これらとSRAM間でDMA転送もあり得るが、DMAは間欠的に行われることがあるので注意する必要がある。

 特徴的な機能について、いろいろやってみた感じでは、けっこうくせのある特異なCPUである。新機能がうまくフィットする用途ならばよいが、そうでない場合は、普通のATMegaの方が扱いやすいし、かえってXMegaを使った事による苦労が増える場合もあるかもしれない。
 なお、無理に新機能は使わずにメリットとしての、ポート数の多さ、UARTやSPIのredirectionによる多い設計自由度、ADCの分解能が12-bitであり、これまでより高速(XMega128Aでmax 2Msps)、1MspsのDAC (12-bit) も搭載、3.3V以下の電源電圧でもクロックは32MHzまで可能(当然、SPIも高速(PLLでクロック逓倍も可能))、16MBまでの外部SRAM拡張可能、等の特徴を持つ普通のAVR CPUと捉えて最適な用途に適合させるとメリットは非常に多い。(その他に、暗号化を行うCryptEngine等もある。また、内部の32.768kHzオシレータや外部クリスタルによる高精度1秒時間計数によるリアルタイムクロック機能もある。ただし、そのオシレータ専用のバッテリーバックアップ端子は現在入手可能なXMegaではサポートされていないようである。)

 以下、XMegaに特徴的な機能をBASCOMで制御した例を示す。そのプログラム名は、その前半の「XMega128A1_」を省略して記す。

2−1 XRAMの実装

 XMega-AにはMega128等に見られるような外部RAMインターフェースが備わっており、さらに4-bit幅のSDRAM接続も可能となっている(EBI: External Bus Interfaceと呼ばれるインターフェース自身はMega128とは大きく異なり、その拡張型となっている)。
 32-kB SRAMを外部増設した場合のプログラム例を示す(XRAM.bas)(上記の添付回路図も参照)。ここで注意点としては、BASCOM ver.2.0.7.3ではバグがあり、マニュアルどおりにやってもSRAMを正常にアクセスできない点である。(非常にまずいバグで、そのマニュアルから予測される設定でプログラムを行うと、CPUがデッドロックする。BASCOMではメモリーが定義されるとそれをゼロに初期クリアするようで、もし、メモリーがアクセスできないとそこでデッドロックに陥ると思われる。)したがって、XMegaの制御レジスターにBASCOMから直接、制御ビットを設定するはめになった。
 SRAMの容量としては16MBまで接続可能であり、大容量のデーターバッファーが必要な場合は便利である。(DMA可能)
 なお、DRAM(SDRAM)に関してはXMega128Aではデーター幅を4-bit幅までしかサポートしていないので、試行していない。(普通の用途では8-bitは必要であり、4-bitでは使い物にならないため。)

2−2 Event Systemの使用

 前記したEvent Systemの例をEventSystem.basに示す。添付したプログラムの設定ではPortC.7に出力が出る。なお、BASCOMサンプルプログラムのコメントやXMegaの資料を読むと分かるように、非常に短いパルス(one CPU clock幅)が1パルスのみ出るので、オシロでの観察には注意が必要である。
 Event Systemの一つの特徴として、通常ではRotary-Encoderのようなソフト処理やインタラプト処理を必要とする処理があるが、そのような処理(Rotary-Encoderの2つのピンのパルス位相の変化=Quadrant)についてもEvent Systemが使用可能である点が興味深い。

2−3 DMAの例

 DMA制御の例をDMA.basに示す。詳細はプログラムのコメントを参照されたい。機能としてはXRAMの内容をDMAでPortCに出力している。出力を観測してみると、バースト間にお休みがあることが分かる。(バースト長の最大は8までであり、その後、CPUとバスの取り合い(BUS arbitration)をするため。)従って、用途によってはタイミング的に厳しい場合が生じる。(長いデーター転送に対する同一時間間隔の連続的転送は無理。FFT等を行う際の同一時間間隔サンプリングは保証されない。)また、DMAが行われている際のタイミングシグナルが出力されない点も、結構、使いにくいかも(DMAに同期したクロック信号やチップセレクト信号の出力はない)。なお、同期クロック信号が強制的に存在するようなSPIインターフェース等とのDMAなどでは同期が取れると思う(連続的に同一間隔ではない可能性有り)。

2−4 PLL制御の例

 XMegaでは2MHzの内部クロックや外部につないだオシレーターやクリスタルからのクロックをPLLで逓倍したり、後段の分周器で分周して、システムに合わせた様々なクロック周波数を使用できるようになっている。添付した例(PLLtest.bas)では2MHz内部発振器からPLLで14倍した28MHzを発生した例を示す。XMegaでは、クロックのポート出力はヒューズビット選択ではなく、ソフト命令で行うので、そのようにプログラムでは設定してある。28MHzクロック出力を観測すると、若干、ジッターが見られる(FPGAのような良質のPLLではない?)。

 その他、32.768kHzオシレーターをバッテリバックアップで使用する場合、VBAT入力端子のあるXMegaを使用せねばならない。XMega128Aにはこの端子は付いていないので、リアルタイムクロックのバックアップはできない。(バックアップがあれば日付やカレンダー等の更新が非通電時にできる。)なお、普通のMega CPUに外付けのATtiny45によってバッテリー・バックアップ型リアルタイムクロック(日時の更新も可能)を付加した例は、グラフィック液晶の制御法と回路の4章に幾つか回路図例を付けておいた。これを外付けすればカレンダークロックも実現可能。

2−5 UARTポートのredirectionの例

 XMegaではUARTの入出力であるTXD/TRD ピンに対するポートを多数持っており、プログラムでどれを選ぶかを指定できる。(SPIも同様である。)これは、複数の8-bitパラレルポートとして幾つかのポートのピンを全部割り当てなければならない場合でも、TXD/RXDやSCK/MOSI/MISOのピン割り当てを心配する必要がないという設計の自由度を与える。添付した例(UART.bas)にその例を示す。ここで、本ボードではUARTはXBeeに接続されており、無線通信で文字データーのやりとりが出来るようになっている。
 同プログラムで、ロータリーエンコーダーの制御例も付けておいた。なお、EventSystem方式ではなく、通常のAVRのBASCOM制御と同じ方式で実現した(これでも筆者が使う実用上、十分なため)。

2−6 その他、気づいたこと

 なぜか、32MHz CPUクロックがPLLロックして、LEDピコピコが始まるまでの待ち時間がプログラムによってまちまちである(同じプログラムでは同じ待ち時間)。最大、4秒ほど待たないと始まらない場合があった。原因は不明。(BASCOMのプログラムはXMegaのありふれた初期設定で、全てのプログラムとも共通なので、何が悪いのかわからない。)(別段、少し待っててもいいので、あまりまじめに調べてない。最大4秒待てば動くので、まっ、いいか!?)

(3)カラーグラフィック液晶を制御した例

XMega_CGLCD

 写真右側がXMega基板。左側液晶の下にFPGAボードをマウントしたユニバーサル基板が見える。

 グラフィック液晶の制御法と回路の4章では液晶制御回路(FPGA or CPLD)へのコマンドやデーター転送はSPIインターフェースによるシリアル転送で制御を行ったが、XMega128Aはポート数が多いため、パラレル転送に対応可能であり、転送速度も速くできる。その制御プログラム例として、CGLCD_Dg_ACM301.basを添付した(上記(2)で添付した圧縮ファイル内にある)。
 ここでは、「グラフィック液晶の制御法と回路」の4-3-2章で示した例を、カラーデーター深さを16-bitから8-bitに減らし、より作成しやすくして、インターフェースをパラレル化によって高速化した例を示す。FPGAの設計データーは上記(2)で添付したXMegaプログラム群フォルダー内部のQuartus_designフォルダーにある。このインターフェース高速化により、「グラフィック液晶の制御法と回路」の4-3-2章と比べて、データーやコマンドの転送速度は10倍以上に上がっていると思われる。
 液晶制御部で使用したFPGAボードはHumanData社のACM301ボード(EP2C8使用。注:EP2C5のボードも同じ型番であるので注意。ACM-301-8がEP2C8のボード。)であり、そのボード(2.54mmピッチ)を使用し、加えて、高速SRAM=CY7C1049DV33-10VXIもサンハヤトの変換基板SSP-83を使用することにより、2.54mmピッチのユニバーサル基板上に組み立てることが出来た。(HumanDataのボードはインターネット直販か、共立でも取り寄せ可能。)その回路図を添付する(Eagleプロジェクトファイル)。

CGLCD_ACM301

 写真は液晶の下側にあるACM301, FPGAボードを利用した液晶制御回路。高速SRAM=CY7C1049DV33-10VXIの変換基板はACM301基板の下でユニバーサルボード上に実装されている。写真では隠れて見えない。

 本章で添付した例はグラフィック液晶の制御法と回路の4章にいろいろ述べてあるFPGA設計の改良型であり、円の描画=circle drawも、中心座標と半径の指定のみで完全にハード的に行うようにした(4-3-2章では一部、BASCOMがCos(delta_theta)などを計算して転送する必要があった)。これに対し本章で添付した例では、描画すべき円の各半径(1〜1023ドット)に対する演算に必要なSin、Cos(delta theta)値=合計1024セットをFPGA内部にROM化して、BASCOMの浮動小数演算の関与を無しにし、AVR以外のマイコンや、浮動小数型がサポートされていないマイコン用プログラム言語でも制御可能とした。併せて、ROM(Verilogで記述)を作成するためのCプログラムをQuartus_designフォルダー内に添付した。これらファイルはページの(2)にある圧縮ファイル内に有る。このプログラムの実行により、sin、cos ROM用のVerilogファイルが生成される。このプログラムは参考までに添付されているだけであり、既にQuartus_designフォルダー内のDigit_GLCD_cy2_8-bit2フォルダ内にあるQuartus projectファイル群にはそれらROMのVerilogファイルがあり、プロジェクトにリンクされている。
 その他、XMegaとFPGAとのやりとりの詳細についてはCGLCD_Dg_ACM301.basも参照されたい。

 以上の工夫により、ほぼ視認においてリアルタイム性が得られることが確かめられた。

 以上のようにパラレルインターフェースを行う場合にもXMegaはポート数が多いために便利である。

 

Top Pageへ