2015年07月11日

東芝のARMマイコンTMPM375(5):モーター制御サンプル

まだ、引き続きTMPM375 モータコントロールマイコンセミナーに触発されて調査をしています。

昨日見たBlinking LEDのソースコードを見たところ普通のCortex-Mマイコンと差はありませんでした。
今度はDC_Motorを見てます。EWARMのサンプルからTMPM375からDC_Motorを開きます。

昨日はファイル1つだけでしたが、今日は以下のようにファイル数も増えました。
AA_0106.png

TMPM375の特徴のベクトルエンジンを使っているサンプルになっています。

mainの処理は関数main_loopで実施しています。
void    main_loop(void)
{
  init_WDTclr();            // WDT clear
 
  while(1) {
    if(M_Main_Counter >= cMainLoopTime) {
      M_Main_Counter = 0;
     
      init_WDTclr();            /// WDT CODE CLEAR
     
      /***** User control   *****/
      B_User_Control();
     
      /***** Motor control  *****/
      C_Control_Ref_Model();    // Change of stage
      C_Common();                // Stage Functions
      C_Stage_Stop();            // Stop
      C_Stage_Emergency();    // Emargensy
      C_Stage_BootStrp();     // Boot time
      C_Stage_Initposition();    // Positioning
      C_Stage_Force();        // Force commutation
      C_Stage_Change_up();    // Change up
      C_Stage_Steady_A();        // Normal RUN A (Speed control by currnt)
    }
  }
}

この関数が実際のモーターを回すためのフェーズになっています。
STOP→Bootstrp(準備)-Initposition→Force(回す)→Change_up→Steady(定常状態)
という実装になっています。




タグ:TMPM375 EWARM
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする

2015年07月10日

東芝のARMマイコンTMPM375(4):LED点滅サンプル

引き続きTMPM375 モータコントロールマイコンセミナーに触発されて調査をしています。

今日は、EWARMのサンプルのLEDを点滅しているものを見てみたいと思います(Blinking LED)。
まずコードを張り付けると(コメントは外したものもあります)
/** include files **/
#include <Toshiba\iotmpm375FSDMG.h>

#pragma section=".intvec"

/* Private define ------------------------------------------------------------*/
#define EHOSC  10000000UL

/*
InitClock set CPU clock = 40MHz
*/
void InitClock(void)
{
  /*Disable PLL*/
  CGPLLSEL_bit.PLLSEL = 0;
  CGOSCCR_bit.PLLON = 0;
  /*External oscilator enable*/
  CGOSCCR_bit.WUPSEL1 = 0;
  CGOSCCR_bit.XEN1 = 1;
  /*Selects warm-up counter by external oscillator*/
  CGOSCCR_bit.WUODR = 256; /*wait some clocks from external oscillator*/
  /*Start warm up*/
  CGOSCCR_bit.WUEON = 1;
  while(CGOSCCR_bit.WUEF)
  {}
  /*start PLL*/
  CGOSCCR_bit.PLLON = 1;
  /*wait to lock 200us*/
  CGOSCCR_bit.WUODR = 200*EHOSC/1000000;
  /*Start warm up*/
  CGOSCCR_bit.WUEON = 1;
  while(CGOSCCR_bit.WUEF)
  {}
  /*Set Prescalers*/
  CGSYSCR_bit.GEAR = 0;
  CGSYSCR_bit.PRCK = 1;
  CGSYSCR_bit.FPSEL = 1;
  /*selecet PLL as clock*/
  CGPLLSEL_bit.PLLSEL = 1;
}


int main(void)
{
  VTOR  = (unsigned int)__segment_begin(".intvec");
  WDMOD = 0;
  WDCR  = 0xB1;

  // Setup PLL controller
  InitClock();

  // Setup LED port Output (PG0/U0,V0,W0)
  PGIE_bit.PG0IE = 0;
  PGFR1_bit.PG0F1 = 0;
  PGCR_bit.PG0C = 1;

  PGIE_bit.PG2IE = 0;
  PGFR1_bit.PG2F1 = 0;
  PGCR_bit.PG2C = 1;

  PGIE_bit.PG4IE = 0;
  PGFR1_bit.PG4F1 = 0;
  PGCR_bit.PG4C = 1;

  WDMOD = 0xA0;
  WDCR  = 0x4E;

  while(1)
  {
    ;
  }
}

