2012.01.31

RX62Nでファンクションジェネレータを作る

RX62Nで2chのファンクションジェネレータを作ることができました。
のこぎり波やサインカーブだけではなく、任意の波形を発生させることができます。

Rx62n_fg

どういう原理かというと、次の図をご覧下さい。
Rx62n_dds_2

タイマを使ってDMAコントローラを駆動し、内蔵RAMに書かれた波形データをDAコンバータに転送するというわけです。

この構成では、コンペア・マッチ・タイマCMT2を使って1MHzの割り込み信号を作ります。1MHzの割り込みというと尋常じゃない感じがしますが、CPUが受け取るのではなくDMAコントローラのトリガとして動くように設定するのです。この辺がRX62Nのアーキテクチャのすごいところです。

DMAC0をリピートモードに設定して、メインメモリから波形データの1ワードを読み出してきて、それをDAコンバータの出力値設定レジスタに書き込むようにします。このときに使われるデータバスは「内部メインバス2」というのが使われる(はず)なので、CPUの動作を介さずにハードウェアだけで上記の処理を1MHzのタイミングで行うことができるわけです。

CPUがどんな処理を実行していようとも、それの影響を受けずにハードウェアが粛々と波形を出力してくれることでしょう。

さて、DMAコントローラはノーマルモード、リピートモード、ブロックモードと3つのモードがありますが、ここではリピートモードを使います。リピートモードというのは、メモリの決まった範囲を順繰り順繰り読んで、内蔵ペリフェラルの決まったレジスタに書き込むといったような場合に使えます。

さて、技術的な課題がいくつかあります。
・出力チャネル数を2chにしたいかどうか
・DDSみたいにしたいか、FGでよいか
・出力周波数をきっちりとした値にしたいかどうか

【波形出力を2chにする方法】
まず、出力チャネル数を2チャネルにしたいかどうかです。2チャネルにするには、DA.DADR0とDA.DADR1という2つのレジスタに書き込まなければなりません。しかし、これらのレジスタに同時に値を書き込むには、DMACが1つでは足りません。2つのDMACを動かせばよいのですが、後述のDDSモードではDMACを「拡張リピートモード」と「オフセット加算」で使うので、2つ同時には使えません。

そこで、禁じ手を使いました。DA.DADR0とDA.DADR1は本来は16bitサイズのレジスタだが、アドレスが隣り合っているので、32bitサイズでアクセスすれば一括でアクセスできないだろうか?ということです。ルネサスのCPUの内蔵ペリフェラルはレジスタにアクセスするときのサイズが厳しく決められていて、本来はこういうことはできないはずなのですが、それを承知でやってみたところ、なんとなくうまくいきました。「なんとなく」というのはDA1とDA0の値がなぜか逆になっているためです。エンディアンの関係かもしれません。動いているように見えるけどやっぱり何かあるのでしょう。
Rx62n_da


【DDSみたいなものの実現方法】
次にDDSみたいなものにしたいかどうかです。DDSにするには、メモリから読み出していく値を、例えば5とか、決まった値だけ加算していく必要があります。それを実現するには、DMACのオフセット加算モードというのを使います。
しかし、オフセット加算モードだけでは、用意した波形バッファの範囲をオーバーしてしまう可能性があります。波形データを1024ポイント分作っておいて、次のデータが1022+5の場所だというときには、&1023してやって4番目のデータを見てやらねばなりませんが、ソフトウェアでやるわけにはいきません。
そこで、DMACの拡張リピートモードというのを使います。拡張リピートモードでは、アドレスの下何ビットかだけを有効にして、上のビットをマスクして順繰り順繰りしてくれるモードです。今回のようなDDSの機能を実現するにはうってつけです。
Rx62n_offadd

