ブログ - 最新エントリー

N7とN8の違い

カテゴリ : 
その他
2012-12-28 18:00
RX62Nターゲットの検証を行うためInterface誌の2011年5月号の付属RX62Nマイコン基板を使用したが、コンパイルから実行まで問題なく終了したのは以前紹介した通りで、選択したターゲットは「RX62N(512k Flash)」であった。すなわちR5F562N8を対象としている
ところが、Interface誌に付属していたRX62NはR5F562N7となっており、両者の違いは以下に挙げた内蔵メモリのサイズという事になっている。
型名 ROM容量 RAM容量
R5F562N8
512K (0xFFF80000 - 0xFFFFFFFF) 96K
R5F562N7 384K (0xFFFA0000 - 0xFFFFFFFF) 64K
アドレスも異なるため、この範囲を超えた場合は書き込むこともできないはずだが、どのツールも実機も何の文句も言わずに動いてる。RAMも同様に96kを想定していて、ダンプしてみても確かにそこにRAMはある。

この表の通りであれば、動かないという結果が得られるのがフツーだと思うのだが・・・。謎だ。

新ターゲットであるRX62Nを検証する

カテゴリ : 
その他
2012-12-27 17:00
GCC Developer Liteに新規追加されたターゲットRX62Nの検証を行ってみた。
環境は以下の通り。
対象: Interface誌2011年5月号付録RX62Nマイコンボード
ホストOS: Windows8
コンパイラ: 設定リストから「RX62N(512k Flash)」を選択
書込みツール: Flash Writer (FT230XのUSBシリアル変換を介してSCI1にTTLで直結)
#include <RX62N.h>
#include <us.h>
#define EI __builtin_rx_setpsw ('I')
void main (void) {
static char txb[100],rxb[100];
EI; // 割り込み許可
PORT3.ICR.BIT.B0 = 1; // P30の入力バッファを有効
PORT3.DDR.BIT.B0 = 0; // P30を入力ポートに指定
PORT1.DDR.BIT.B5 = 1; // P15(LED)を出力ポートに指定
// SCI1をライブラリで初期化
sci1_int_init (3000000, txb, sizeof(txb), rxb, sizeof(rxb));
sci1_int_printf("hello!!\n");
while (1) {
sci1_int_putc (sci1_int_getc ()); // エコーバック
PORT1.DR.BIT.B5 ^= 1; // LED反転
}
}
上記は今回検証用に作成したプログラムで、割り込みを使ったシリアル通信を行うAPIを呼び出し、単純にエコーバックしている。

コンパイルされたmotファイルのサイズは小さいのだが、Flash Writerによる書き込みにやけに時間がかかる。USBシリアル変換でSCI1へTTL直結という事もあり、書き込みの際のボーレートを750kbpsまで上げたら我慢できるスピードになった。
作者曰くmotファイルで更新されるエリアだけではなく、フラッシュ全域に転送しているとの事。無駄な事を・・・。

とりあえず書き込んだプログラムは意図したとおり動作している。


実は問題点というより動いている事に疑問が出てきたのだが、それは又の機会に。
ついでと言っては失礼だが、双葉電子工業株式会社製のRSシリーズも新しいFDIIIライブラリを使う事で扱えるという事で、ID=1に位置を指令してさらに現在位置を取得するプログラム。
位置情報に符号があるのが特徴。 
#include <fd.h>
void main (void) {
int16_t now = -1500, p;
// ポートオープン
RS_ChangeBaudrate (230400);
// モータON
fd_RSEnableControl (1, true);
while (!fd_GetPB ()) {
// 位置指令
RS_WriteWordData (1, RS_ADDRESS_GOAL_POSITION, now, 10, NULL);
// 位置取得
RS_ReadWordData (1, RS_ADDRESS_PRESENT_POSITION, &p, 10, NULL);
fd_printf("goal pos=%5d, present pos=%5d\r",now, p);
now += 5;
if (now > 1500) now = -1500;
fd_Wait (10);
}
// モータOFF
fd_RSEnableControl (1, false);
}
もうちょっとで公開です。
先にお知らせした内容の問い合わせをいただいたので、ちょっと出し。

ICS3.0ないし3.5の近藤科学社製モータであればOK。残念ながらボーレートの誤差が抑え切れない都合から、最大通信速度が115.2kまでの対応。
ICS対応のサーボモータは制御する上での情報がメモリマップとして提供されていないため、FDIIIライブラリ内に以下の様な仮想メモリマップを構成し、それらに対してAPIからアクセスするといった方式を採用。
仮想アドレス データ サイズ
 0 モータフリー 1 byte
 1 指令位置 2 byte
 3 現在位置 2 byte
 5 電流 1 byte
 6 温度 1 byte