void NMI_ISR(void)
{
static unsigned int i,k;
  if (!(i%16)) {
    PGDATA = ++k& 0x15;
  }
  ++i;
}

typedef void( *intfunc )( void );
typedef union { intfunc __fun; void * __ptr; } intvec_elem;

#pragma language=extended
#pragma segment="CSTACK"

void __iar_program_start( void );

#pragma location = ".intvec"    /* Need aligned to 128 Bytes */
/* TMPM375 Vector Table entries */
const intvec_elem __vector_table[] =
{
  { .__ptr = __sfe( "CSTACK" ) },
  __iar_program_start,
  NMI_ISR,
};



このサンプル特徴的なのは、自分でベクターテーブルを定義している点ですね。
Cortex-Mでは、ベクターテーブルは、1)スタックのアドレス、2)リセット直後にスタートアドレス、3)NMI割込みとならびますが、
いきなり以下で定義しています。 __sfeはスタック領域CSTACKの後ろのアドレスを返します。
const intvec_elem __vector_table[] =
{
  { .__ptr = __sfe( "CSTACK" ) },
  __iar_program_start,
  NMI_ISR,
};

これで、どうもウォッチドッグタイマでNMIを発生させて、NMI割込みを起こしているようです。
NMIハンドラは以下のNMI_ISRで定義しています。Cortex-Mでは、割込みハンドラも関数も差がありませんので、これだけでハンドラが出来上がりです。
void NMI_ISR(void)
{
static unsigned int i,k;
  if (!(i%16)) {
    PGDATA = ++k& 0x15;
  }
  ++i;
}

ウォッチドックタイマはWDCRとWDCOMの2つのレジスタがあります。
まずWDCDは、クリアレジスタです。クリアする場合には0x4Eを書き込む必要があります。
AA_0105.png

そして、WDMODは動作の設定をします。WDTEで動作のイネーブルを設定し、割込みを発生するようにしています。
WDMOD = 0xA0;
AA_0104.png

これだけ見ると、普通のCortex-Mのマイコンです。



タグ:EWARM TMPM375
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする

2015年07月09日

東芝のARMマイコンTMPM375(3):TMPM375のサンプルは?

さて引き続きTMPM375 モータコントロールマイコンセミナーに触発されて調査をしています。

TMPM375で検索をしていると、YouTubeに実際のCPUボードにモーターを接続した動画あり、
ちょっと見てみました。www.youtube.com/watch?v=wuVlQNittjY
面白そうなのですが、IARさんのホームページで英語の部分を見ていると300ユーロとありました。
AA_0101.png

これでは、大蔵省の許可が下りません。。。

そこで、EWARMのサンプルを見てみます。
AA_0102.png

するとTMPM375には以下の2つのサンプルが用意されています。
1つはLEDの点滅、もうひとつがモーターを回すサンプルのようです。
AA_0103.png

明日からコードを見てみたいと思います。



タグ:TMPM375 EWARM
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする

2015年07月08日

東芝のARMマイコンTMPM375(2):TMPM375の特徴は?

昨日はTMPM375モータコントロールマイコンセミナーに触発されて、東芝のマイコンを調べてみました。
正直、秋葉原だとNXP、STマイクロが多いですね。

せっかくなのでTMPM375を調べてみようと思います(場合によってはセミナーに参加も考えたいかも)。

東芝のホームページで探してみるとM370ということで、モータ制御をターゲットにしているマイコンでした。
まず、CPU側の情報からまとめてみると。
CPUコアCortex-M3
ROM64KB
RAM4KB
動作クロック80MHz
pin30pin, SSOP
電源5V
特徴1ベクトルエンジンを搭載
特徴212ビットADC

Cortex-M3でモーター制御でこの程度のCPUで処理できる点について興味がわいてきます。
ベクトルエンジンに工夫があるのでしょうか?




タグ:EWARM TMPM375
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする

2015年07月07日

東芝のARMマイコンTMPM375(1):まず東芝のマイコンって?