【周波数を正確な値にする方法】
最後に出力周波数を正確に1.000kHzのようなきっちりした値にしたいかどうかです。1.000kHzにするには、リピートモードの周期(データ数)を1000とか500とかにしてやらねばなりません。しかし、そうすると拡張リピートモードが使えなくなります。976Hz、1.953kHz、2.928kHzと、ちょっとずつ遅い周波数になってしまいますが、仕方がありません。
他のアプローチとしては、メインクロックの水晶の周波数を12MHzではなく、12.288Hzにしてやるという方法も考えられます。クロックの水晶を12.288MHzにしても、CPUの動作クロックは98MHzなので動作範囲内です。

それから、SDRAM上に大容量の4Mバイトくらいの大きな波形データを用意してやるという方法も考えられます。1周期が1MHz/1048576になるので、999.59Hzのようにより近い値が出せます。

DMACは高機能なので、まだ理解していない使い方があるかもしれません。DDSモードとFGモードの切り替えは簡単なので、両方に対応させておいてもいいかもしれません。今後にご期待ください。


今回のファンクションジェネレータの動作を動画にしたので、ぜひご覧下さい。
チップ単体でここまでできます。

音声帯域なら十分に実用的になるのではないかと思います。

このプログラムは下記のリンクから無償でダウンロードできるようにしたので、ぜひ、お試しください。
「fg.mot」をダウンロード

究極のRX62Nボード、RX-MEGA、RaXino♪など、RX62Nボードであれば何でも動作すると思います。
また、USB(RX62Nの仮想COMポート)を通じて周波数を操作することができます。'0'~'9'までの数字を打つと、約1~10kHzで周波数が変わります。's'を打つと、周波数のスウィープが楽しめます。

追記。
ひとつ間違えていたことがありました。拡張リピートエリアを設定するときには、ノーマルモードにしたほうがよい??のかもしれません。

ノーマルモード+拡張リピートエリア設定にしたら、SDRAM上の巨大な波形バッファから上手く転送することができて、周波数を滑らかに変化させることができるようになりました。

カクカクではなく、うにょうにょと変わります。

つまり、メモリをたくさん積んだ究極のRX62Nボードなら約0.数Hz単位で周波数を変えられる。チップ単体で外付けメモリを持たないRaXino♪でも約1kHz刻みのステップで周波数を変えられるというわけです。

| | コメント (0)

2012.01.27

RX-MEGAでMARY-GB(GPSモジュール)を使う

RX-MEGAでMARY-GB(GPSモジュール)を動かしてみました。

MARY-GBは、9600bpsのシリアル通信でGPSのデータを出力してきます。
RX-MEGAにはMARYの拡張基板をのせるコネクタが2つ用意されています。右側のコネクタにMARY-GBを乗せた場合はRXのSCI6Aに、左側に乗せた場合はRXのSCI2Bに接続されます。

どちらがいいかというと、断然、右側のSCI6Aです。
なぜならば、RXマイコンのSCI2Bは、ポートP50と共有されています。RX62NのP50、P51、P52あたりは鬼門中の鬼門で、外部バス(SDRAMなど)を有効にすると、有無を言わさずに外部バス用のポートになってしまうのです。

つまり、SCI2BとSDRAMは同時には使えません。

そういうわけで、MARYコネクタの右側にMARY-GBモジュールを乗せます。
Mega_marygb

プログラムは簡単なものを作ります。MARY-GBから受信したGPSの文字列を、USB仮想COMポート経由でホストPCに投げるだけの簡単なものです。
このプログラムをROMに書き込んで、装置全体を空が見える窓際に置いて、GPSの受信をしてみます。
Marygb

GPSモジュール自体は動いていて1秒ごとにデータを送ってくるのですが、困ったことに肝心の電波が受信できていないようです。

Gps_recv

同じオフィスの中で携帯電話のGPSは動いているので、MARY-GBが壊れてしまったのかもしれません。もしくは、MARY-GBに向かって何かコマンドを送らないと動作を開始してくれないのかもしれません。

作ったプログラムは次のようなものです。