サーボモータのEEPROM領域の割り当ては無い。

主なAPIを以下に抜粋。
  • ホストボーレート変更
    bool KRS_ChangeBaudrate (uint32_t baudrate)
  • バイト書き込み
    bool KRS_WriteByteData (uint8_t id, uint8_t adr, uint8_t data, uint32_t timeout, uint16_t *errcode)
  • ワード書き込み
    bool KRS_WriteWordData (uint8_t id, uint8_t adr, uint16_t data, uint32_t timeout, uint16_t *errcode)
  • バイト読み出し
    bool KRS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *data, uint32_t timeout, uint16_t *errcode)
  • ワード書き込み
    bool KRS_ReadWordData (uint8_t id, uint8_t adr, uint16_t *data, uint32_t timeout, uint16_t *errcode)
  • 同期書き込み
    bool KRS_WriteSyncData (uint8_t *data, uint8_t size, uint16_t *errcode)

IDと仮想アドレスを指定して各APIを呼べば、適宜ICSのプロトコルに変換してサーボモータとおしゃべりしてくれる。

例としてID=0のサーボモータに位置を指令してさらに現在位置を取得する事を繰り返すプログラムを作ってみた。少しだけ紹介していないAPIも使っているが、そこそこシンプルでしょう。

#include <fd.h>
void main (void) {
uint16_t now = 0, p;
// ポートオープン
KRS_ChangeBaudrate (115200);
while (!fd_GetPB ()) {
// 位置指令
KRS_WriteWordData (0, KRS_ADDRESS_GOAL_POSITION, now, 5, NULL);
// 位置取得
KRS_ReadWordData (0, KRS_ADDRESS_PRESENT_POSITION, &p, 5, NULL);
fd_printf("goal pos=%5d, present pos=%5d\r", now, p);
now += 10;
if (now > 16383) now = 0;
fd_Wait (10);
}
// モータOFF
fd_KRSEnableControl (0, false);
}
USBを使用したサードパーティのinfファイルは、Windowsに用意されたUsbser.sysドライバを参照する事が多いと思います。GCC Developer Liteにおいても、AT91SAM7Sマイコンボード用(FDIII-HC, UD3含む)とSAM3Sマイコン用(MIO含む)にinfファイルが用意されています。

ところが、Windows 8(x64)ではデフォルトでinfファイルにデジタル署名がなされている事が前提となっており、デベロッパにとってWindows 8を採用する際の妨げとなっている様です。Windows 7より以前であればドライバのインストール時にデジタル署名を無視する事で適用できましたが、Windows 8ではがんとして拒否します。

それでは使い物にならないという事で、備忘録がてらWindows 8においてデジタル署名が無いinfファイルを適用する際の最も簡単な手順を以下に示します。

  1. コマンドプロンプトを管理者権限で起動。
     
  2. bcdeditコマンドで次回起動時の設定変更を行った後にWindowsを再起動。

    bcdedit /set {current} onetimeadvancedoptions on


     
  3. 再起動後スタートアップ設定画面になるので、7)の「ドライバー署名の強制を無効にする」を選択。

     
  4. 普通にログインし、認識させたいUSBデバイスをPCに接続して通常通りドライバをインストール。途中Windowsのセキュリティメッセージダイアログボックスが表示されたら、「このドライバーソフトウェアをインストールします(I)」を選択。この間Windowsを再起動してはいけません。


これ以後は特殊な操作無く、今迄通りデバイスが使用できるようになるはずです。再起動の度にこれらの作業をする必要はありませんが、接続するUSBポートを変更した場合は再度同じ方法でドライバをインストールしなくてはなりません。

なお、既にBCDにadvancedoptionsが登録されていると、本手順でスタートアップ設定画面にならない様です。その場合は、該当のエントリオプションを手動で削除しておきましょう。

近々GCC Developer Liteを更新します

カテゴリ : 
雑記
2012-12-10 19:04
長らく汎用版の更新がなされていませんでしたが、近々アップデートします。
外観は何ら変わりはありませんが、追加されるターゲットが大幅に増えるため、少しだけ予告を兼ねてお知らせします。

<FDIIIライブラリ>
FDIII用のライブラリがサポートするデバイスは従来のDynamixelシリーズに限られていますが、近々公開しますGCC Developer LiteではMXシリーズにも対応します。勿論新旧やI/Fが違っていても混在した状態で利用する事ができます。