昨日、TMPM375 モータコントロールマイコンセミナーなるものを見つけたので、すこし調べてみることにしました。

秋葉原とかではあまり東芝製のマイコンとか見ないです。
もしかしたら、どこかにあるかもしれませんが、正直あまりメインの棚に置いてあることはないと思います。

そこで、すこし調べてみました、東芝マイコンの歴史はfacebookにまとめてありました。
第1:東芝マイコンの歴史 <=見たい方はクリックください。
驚くことに最初のマイコンは、1973年フォード向けのエンジンコントローラだそうで、12ビットマイコンTLCS-12Aシリーズだそうです。

続いてはインテルやザイログのセカンドソース生産だそうです。
i8080,Z80, MC68000などお世話になった方も多いかと思います。

セカンドソースでやっているときも4ビットマイコンはオリジナルで作成したようです。

1987年からオリジナル8ビットマイコンTLCS-90などからはじまったようです。
TLCS-870などは聞いた覚えがあります。


5と6が見つからないので、最後の 第7:東芝マイコンの歴史
32ビットのオリジナルマイコンTX19からARMコアを採用したマイコンと流れてきています。
2007年からARM9、2009年からCortrex-Mマイコンを採用したマイコンを市場に投入したようです。

こうした点は大変興味があります。なぜかというと、どちらかという日本は独自のCPUアーキテクチャが強かった。
独自コアを維持しようとした会社がその後失速したことと、東芝の半導体の強さは関係あるのか?たいへん興味があります。

さらに、東芝マイコンをしらべると、Cortex-M0、Cortex-M3、Cortex-M4Fと多くのマイコンをリリースされていることが解りました。

半導体の世界シェアを見てみるとGartnerさんのところに2014の情報があります。
AA_0100.png

東芝は世界で6位という高い順位です。これってフラッシュが強いからですかね。



いろいろ調べていたらTMPM375 モータコントロールマイコンセミナー以外にも、
モータ制御入門コースなどがあること判明しました。


タグ:EWARM TMPM375
posted by EWARMJP at 12:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする

2014年12月31日

EWARMを使ってArduinoシールドのサンプルスケッチを動かそう(8)GPIOでSDカードのファイルシステムをアクセス

adafruitの2.8inch TFT touch shield for arduino v2のサンプルスケッチで、試していないものがまだあります。
TFT touchシールドにはマイクロSDカードスロットが付いており、これを用いてSDカード内のビットマップ画像を表示するサンプルspitftbitmap.inoです。
下記のように、実際にTMPM370で動かして画像表示できたので紹介します。
 
WS000760.JPG
 