int main() {
sci_init(SCI_SCI6A,9600); // SCI6-Aを使う
TKUSB_Init(); // USBを使う
 
while(1) {
while(sci_rxcount()) {
char c = sci_getc(); // GPSから1文字受信
TKUSB_SendByte(c); // それをUSBに投げる
}
}
}

機会があれば追実験をしてみたいと思います。

| | コメント (2)

RXduino環境でのUSBの使い方

前回のブログでは特電HALライブラリを使ってUSBの通信を行いましたが、RXduinoライブラリでUSBを使うのはもっと簡単です。

RXduinoは起動する際に、グローバルなクラスのインスタンスSerialという物を作ります。
このSerialインスタンスは、中で

sci_init(SCI_AUTO,38400)を実行しているので、最初に接続されたSCIやUSBの仮想シリアルを通じて通信するようになります。※この動作を変更するにはRXduinoライブラリのソースSerial.cppを修正する。

RXduino環境でUSBを使うには、次のようなプログラムを組みます。


#include
 
void setup() {
Serial.begin(38400);
Serial.println("Serial sample program (RXduino version)");
Serial.println("CRとLFのコード変換も行っています");
pinMode(PIN_LED3,OUTPUT);
int count = 0;
}
 
void loop() {
while(1) {
if(Serial.available()) { // 何か受信した文字がある
char tmp[10];
char c = Serial.read(); // 1文字受信
tmp[0] = c;
tmp[1] = '\0';
Serial.print(tmp); // エコーバック
if(c == 0x0d) {
Serial.print("[\\r]");
}
else if(c == 0x0a) {
Serial.print("[\\n]");
}
else {
Serial.print("[");
Serial.print(c); // 文字コードを10進で表示
Serial.print("]");
}
digitalWrite(PIN_LED3 , count++ & 1);
}
}
}

このサンプルプログラムは、ホストPCから送られた文字をエコーバックするとともに、文字コードを数字にして表示します。
Rxduino_usb


| | コメント (0)

RXマイコンでのUSB(ライブラリ)の使い方

RaXino♪や、究極のRX62NボードRX-MEGAで使われる特電ライブラリでのUSBの使い方をまとめておきます。あと、特電のボードだけではなく、Interface誌の付録基板でも使えます。

Raxino_usb

特電のライブラリには「RXduino」というC++でArduino互換のものと、「特電HAL」というC言語のライブラリがあります。これらのライブラリでUSBを使う方法を説明します。(特電HALとRXduinoのコアは一緒で、RXduinoは特電HALを呼び出しているにすぎません。)

これらのライブラリにはUSBファンクションで実現したCDC(いわゆるUSB-UARTのこと)が組み込まれているので、RXマイコンとホストPCをつないで、TeraTermなどを通じて簡単に通信できるようになります。

まず、特電HALのほうから説明します。
このライブラリはUSBは仮想UARTを実現しているので、COMポートをオープンする要領でUSBが使えるようになります。

USBを使えるようにするには、プログラム中で、


sci_init(SCI_USB0,38400);

というコードを実行します。
※38400は速度ですが、USBの場合は何を設定しても構いません。実際には毎秒数百キロバイトでます。

ここで


sci_init(SCI_SCI0P2x,38400);

にすると、RXマイコンのSCI0のTxD,RxDを使って、レガシーなUARTを通じて通信が行われます。SCI0P2xというのは、RXマイコンのSCI0はP20,P21番端子と共有されているのでこのような命名をしました。

つまり、RXマイコンからみて、USB仮想COMポートでも、SCIを使ったレガシーなUARTでも、プログラム上は同じコードが使われます。


sci_init(SCI_AUTO,38400);

とすると、システムの起動時にUSBとSCI0とSCI1のうち、一番先に何らかのデータを送ってきたCOMポートが開かれるようになります。

ポートがオープンされると、TeraTermなどから開けるようになります。
Rx_usb

これでUSBを使う準備ができました。