また、ROBO-ONEにおける標準化の一環として、アプリケーションのレイヤから各社のアクチュエータ(シリアル通信対応に限る)へアクセスする方法を決定した事もあり、組み込みデバイスにもそれを展開すべく、FDIII-HCのライブラリとして新規に以下のアクチュエータをサポートする事になりました。

・近藤科学社製
KRS-2552RHV ICS, KRS-2542HV ICS, KRS-4031HV ICS, KRS-4032HV ICS, KRS-4034HV ICS, KRS-4033HV ICS, KRS-6003HV ICS
※ICS3.0及びICS3.5かつ115.2kbpsに限定

・双葉電子工業株式会社製
RS601CR, RS401CR, RS402CD, RS405CB, RS406CB, RS301CR, RS302CD, RS303MR, RS304MD

なお、今回のアップデートにおいては、これらアクチュエータに対する直接的なアクセスAPIの提供のみで、互換性を優先としたためにFDIII-HCならではのモーション等のAPIのサポートは含まれません。

<Atmel SAM3Sターゲット>
AT91SAM7Sの後継としてcortex M3コアを搭載したマイコンボードを一部にリリースしており、マイコンボードを販売する予定もある事から、先行でパブリック版に同梱します。コンパイル済のToppersカーネルも含みます。
AT91SAM7Sとほぼピンコンパチのデバイスを対象としています。

<Renesas RX62Nターゲット>
既に一部に公開していますが、ご要望が多いためにパブリック版に同梱する事とします。
H8シリーズと同程度の最低限のサポートファイル(スタートアップルーチン・ペリフェラルヘッダ・シリアル通信)で構成されます。
また、FLASH WRITERにてRX62NのSIOを介した内蔵フラッシュへの書き込みをサポートします。

<STMicroelectronics STM32F2ターゲット>
こちらも一部に公開していますが、F4の登場もありF2はある程度機能が枯れ始めたので同梱することにします。コンパイル済のToppersカーネルも含みます。
最低限のサポートファイル(スタートアップルーチン・ペリフェラルヘッダ)で構成されます。

その他コンパイラ本体の更新や各ターゲットの微修正等が含まれます。
公開までもう少しお待ちください。

技術サポート

SH2/7145のコンパイル

カテゴリ : 
雑記
2012-11-14 20:00
とある検証でSH2/7145を動かそうとしてみたら全く動かない。
サンプルすら動かないので調べてみると、どうやら割り込みにかかるところが原因のようだ。
何故か最適化(レベル1以上)すると動くので確認してもらったところ、ヘッダ内のマクロに起因していたようで、マクロを修正すると最適化に関係なく正しく動くようになった。
ヘッダの修正版は次のGDLリリースに含まれるだろう。
yoshi

Windows8のIME

カテゴリ : 
雑記
2012-11-8 20:06
しばらく前からWindows8を使っていたが、困ったことにIMEがアプリケーション共通になっていた。調べるほどのことでもなかったので放って置いたのだが、ある時コントロールパネルに設定を見つけたので早速試してみることに。
「コントロールパネル」→「時計、言語、および地域」→「言語」→「詳細設定」の「入力方式の切り替え」内に「アプリウィンドウごとに異なる入力方式を設定する」チェックボックスがあるのでチェックを入れて「保存」する。
これで以前と同様の入力ができるようになった。

SAM3Sのループ時間

カテゴリ : 
その他
2012-10-19 17:28
#include <SAM3S4.h>
#include <piocfg.h>
static const TPin pins[] = {
  { PIO_PA0, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },
};
int main () {
  volatile int i;
  PIO_Configure (pins, PIO_LISTSIZE (pins));
  for (;;) {
    PIOA->PIO_SODR = 1;
    for (i = 0; i < 10000; i++);
    PIOA->PIO_CODR = 1;
    for (i = 0; i < 10000; i++);
  }
}
試しにトグル出力させるプログラムを確認していたら勝手にDutyが変更されていた。
いくつか試してみるとfor文を空で回していることが原因らしく、for文内に何らかの処理を指定することでトグル出力されるようになった。
nopもそのうち使えなくなるしどうしたものか。

Dynamixel Configurator更新

カテゴリ : 
その他
2012-9-18 14:45
かなりしばらくぶりの更新になります。
Dynamixel用のコンフィギュレータですが、色々フィードバックいただいたうちから微々たる修正と機能追加をおこなってみました。
  • DXLIB2  V2.7を適用(未公開)
  • Scan方法の見直しと、その際に検出されたデバイスを列挙する機能を追加
  • MXシリーズに対応



こちらからどうぞ

#USS3 Configuratorもあわせて更新しました。