(1)SDカードのインタフェース
「SDカードをアクセスする」というと、専用のコントロールICを思い浮かべるかも知れませんが、TFT touchシールドでは(おそらくその他のシールドも同様)、SDカードの端子は digital I/O(GPIO)につながっていたりします。
Arduinoは5V系なので、さすがに3.3V系のSDカードへの出力はレベルコンバータを通していますが、SDカードからの出力はGPIOに直結しています。
SDカードとの通信インタフェースは、以前のblog( http://ewarmjp.seesaa.net/article/411336858.html )で紹介したSPI(Serial Peripheral Interface)なので、これまで作って来たプロジェクトで、すでにお膳立てはできています。
 
(2)ファイルシステムをアクセスできるか?
しかし、SDカードのファイルシステムアクセスには、少し苦い思い出があります。
以前のblog、「Raspberry PiをEWARM使ってBareMetalで動かす(19)」( http://ewarmjp.seesaa.net/article/403903876.html )で、音声データをSDカードから読みだす方法を模索して、bootloaderの流用にチャレンジしたことがあります。
そのとき、ファイルシステムを扱うライブラリだけでもサイズが大きくなり、EWARMの試用版(サイズ制限版)ではメイクできなかった、というものです。
でもArduinoなら小さくできるかもしれない、という根拠のない希望を持って、試してみることにしました。
 
(3)ArduinoのSDライブラリをEWARMでメイク
SDカードにアクセスするライブラリは、Arduinoの開発環境のlibraries/SD/ の下にソースコードがあります。
この下にさらにutility というディレクトリがあって、ここにSDカードのファイルシステムを扱うためのソースコードが収められています。
これらを、今まで使ってきたEWARMのプロジェクトに追加してメイクしてみます。
 
出てくるエラーは今までと同じように対処していきます。
例えば、#include <avr/pgmspace.h>がないよ、とか、Serial.print()がないよ、とか。
それから、SPI通信について、GPIOを使ったソフト処理について言及してきましたが、Arduinoにはハードウェア処理によるSPIもあります。
ArduinoのSDライブラリはどちらも使えるように作られており、デフォルトはハードウェア処理だったので、defineマクロを定義してソフトウェア処理に切り替えました。
 
(4)サイズ制限はクリア!
ここまでの小手先の修正でメイクが通りました。
そう、サイズ制限はクリアです!
リンカマップファイルをみると、
 
  23 020 bytes of readonly  code memory
     444 bytes of readonly  data memory
   9 924 bytes of readwrite data memory (+ 35 absolute)
 
「最適化なし」の設定にも関わらず23Kbyteでできました。
 
(5)実行→ブートセクタの解析で失敗
そこで実行してみると、EWARMのterminal I/Oに次のように表示され、
 
Initializing SD card... failed!
 
うまくいきません。
デバッガで追ってみると、SDカードから読み出したブートセクタの解析で、正しい情報が得られていませんでした。
 
(6)ブートセクタをどう扱っているか?
ブートセクタについては、例えば、http://elm-chan.org/docs/fat.htmlに詳しい情報があります。
各種情報が格納されている先頭512バイトがブートセクタです。
ArduinoのSDライブラリでは、SdVolume.cppで、cacheBuffer_という入れ物に512バイトのバイト列として読み込んだ後、unionされた各種構造体を通して解析しています。
その様子を、EWARMのデバッガの「自動」ウィンドウで見てみると、
 
WS000762.JPG
 
このように、6つの型をcache_tとしてひとまとめにして使っていました。
このうち、fbs_t(Fat Boot Sector)のメンバーの1つであるbpb_t(Bios Parm Block)のアドレスを見ると、直前の要素oemName[7]との間に1バイトの隙間ができてしまっています。
 
WS000763-2.jpg
 
512バイトのバイナリ列を、先頭から順に意味のある要素として区切って解析しようとしているのに、途中に隙間があると区切りがずれてしまいます。
このため、正しい値が読めなくなっているのが、ブートセクタ解析に失敗している原因でした。
 
(7)構造体の隙間を詰めて実行OK!
この隙間を詰めるため、#pragma pack(1)と指定して、1バイト単位で詰めて配置するようにしました。
安全のため、cache_tに関わる全ての構造体に付けておきました。
 
再度実行してみると、今度は画像が読み込まれ表示されるようになりました。
試した画像は、年末にちなんで、下記の2つです。これらを交互に表示します。
 
画像 horse14.bmp
horse14.bmp
 
画像 sheep15.bmp
sheep15.bmp
 
実行したときのterminal I/Oの表示は次の通り。
どちらの画像も4秒ぐらいで表示できています。
ちなみに、最適化オプションは「高(速度)」の設定です。
 
WS000764.JPG
 
(8)最後に
プロジェクト一式を添付します。
EWARM v7.20.2で実行しました。
 
TFT3_7202.zip
 
実行するときには、前出の2つのbmp画像を格納したマイクロSDカードをシールドに刺してください。
画像ファイル名は、spitftbitmap.inoに決め打ちで埋め込まれています。
ファイル名を変更する場合は、認識できるのはFATの「8文字+3文字」の形式のようですのでご注意ください。
 
SDライブラリは、SPIをソフト処理してGPIOのポートを叩いているだけなので、TMPM370に限らずGPIOを持つ他のマイコンへも比較的簡単に移植できます。
特に、3.3V系のマイコンなら、GPIOにSDカードを直結してアクセスできてしまいます。
それが、試用版EWARMのサイズ制限内で使えることが分かったのは収穫でした。
posted by EWRL78JP at 18:00| Comment(0) | TrackBack(0) | TOSHIBA | このブログの読者になる | 更新情報をチェックする