ところで、組み込みマイコンの中で動くC言語での改行コードと、Windows上でTeraTermなどを使って通信する際の改行コードは異なります。これが異なると改行が反映されなかったり、2回改行されたりします。
そこで、


sci_convert_crlf(CRLF_CRLF,CRLF_CRLF); // \nを\r\nに変換

とやって、ライブラリの中で改行コードを自動的に変換できるようにします。

あとは、RXのプログラムの中からホストPCに文字列を送信したいならば、


sci_puts("hogehoge");

とやります。
ホストPCからRXマイコンに文字を送ったら、マイコンの内蔵RAMの中のバッファに格納されます。そのたまったデータ量(バイト数)を調べるには、

sci_rxcount()

関数を呼び出します。この関数が0でない値を返したならば、何か受信データがあります。
その場合は、

 char c = sci_getc(); // 1文字受信

とやって、1文字受信します。

USBまたはSCIのポートを開いて、エコーバックするプログラムの例を次に示します。


sci_init(SCI_AUTO,38400); // 自動的にCOMポートを判別してオープンする
sci_convert_crlf(CRLF_CRLF,CRLF_CRLF); // \nを\r\nに変換
sci_puts("Hello I'm RX62N\n");
while(1) {
if(sci_rxcount()) { // 何か受信した文字があるか調べる
char c = sci_getc(); // 1文字受信
sci_putc(c); // エコーバック
}
}

こんな簡単なコードで、RXマイコンとホストPCとの間で通信ができるようになります。

手軽に試してみたい場合は、Webコンパイラを使ってみてください。

http://www.tokudenkairo.co.jp/rxmega/webcomp/

上のURLからWebコンパイラを開いて、「シリアル通信(HAL版)」のサンプルコードをクリックし、「コンパイル実行」ボタンを押してみてください。ターゲットボードを「RX-MEGA」にしておけば、Interface誌付録の基板単体でも動きますので、すぐに試せます。

Frk_rx_usb

MOTファイルが生成されてサーバから送られてくるので、これをRXマイコンに書き込めば、すぐにUSB通信のプログラムが試せます。
Frk_rx_usb_teraterm

Webコンパイラは、シリアル番号の入力などは必要ないので、気軽に試してみてください。

http://www.tokudenkairo.co.jp/rxmega/webcomp/

| | コメント (3)

2012.01.26

ルネサスE1エミュレータを使ってみた

ルネサスE1エミュレータというのを入手したので、使ってみました。
Renesas_e1

ターゲットボードは、特電究極のRX62NボードではCN5に、RaXino♪ではCN6につなぎます。
特に基板の改造とかは必要なく、そのままつながりました。

E1_ult62nE1_raxino_2

E1は200mAまでなら電源供給ができるようなのですが、安全のためUSBから給電しました。

E1を使うには、HEW(High-performance Embedded Workshop)を使います。

ただし、E1の中に入っているデバイスドライバソフトと古いHEWは相性が悪くて認識してくれないようなので、ルネサスエレクトロニクスのWebサイトから、最新版の「e1e20rxfullv102r00.exe」というのをダウンロードしてインストールしたほうがいいと思います。アップデートが行われ、HEWのバージョンはVersion 4.09.00.007になりました。

E1を使うには、HEWで新規プロジェクトを作成する際に、E1エミュレータを使う設定をします。
まず、HEWで普通に新規プロジェクトワークスペースを作成します。
E1_1

普通にプロジェクトを設定していって、8/10-デバッガの設定の部分で「RX E1/E20 SYSTEM」をチェックします。
E1_2
※HEWやドライバのバージョンが古いとこの表示が出ません

9/10-デバッガオプションの画面は次のようになるはずです。
E1_3

プロジェクトが作成され、HEWの見慣れた画面になりました。
E1_4

HEWの画面の右上にあるDefaultSessionというところをSessionRX_E1_E20_SYSTEMに変更すると、E1エミュレータと接続されます。
E1_5

そして「デバイス」と書かれたダイアログが開くので、CPUのグループと型番を設定します。
E1_6

E1_7

次の画面が開いたら、EXTALのところに12と入力します。
E1_8_2

ホットプラグインをチェックした場合は、JTAGケーブルを抜いた状態で上の手順を行ってください。そして、次の画面が出たところでケーブルを挿してください。(先にケーブルを挿しているとうまくいきません)
E1_9

IDコードが要求されたら、(プログラム中で特に設定していなければ)、FFFF…と32回入力します。
E1_10

あとは、HEWのこの辺のツールボタンを押せば、プログラムを止めたりメモリの内容を見たり、逆アセンブラしてステップ実行などができます。
E1_11

現状のRaXinoのプログラムはGCCで作っているので、HEWではC/C++のソースコードレベルでのデバッグができません。この問題を解決するには次のようにします。

上の手順は、HEWでプロジェクトを作成する際にE1を使うという設定を一緒に行うものでした。HEWでプロジェクトを作成する際に、Debugger Onlyというタイプのプロジェクトを作成することもできます。

E1_12

普通に「次へ」「次へ」と押して行ってプロジェクトを作り、HEWのいつもの画面になったら、プロジェクトツリーのDownload Moduleで右クリックして、「ダウンロードモジュールの追加」を行います。

このようにすると、ELFファイルを読み込むことができますので、GCCで作成したELFファイルも読み込めます。
E1_14

GNUのライブラリの中にあるファイルが見つからないといってきますが、ここは重要ではないので、そのままOKを押します。
E1_15

プロジェクトツリーの中から目的のソースファイルをクリックすれば、それが開きます。
ブレークポイントも仕掛けられますし、ソースコードレベルでのデバッグもできます。
E1_16

変数のウォッチもできます。完全なフル機能のJTAGデバッガとして動作します。
E1_17

ざっと試してみたところ、RaXino♪も究極のRX62Nも、E1エミュレータを接続することができました。

そういうわけで、E1エミュレータは便利なので、特殊電子回路でも小規模ながら販売することにしました。正規ルートで若干量仕入れています。価格は12,500円(税込・送料込)なので、業界最安値であることは間違いなしです。当社の利益は全くありません。

特電究極のRX62NボードやRaXinoとセットでお買い上げいただくと、さらに割引をいたします。
RaXino♪とセットでお買い上げいただくと、E1エミュレータを11,000円(税込)に値引きします。
究極のRX62Nボードとセットでお買い上げいただくと、E1エミュレータを11,500円(税込)に値引きします。

当社のRXマイコン基板と、便利なE1エミュレータをぜひともお使いください。

| | コメント (0)

2012.01.24

特電の商品発送方法に「なひたふ直送便」を追加!【1月限定】

特電オンラインショップの配送方法に「なひたふ直送便」が追加されました。
これは、私(なひたふ)が、自転車で貴方の会社まで直接配達するプランです。

当社の神田オフィスから概ね2kmの範囲(と墨田区の一部)のお客様は、この配達方法をお選びいただくことができます。

もちろん、当日配達も可能です。

 「今日、すぐにFPGAボードやCPUボードがほしい」
 「銀行振込の手間と費用が惜しい」
 「直接持ってきてほしい」
 「操作方法を教えてほしい」
 「なひたふに直接聞きたいことがある」
 「小一時間問い詰めたい」
 「お茶でもどうぞ」

などなど、どんな理由でも構いません。
サービス料金は無料です。

ぜひ、貴方のオフィスに「なひたふ」をお呼びください!!
「顔が見えるサービス」とはこういうことだと思います。

※ご希望時間や配達先にによっては、承ることができないこともありますので、あらかじめご了承ください。
(深夜配達希望とか、ライバル会社や怖い事務所に持っていくとかはダメです)

代金の支払い方法は、銀行振り込みの他、配達員(なひたふ)に直接手渡していただいても構いません。その際には領収書の発行もいたします。いろいろなオプションやご要望があると思いますが、ご希望がございましたら備考欄にお書きください。ご希望は可能な限り承ります。

ただ、注文が殺到するといけないので、1回のご注文で15,000円以上の商品をご注文の方に限定させていただきます。何卒ご了承ください。

とりあえず、1月末までこの直送便のサービスを提供します。2月からどうするかはまた検討します。

では、なひたふをお呼びください。お待ちしています。

■なひたふ直送便についての詳しくはこちら

| | コメント (3)

世界一使いやすいRXマイコンの書き込みツール

世界一使いやすいRXマイコンの書き込みツールを作りました。
このツールは、FDTの代わりに使うことができて、RX62NのUSBブートモードで内蔵フラッシュROMに書き込みができます。

Rxprog

特徴は、
 ・RX62Nの接続を待ちうけることができる
 ・ファイルが更新されるまで待つ
 ・最近使ったファイルのリストを保持している
ということなのですが、実際の動作を動画で見て見ましょう。

「書き込みボタン」を押しておけば、MOTファイルが更新されるまで待ったり、RX62Nが接続されるまで待ったりというのをツールがやってくれるのです。

今までのFDTだと、①MOTファイル生成→②RX62NをUSBで接続→③MD0をジャンパしてリセット→④書き込みボタンを押す、という手順どおりにやらねばなりませんでしたが、このツールではどんな手順でやってもOKです。

組み込み開発では、なんどもなんどもプログラムを修正して書き込んでいると、上の手順を律儀に守るのが面倒になってきますが、このツールならば好きな順番でできるので、とても楽になります。

こちらからダウンロードできます。もちろん無償です。
どうぞお使いください!

| | コメント (0)

2012.01.22

SATA IPコアをリリースします。無償評価版もあるよ

特電SATA互換IPコアをリリースします。
このコアは、EXPARTAN-6Tで動作するように設計されています。付録のサンプルデザインを使うと、WindowsのMS-DOSプロンプトからUSBを通じてFPGAを操作して、FPGAの先にあるSATAのSSDやHDDにアクセスできるという代物です。

EXPARTAN-6Tの横にあるSATAコネクタに、HDDやSSDをつないで電源を入れ、
Satassd

MS-DOSプロンプトからサンプルアプリを起動すると、まず最初にドライブの「デバイスID」が取得されます。このデバイスIDの中には最大セクタサイズや、HDDがサポートするコマンドセットなどの情報が格納されています。

Sata_dos

その後はdmardや、dmawrといったコマンドを打って、任意のセクタに読み書きできます。
Cmd_dmard

まだまだ完璧とはいえないコアですが、一応、様々なHDDで動作確認ができています。(詳しくはお問い合わせください。)
このコアが従来他社の製品と比べて何が良いかというと、やはり価格ではないかと思います。

このコアは、EXPARTAN-6Tで動くことを前提として作られていて、Spartan-6LXTの中にあるDeviceDNAというしくみを使って特定のFPGAだけで動作するようにもできます(限定版)。そのため、プロジェクトごととか会社ごとといったライセンス形式ではなく、ボードごとにライセンスができるため、IPコアのライセンス費用が安くできるのです。
1台や2台といった小数の試作機器や研究開発にとって、いままではSATAは高値の花でしたが、このIPコアなら目の前にある1台のHDDだけに書き込めればよい、という状況で威力を発揮するものと考えています。

速度は約130~140MB/s出ていて、SATA(1.0)の限界まで無駄なく使えています。

SATAサンプルデザインについての詳しい使い方はこちらのページに書きました。

無償評価版も用意いたしましたので、EXPARTAN-6Tをお持ちの方は、ぜひとも試してみてください!
※なお、操作を誤るとSSDやHDDに格納されたデータを消してしまうので、実験の際は不要なHDDをお使いください。

| | コメント (0)

«RXのモニタプログラム