2012年12月27日木曜日

Stellaris LaunchPadで電子温度計を作ってみました。

  TI Stellaris LaunchPadに温度センサーを繋げて温度表示を行いました。
 最初、単にStellaris LM4F120のAIN端子に温度センサを繋げて、「はい終了!」のつもりが。。。
 以前 MSP430で温度計を作ったときは、電圧出力型温度センサを使ったのですが、今回はLM4F120のADCが12ビットなので、
せっかくなら、「精度のある温度センサを!」
せっかくなら、「複数の温度センサを!」
といったことで、結構手間取るはめになりました。


1.温度センサについて
 今回使用した温度センサはUS Sensor社のUSP11491 です。

2.Rcの選択について
 今回使用の温度センサは、計測温度の上昇に伴い、抵抗値が減少します。したがってLM4F120が出力する電圧Vccの分圧回路を組む必要があると考えました。分圧回路を構成する2つの抵抗 1つはこの温度センサ、もう1つは固定抵抗(Rc) つまりRcを決める必要があります。
温度測定回路、温度計算式等

 ①各温度(-55~150℃)での温度センサの抵抗値を計算
   ※ただし 温度センサの B値は (0~50℃)でこの温度範囲外はBを補正する必要がありそうですが、それこそ、精密な温度計が必要になりそうで今回は目をつぶります。
 ②Rcを仮に設定して、各温度(-55~150℃)での分圧(V)を計算し、1℃あたりの分圧の変化⊿Vを把握
 
⊿Vが大きいほど測定温度の分解能が大きくなる。
   ●Rc 3.3KΩ の場合 35~54℃(45℃がピーク)で⊿Vが大きくなる。
 
   ●Rc 5KΩ の場合 20~50℃(34℃がピーク)で⊿Vが大きくなる。
 
   ●Rc 10KΩ の場合 0~40℃(19℃がピーク)で⊿Vが大きくなる。
 ※測定温度域が低い場合 Rcを大きく 高い場合 Rcを小さくすることになります。
 
3.Stellaris LM4F120のADCの使い方。
 StellarisWareのサンプルプログラムを参考に温度測定回路の電圧Vを取り込み温度表示をおこないました。比較的簡単に出来ました。
 しかし、複数温度センサー構成を試みたところ、なかなか2ch以降の電圧Vの取り込みが行えませんでした、StellarisのADCのシーケンス、シーケンスステップがなかなか理解できなかったのが要因でした、ドキュメントに関連するブロック図でもあったらと思います。
 
 
 
//////// 3チャネルのADC取り込み設定//////////////////////////////////////////
////////////////端子設定/////////////////////////////////////////////////////////////////////
 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
 ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);
 ///////////////ADC0の使用宣言///////////////////////////////////////////////////////
   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
 ///////////////シーケンス設定///////////////////////////////////////////////////////////
 ROM_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_PROCESSOR, 0);
 //////////////ステップ設定////////////////////////////////////////////////////////////////
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 |ADC_CTL_IE );
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 1, ADC_CTL_CH1 |ADC_CTL_IE );
 ROM_ADCSequenceStepConfigure(ADC0_BASE, 2, 2, ADC_CTL_CH2 |ADC_CTL_IE |ADC_CTL_END);
//////////////シーケンス稼働////////////////////////////////////////////////////////////////
    ROM_ADCSequenceEnable(ADC0_BASE, 2);
    ROM_ADCIntClear(ADC0_BASE, 2);
 
//////// 3チャネルのADC 取り込み  //////////////////////////////////////////
///////////////ADCトリガ////////////////////////////////////////////////////////////////////
     ROM_ADCProcessorTrigger(ADC0_BASE, 2);
///////////////ADCコンバージョン完了待ち////////////////////////////////////////////////////////////////////
    while(!ROM_ADCIntStatus(ADC0_BASE, 2, false))
    {
    }
   ROM_ADCIntClear(ADC0_BASE,2);
  ///////////////ADCデータ取得////////////////////////////////////////////////////////////////////
    ROM_ADCSequenceDataGet(ADC0_BASE, 2, ulADC0_Value);
 
ulADC0_Valueは配列 ulADC0_Value[0]がCh0  ulADC0_Value[1]がCh1  ulADC0_Value[2]がCh2 の値を格納
 
 

Stellaris LaunchPadを試してみました。

SG12864によるアルファベット&テストパターン表示
2月前に購入した TI Stellaris LaunchPad をいじり始めました。
 

 開発環境の Code Composer Studio v5 はライセンス切れで、GNU GCCでのプログラミングを試しました。

  他のマイコンとは異なり、Stellarisでは、レジストリを直接操作するようなプログラミングはせず、レジストリの操作を遮蔽した各種関数を使用たプログラミングとなりました。




 
1.デバイスドライバ―のインストール
 TIのHPから、ICDIドライバー(spmc016.zip)をダウンロードし、以下のドライバーをインストールしました。
 ・Stellaris ICDI JTAG/SWD Interface
 ・Stellaris ICDI DFU Device
 ・Stellaris Virtual Serial Port

2.LM フラッシュ・プログラマ のインストール
  ・ダウンロードファイル:LMFlashProgrammer_1470.zip

3.StellarisWare  のインストール
 StellarisのドキュメントをTIのサイト探すのですが、プログラミングガイド、レジストリのリファレンスマニュアル等が見つからず、使えそうなドキュメントは各種関数のユーザーガイド(LM4F120H5QR_ROM_UserGuid.pdf)ぐらいで、プログラム開発は困難と思われました。
 StellarisWareには、LM3S,LM4Fシリーズのサンプルコードが含まれこれが開発の糸口になります。

  *TIからStellarisWareのファイルを ダウンロードすると、ダウンロード元でSW-LM3S-9453.exe(129MB) と SW-LM3S-9453(356M)の2つの異なったファイルが得られます。
 SW-LM3S-9453.exeを実行するとインストールエラーになり、そこで強引にSW-LM3S-9453のファイル名をSW-LM3S-9453.exeに変更してインストールを実行しました。
 

4.GNU GCC
 GCCはすでにインストール済み(Interface誌 付属FM3基板 Cortex-M3 用)
 StellarisWareのサンプルコードのディレクトリで make は成功しました。

※Stellaris LaunchPadの価格が1259円(DigiKey)に改定されていました。しかも在庫0 もう少し多めに買っとけば良かったかなと。。。。

2012年10月9日火曜日

TI LaunchPad  Stellaris を購入しました。

  テキサスインスツルメンツ(TI)より、Stellaris LM4F120 LaunchPadが発売され、半分収集癖から、とりあえず購入しました。このLaunchPadはMSP430と同レベルの価格で450円(C2000 LaunchPadが特別に高いということでしょうか)


 以前試した、Stellaris LM3S8962 の経験から使いやすいマイコンと予想しています。

今回 のマイコン LM4F120 はARM  Cortex-M4 で従来のM3からどの程度進化したのか期待をこめてパッケージを眺めています。
 今は、C2000 LaunchPadの使い方が解り始めたところで、当分このLanchPadの機能を検証していきたいとおもいます、 Stellaris LanchPadを試すのはずっと先になりそうです。

 











 
 
※LanchPad 3機種 
              CPU Bit Clock  RAM      Flash     特徴
MSP430          16  16MHz  128~512B 2KB~16KB  手軽に開発
C2000(TMS320)     32  60MHz  12KB     64KB     かなりユニーク
Stellaris(LM4F120)   32  80MHz  32KB     256KB     一般的(予想)

3機種のLaunchPad 単純に比較はできないと思いますが。今回のStellaris LanchPad は、以下の点でマイコンの学習用に最も適していると思われます。
  • メモリが大きい、      
  • CPU コアが ARM Cortex-M4   
  • 外部出力のPinが多い、 J1~J4の Vcc GND Reset 以外の外部ピンが殆どGPIOで使えます。
  • 超 低価格

2012年10月8日月曜日

TI C2000 LaunchPad 割り込み処理で悪戦苦闘

 
 テキサスインスツルメンツ(TI)のC2000 LaunchPad を 試し始めて、ほぼ1カ月たちました。
この、マイコン基板、他のマイコン基板(MSP430 LaunchPad や CQ出版の付属マイコン基板)に
に比べ やたら凝った構成になっているのに気付きました。
 例えば、以下の2点
 ●デジタルアイソレータISO72x
   PCとのシリアル通信(USBシリアル変換)を直接繋げず、デジタルアイソレータで通信によるPCからのノイズをシャットアウトするようになっているようです。
 ●LEDの点滅にロジックIC(バッファ)を使っている。
   今まで、LEDの点滅はGPIOの出力で行うのが定番と思っていたのですが、この基板、バッファを使うことで、GPIO端子が入力であろうと出力であろうと関係なく、端子の電圧レベル(Hi/Low)で点滅します。LEDはGPIO端子のモニタとなっているようです。
これらは、今後Know Howとして生かせそうな気がします。
 さて、開発の方では、CCSv5で作成するプロジェクトがデバッグは出来るものの、FlashROMへの書き込みが不調で、これがなかなか解決できずにいました。
 やむなく、デモプロジェクト(C2kLaunchPadDemo)をCCSv5にインポート(Copyで)し、
 このプロジェクトがFlashROMへの書き込みが成功するのを確かめた上で、大部分の機能を削りLEDの点滅のみのプログラムに改造しました。
 これをCCSv5でCopy/Pasteして新規のプロジェクトとして使用するようにしました。



C2000 LaunchPadのプログラム開発 第一歩
として各種 割り込みを試しました。
1.タイマ割り込
  サンプルプロジェクトtimed_led_blinkを参考にすると、難なくタイマ割り込みを実現できました。
  タイマ設定 TIMER_setPeriod(myTimer, 50 * 500000); の Period 値は const uint32_t になるような値だと問題ないのですが、uint16_tでおさまる値の場合キャスト(const uint32_t)が必要になるようです。
 また、ユーザーが使えるタイマはTimer0のみの1本で、プログラミングで工夫が必要となりそうです。

2.外部割り込み(GPIO)
  サンプルプロジェクトexternal_interruptを参考にすると、難なく外部割り込みを実現できました。
 外部割り込み(XINT1,XINT2)とGPIO入力Pinは1対1で、1つのピンにXINTnを割り当てると、他のPinに割り当てられないようです。つまり他のマイコンのように外部割り込みが ポート(複数のPin)に割り当てるようなことが出来ず、2本のGPIOの入力のみに外部割り込みが割り当て可能となるようです。

3.SCI(UART)割り込み
 サンプルプログラムscia_loopback_interruptsを 参考にするのですが、コーディングミスでSCI割り込みが失敗。各マニュアルをひっくり返すはめに、すると、割り込みを実現するために設定しなければならないレジスタがあまりにも多いことが解りました。
 また、TIが提供するソースコードで以下の誤りがありました。
 sci.cのSCI_setRxFifoIntLevel()の
     // clear the value
        sci->SCIFFTX &= (~SCI_SCIFFRX_IL_BITS); <=レジスタ間違い SCIFFRX 
 (RXFFIL4-0が初期値 11111のまま、で変更不可となってしまいます・・・・)
 
また FIFOがマニュアル上は16ワード(16バイト?)のはずが、4ワードが上限になっているようです。
 
 

2012年9月24日月曜日

TI C2000 LaunchPad を試しました。

2012年8月 テキサス・インスツルメンツ(TI)より、LaunchPad第二弾、C2000 LaunchPadがリリースされました。


 TIのホームページで同LaunchPadの外観を見て、40本のPinが引き出されていて、MSP430 LaunchPadに比べ、拡張性が高いと思い、早々に発注しました。購入価格は1551円
  9月上旬に届けられた、パッケージを開くと、意外と質素、まあ、MSP430 LaunchPadのパケージが価格のわりに凝り過ぎの感が否めなかったからでしょうか。

 まず C2000 LaunchPad で デモプログラムのデバッグが出来るまでの手順を以下に記します。
1.LaunchPadデモプログラムの稼働
   ・付属のUSBケーブルでLaunchPadを PCにつなぎます。(FT2232ドライバ(FTDI)はMSP430 LaunchPad等で導入済み)
     LaunchPadのLED0~3が流れるように点滅します。
   ・PCでターミナルソフトを立ち上げます。シリアル接続でボーレートを11520に設定します。
   ・LaunchPadのResetスイッチを押します。
    TIのロゴマークのパターンがターミナルソフトに出力されます。
   ・スイッチS3を押すと、LEDの点滅が変化し、ターミナルソフトに温度変化が出力されます。
   

2.Code Composer Studio(CCSV5)のインストール
   MSP430を試したときのバージョン4(CCSV4)で、C2000 TMS320F28027のプロジェクトを作成、(TIのホームページよりダウンロード(sprc191.zip)したサンプルプログラム を使用)
 
   ビルドは成功するのですが、LaunchPadとの接続が出来ない。接続エラーも出力しない。(うんともすんとも言わない状態)  CCSV4では無理と判断 CCSV5のインストールを行いました。
 1)TIからCCSV5をダウンロードした ccs_setup_5.2.1.00018.exe を実行
 
    CCSV5はc:\tiのフォルダにインストールされる。
 2)CCSV5を実行 ライセンス登録を行う。
  
   ・ライセンス管理のため ネットワークカードのMACアドレスが必要
    コマンドプロンプトで ipconfig /all を実行 イーサネットアダプタの物理アドレスを使う。
   ・メールで送られてきた ライセンスファイル(TMDFCCS-ALLT90A-v5.lic)を c:\ti\licenceのフォルダに置く。
3.controlSUITEのインストール
  これは、LaunchPadのデモプログラム(C2kLaunchPadDemo)を利用するためにインストールしました。
  デモプログラム
C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_examples\C2kLaunchPadDemo
4.デモプログラムのデバッグ
 1)CCSV5を立ち上げ、前述のデモプログラムをImportしました。
  ・Buildを実行すると成功、しかしLaunchPadとの接続エラーでデバッグは実行出来ず。
 2)デモプロジェクトにNewでTarget Configuration File を作成しました。
  ・Connection: Texas Instruments XDS100v1 USB Emulatorを選択
  ・Boad or Device: TMS320F28027にチェック
  ・Save Configuration 後 Test Connectionを実行 =>成功
   ※接続ログ 後述
 3)デバッグを実行
  今回 C2000 LauchPad のデバッグ 実行から開始までかなり時間がかかりました。(40秒)

5.開発初期プロジェクトの作成
 1)File/NewでCCS Project を作成する。
       ・Project name 入力
   ・Device Family:C2000
              Variant:2802x Piccolo TMS320F28027
        ・Connection:Texas Instruments XDS100v1 USB Emulator
       ・Project templates and examples  で Empty Project(with main.c) を選択
   *Taget Configration File は TMS320F28027.ccxml で作成されました。
 2)プログラムコーディング/ビルド/デバッグ
   LED0~3の点滅のプログラムはビルド成功しかし、コーディングを進めるに従い、次のエラー発生

../28027_RAM_lnk.cmd", line 114: error #10099-D: program will not fit into available memory.  placement with alignment/blocking fails for section ".text" size 0xaa5 page 0.  Available memory ranges:
   
どうも RAMのエリアが足りないエラーのようです。
   ・cmdファイル 28027_RAM_lnk.cmd の置き換え。
    とりあえずデモプロジェクトで使われている 2つのcmdファイルに置き換えました。
   <cmdファイル>
     ●F2802x_Headers_nonBIOS.cmd
        C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_headers\cmd
     ●F28027.cmd
        C:\ti\controlSUITE\development_kits\C2000_LaunchPad\f2802x_common\cmd
これで一部WARNINGはでるものの一応ビルドは成功しました。

 何とかLED の点滅が可能になったので、キャラクタLCDでメッセージが表示を試しました。

----------------------------------------
 
  
 現時点では、まだデバッグは出来るものの、フラッシュROMへの書き込みは不調のようで、C2000 LaunchPadでもう少しじたばたしそうです。
----------------------------------------
C2000 LaunchPadの40本のピン 意外とGPIOに割り当てられたピンが少なく、少々残念、購入前に リファレンスマニュアルを読み込んでおけば。。。。。
----------------------------------------
※ 成功のLaunchPad 接続ログ
=======================================
  
[Start]
Execute the command:
%ccs_base%/common/uscif/dbgjtag -f %boarddatafile% -rv -o -F inform,logfile=yes -S pathlength -S integrity
[Result]

-----[Print the board config pathname(s)]------------------------------------
C:\Users\yanagi\AppData\Local\.TI\213602635\
    0\0\BrdDat\testBoard.dat
-----[Print the reset-command software log-file]-----------------------------
This utility has selected a 100- or 510-class product.
This utility will load the adapter 'jioserdesusb.dll'.
The library build date was 'May 30 2012'.
The library build time was '22:52:27'.
The library package version is '5.0.747.0'.
The library component version is '35.34.40.0'.
The controller does not use a programmable FPGA.
The controller has a version number of '4' (0x00000004).
The controller has an insertion length of '0' (0x00000000).
This utility will attempt to reset the controller.
This utility has successfully reset the controller.
-----[Print the reset-command hardware log-file]-----------------------------
The scan-path will be reset by toggling the JTAG TRST signal.
The controller is the FTDI FT2232 with USB interface.
The link from controller to target is direct (without cable).
The software is configured for FTDI FT2232 features.
The controller cannot monitor the value on the EMU[0] pin.
The controller cannot monitor the value on the EMU[1] pin.
The controller cannot control the timing on output pins.
The controller cannot control the timing on input pins.
The scan-path link-delay has been set to exactly '0' (0x0000).
-----[The log-file for the JTAG TCLK output generated from the PLL]----------
There is no hardware for programming the JTAG TCLK frequency.
-----[Measure the source and frequency of the final JTAG TCLKR input]--------
There is no hardware for measuring the JTAG TCLK frequency.
-----[Perform the standard path-length test on the JTAG IR and DR]-----------
This path-length test uses blocks of 512 32-bit words.
The test for the JTAG IR instruction path-length succeeded.
The JTAG IR instruction path-length is 38 bits.
The test for the JTAG DR bypass path-length succeeded.
The JTAG DR bypass path-length is 1 bits.
-----[Perform the Integrity scan-test on the JTAG IR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG IR Integrity scan-test has succeeded.
-----[Perform the Integrity scan-test on the JTAG DR]------------------------
This test will use blocks of 512 32-bit words.
This test will be applied just once.
Do a test using 0xFFFFFFFF.
Scan tests: 1, skipped: 0, failed: 0
Do a test using 0x00000000.
Scan tests: 2, skipped: 0, failed: 0
Do a test using 0xFE03E0E2.
Scan tests: 3, skipped: 0, failed: 0
Do a test using 0x01FC1F1D.
Scan tests: 4, skipped: 0, failed: 0
Do a test using 0x5533CCAA.
Scan tests: 5, skipped: 0, failed: 0
Do a test using 0xAACC3355.
Scan tests: 6, skipped: 0, failed: 0
All of the values were scanned correctly.
The JTAG DR Integrity scan-test has succeeded.
[End]
=======================================





    

2012年5月15日火曜日

付属FM3基板 LCD表示(SG12864)

Interface誌 付属FM3基板 でモノクログラフィック SG12864 を繋げてみました。
当初 付属SH-2A基板で使っていたプログラムソースを流用したのですが。まったく動作せず、軽くタイミング調整でなんとかなると思っていたのですが、これに手こずり、いまだ使えずにいます。

◎FM3 <=> SG12864 インターフェース
----------------------------------------
FM3 GPIO       SG12864 PORT
----------------------------------------
P50            D/I       4
P51            R/W     5
P52            E       6
PB0-PB7         DB0-DB7 7-14
P3A            CS1     15
P3B            CS2     16
P53            /RES     17

そこで、SG12864 を使った簡単なプログラムソースが無いか、ネットで調べると、「Sim's blog」さんの   SG12864Aを使ってみました の記事に ソースコード(ATMEL AVRマイコン ATMega168)が掲載、これを拝借、
なにより、ソースが明瞭簡単、各信号の出力タイミングの調整すごく楽そうだったので、このソースコードを試すことにしました。

始めは、ノイズパターン(意味不明の)表示でした。そこで画像データの代りに、0x55、0x50(4本線2本線パターン表示)の固定値を書き込むように変更。
E信号等の出力前にWaitを加えその待機時間を調整、最初十数ドット巾の線が、待機時間の調整で徐々に広がり最終的に全画面表示に、そこで、本来の画像データの表示に戻すと、「初音ミク」登場とあいなりました。



*本来使いたかった私のSG12684のプログラムソースは 付属V850基板のときに作成、付属ARM(LPC2386)基板の時に、別のマイコンでも簡単に対応できるように、いろいろプログラムに工夫をこらしました、おかげで付属ARM(STM32)基板、付属SH-2A基板ではすんなり改造ができたので今回も簡単にできると思っていました。
今回のSG12684のプログラムソースの付属FM3基板への対応、一旦改造に失敗すると、凝ったプログラムは悲惨。。。と 反省


*今回の付属FM3基板 GPIOによるデジタル出力(パラレル)の能力が非常に高いと言えるのかも知れません。

2012年5月11日金曜日

付属FM3基板 第二歩 タイマ割り込み。

Interface誌 付属FM3基板 で タイマ割り込みがようやく使えるようになりました。デュアルタイマ、多機能タイマ何れもタイマ割り込みによるLEDの点滅が実現できました。

苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。

実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。

以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。

◎多機能タイマについて。
 
 
  多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。

 
 
 また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。


=======デュアルタイマ  main.c ========
#include "mcu.h"
static volatile uint16_t int_count;

void DT_Handler(void)
    {
     /* Clear Interrupt */
     FM3_DTIM->TIMER1INTCLR = 0xffffffffU;

     int_count++;
     int_count &= 0x7fff;
     FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
     FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}

int32_t main(void)
{
    int i;
     int_count = 0;
     // for LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( Dual Timer )
    /* Clear Interrupt */
    FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
    FM3_DTIM->TIMER1CONTROL =0x00000000U;
        
    FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
    FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
    FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
    FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
     /* enable interrupt */
    NVIC_EnableIRQ(DTIM_QDU_IRQn);

    //Set the count cycle
    FM3_DTIM->TIMER1LOAD = 0x00020000;
    FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;

    while(1){
        for(i=0;i<200000;i++){
           bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
       bFM3_GPIO_PDORF_P3 =0;
      }
  }
 
}
=======多機能タイマ  main.c ========
#include "mcu.h"

static volatile uint16_t int_count;

void MFT_FRT_IRQHandler(void)
{
    /* Clear Interrupt */
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    int_count++;
    int_count &= 0x7fff;
    FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
    FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
    FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}

int32_t main(void)
{
    int i;

    int_count = 0;

    // LED1
    bFM3_GPIO_DDRF_P3=1;
    // Test Output Port (LED_A LED_B LED_C)
    bFM3_GPIO_DDR5_P0=1;
    bFM3_GPIO_DDR5_P1=1;
    bFM3_GPIO_DDR5_P2=1;

    // Configuration ( // Configuration ( Multi-function Timer ))
    FM3_MFT0_FRT->TCSA0 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
    FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
    FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
    FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
    FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
    FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
    FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;

    FM3_MFT0_FRT->TCSB0 = 0x00000000;
    FM3_MFT0_FRT->TCDT0 = 0x0000;
  
    NVIC_EnableIRQ(FRTIM_IRQn);

    FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;

    //Set the count cycle
    FM3_MFT0_FRT->TCCP0 = 0x1000;
 
    FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;

    while(1){
        for(i=0;i<200000;i++){
         bFM3_GPIO_PDORF_P3 =1;
       }
        for(i=0;i<200000;i++){
        bFM3_GPIO_PDORF_P3 =0;
      }
   }
}

2012年5月7日月曜日

付属FM3基板 第二歩 タイマ割り込み。(苦戦中)

Interface誌 付属FM3基板 で タイマ割り込みにトライしています。必要とするタイマの機能は、インターバルの設定と割り込みによる関数こ呼び出しといった、ごく基本的な機能から試しています。

 ペリフェラルマニュアルでは、デュアルタイマと、多機能タイマの2種類のタイマの記載があり、先日富士通サイトからダウンロードしたサンプルコードのうち、「mb9bf51xt_dualtimer-v10」を修正し、一応
の動作を確認しました。

●修正点
   [smpl_dtim.c] / dtim_callback の if (int_flag < 30000 ){の処理に
     FM3_GPIO->PDOR5_f.P0 = (int_flag & 0x0040) >>6;を追加
      (  bFM3_GPIO_DDR5_P0=1;を適宜に追加 ・・・GPIO出力設定 )
        =>タイマ割り込み64回毎に点滅

 
次に、サンプルコード「mb9bf51xt_dualtimer-v10」のsample_main.c  smple_dtm.c DtimDev.h DtimDev_FM3.c DtimDev_FM3.h のソース、ヘッダー
別のサンプルコード「mb9bf61xt_template-v13」 のmb9b610t.h system_mb9bf61x.c  system_mb9bf61x.h のソース、ヘッダー
を使って、KEILの新規プロジェクトを作成しました。ただ、サンプルコードの”mb9bf51”が気になっただけのことですが。

●KEIL新規プロジェクト作成について、
  ターゲットの実デバイス 「mb9b618t」はDataBaseに追加されたようでこれを指定しました。
=> startup_mb9bf61x.s が生成されました。

ここまでは、比較的容易にたどりつけました。

 現在過去のV850~SH2Aで使い続けたプログラムへの対応を行っています。今回使用のサンプルコードは、結構ややこしく組まれています。サンプルコードの解析結果やマニュアルに基づいて、一旦出来るだけ単純化したものにしようとしています。
 まだ、タイマ割り込みが実現できず、2日ほどもがいています。

================================

今回、Cortex-M3としては、3つ目のmcu(STM32、LM3S、FM3)になるのですが、初めて気付いた点がありました。

 
 
  ◎メモリ上のレジスタの領域が2つある、ビットバンド領域とエイリアス領域
     サンプルコードのmb9b610t.hで同じレジスタの項目が定義される箇所が2か所あり、別のアドレスが割り当てられていて、最初は何だこれは!理解不能!という感じでした。

いくつかのサンプルコードをじっくり調べると、どうも、レジスタの1ビットが1ワード(32ビット)に展開されていることが解ってきました。

このような機能が、マニュアル(一部表記に誤り?)でビットバンド領域なる言葉があり、Cortex-M3の機能であることに初めて気づきました。
 
FM3のコーディングでは、ビットバンド領域への書き込みでレジスタを設定するのがよいのか、エイリアス領域への書き込みでレジスタを設定するのがよいのか、、、


いずれにせよ、無秩序に混在したコーディングは避けた方が無難だと言えます。
(ただ、エイリアス領域を使う利点をまだ認識していないだけなのですが。。。)

2012年5月2日水曜日

付属FM3基板 第一歩(GPIO 出力)

Interface誌 付属FM3基板 購入よりほぼ、1週間、暇を見つけながら、ようやく開発の端緒に辿りつけました。

1.USB DIRECT Programmerのインストール
富士通のサイトからダウンロード(usbdirect-v01l06.zip)
  特に問題なくインストール(USBデバイスデバイスドライバは後回し)
2.サンプルプログラムをダウンロード
  ダウンロードファイル mb9b610t-files.zip
  最も初歩のサンプル mb9b610t-files / mb9b610t-series-201204.zip / mb9b610t-series-201204 / mb9bf61xt_template-v13

    main.cの気になる点。
    bFM3_GPIO_DDR3_PC=1; と bFM3_GPIO_PDOR3_PC=1;。。。
    GPIO P3C を High / Low 出力  付属FM3基板のLED1は GPIO PF3 の出力のはず。。。。

3.はんだ付け作業
  過去の付属基板(SH2Aなど)と同様にCN2を基本に、CN3を拡張ように振り分けはんだ付け作業をおこないました。

4.KEIL MDK-ARMのインストール
  http://www.keil.com/fujitsu/ より 「MDK450.EXE」をダウンロードし、MDK-ARMのインストール


  プログラム本体のインストール終了後、「File installation completed」画面が表示 少し戸惑う。
  かまわず、進める。 コマンドプロンプト(DOS窓)でのインストールが進む。で、デバイスドライバ(KEIL Tools By ARM ユニバーサルシリアル。。。。)のインストール が完了

5.付属FM3基板をつなぐ(デバイスドライバのインストール)
 とりあえず、付属FM3基板をPCにつなぎました。(JPP1はオープン)、何も起こらない。。。。
 デモプログラムは書き込まれていないようです。JPP1をショート、JPP2でリセットを行う。PCは新規デバイスを検出しました。
 使用するPCがWindows Vista なのか、デバイスドライバのインストールはすんなりいかず、付属基板は不明なデバイスとなっていました。
 そこでつなぎ直し(JPP1はショート)、改めてデバイスドライバのインストールを行いました。

 デバイスドライバの参照先 
  Program Files / Fujitsu /  FUJITSU USB DIRECT Programmer / driver / WinXP

6.サンプルプログラムのビルドおよび書き込み
 2.で取得したサンプルプログラムをKEIL MDK-ARMでビルド 、USB DIRECT Programmerで付属基板に書き込みました。
 しかし JPP1 オープン(ユーザーモード)で LED1は点滅せず。前記の危惧に基づき、main.cを修正しました。
 
 操作するGPIOを変更
   bFM3_GPIO_DDR3_PC  => bFM3_GPIO_DDRF_P3
   bFM3_GPIO_PDOR3_PC => bFM3_GPIO_PDORF_P3  

 再度、プログラムをビルド、付属基板書き込み、ようやく LED1の点滅を実現

7.その他 GPIO
 今回、作成した自作ボードはモノクロLCD(SG12864)の表示を行うため GPIOでP2、P5、PBのポートを使用します。
 特にPBポートとP22は、ADC端子と共用で、GPIOとして使用するためADEレジスタの設定が必要になります。
  例 
    PB0の場合 bFM3_GPIO_ADE_AN16=0;

FM3はGPIOを使うための設定が、ポート単位ではなくピン単位で異なります。この点は結構マイナスに感じます。 GPIOのピンを変更する場合、ドキュメントを見て、共用となる端子を一々確認する必要がありそうです。 (慣れれば問題無いのかも知れませんが。)


2012年4月26日木曜日

Interface誌 付属FM3基板 追加部品について


 先日(4月23日)、定期購読のInterface誌 2012年6月号が届きました、早速、付属基板を開封、眺めてみると、未実装のパターンが目につきました、
 追加部品が必要??、今年は、追加部品を購入しなければいけないのかと、少々落胆しながら、本誌の関連記事をチェックしました。



気になった追加部品   インダクタ(L1 2.2μH)、水晶発振子(X2 4MHz)、リセットIC(IC4) 

これらの部品は、本誌の記事で必須でないことが解りました。


  インダクタ(L1): 300mAを超える電流が必要な場合必要 とりあえず不要

    FM3基板は、電源回路にDC-DCコンバータ(MB39C022G)を使用しています。このDC-DCコンバータ、本来のDC-DCコンバータのほか、LDOレギュレータを搭載しています。FM3基板はLDOレギュレータの機能を使っています。300mAを超える電流が必要な場合、DC-DCコンバータの機能に切り替える必要があり、インダクタ(L1)が必要になります。


  水晶発振子(X2)  とりあえず不要

    FM3基板上にすでにシリコン発振器(X1 外部クロック)があります。本誌の記事で最近のシリコン発振器は通常使うのに充分の精度があるとのこと。


  IC(IC4) リセットIC とりあえず不要


    FM3のINITX 端子に接続 リセットICのLow出力でFM3はリセットされます。リセットICは電源が安定するまでLowを出力します。複数のマイコンを組み合わせた場合など、リセットのタイミングを揃える必要がある場合に必要になります。


その他

  本誌、コネクタ・ピン配置 CN1-20のGPIO P20 は P90では??
  
  CN1~3への引き出しについて、GPIOのまとまりが若干悪いように思います。
    8ビット纏まって使えそうなポートは P7、PB、で P1、PC等は使い勝手が悪そう。
    FM3自体のピン配置自体の制約を受けるので仕方が無いように思います。
    万人受けのよい配置は至難の業と言うことでしょう。

 過去の付属SH2A基板のように、使い慣れるほど、使い勝手のよい基板になることを期待。



2012年3月13日火曜日

GNU GCC 開発環境整備 再び (for ARM Cortex-M3)

CQ出版 Interface誌 恒例の付属基板 本年(2012年)は 富士通「FM3マイコン」のようです。このマイコンはARM Cortex-M3マイコンで、今は亡きDesign Wave誌 2008年5月号付属の基板CQ-STARMと同じコアです。
  そこでほぼ4年前の基板CQ-STARMを引っ張り出し、電源ON、するとその当時組んだプログラムが動きだしました。「お久しぶり」といった感じでした。
  この基板に搭載されたMCUはSTM32F103で
   動作クロック72MHz、RAM 20KB、フラッシュROM 128KB 
 本年の「FM3マイコン基板」に搭載されるMCUはMB9BF618T(予定)で、
   動作クロック144MHz、RAM 128KB、フラッシュROM 1MB
 かなりのスペックです。 今年は本腰を入れていろいろ遊びたいと思います。

  さて、STM32基板ですが、若干物足りないスペック、開発環境はIARのWorkbench(使用制限)、追加部品の水晶発振子の入手性 等で、その当時、動作確認程度の開発にとどめていました。
 そのような扱いのSTM32基板、稼働したプログラムのプログラムソースをビルドすると、案の定、ビルドエラーが発生しました。他のARM基板(LPC2388、LM3S8962)での開発でGNU GCCの開発環境(GCC ver.3.4. => ver.4.3 )を組み直したのが原因だと思われます。
   今年のFM3基板の準備として、GNU GCCの開発環境の組み直しを行いました。   

 1.GNU GCC 開発環境について
  ◎GCCは、ARM対応版を整備する。
    ARM7TDMI、Cortex-M3、、、、各MCUコア共通
  ◎コードセットはThumb
    GNU GCC はThumb-2に非対応 GCC Vre4.6.3のインストールで Thumb-2のコードセットがインストールされることを秘かに期待していたのですが残念、、、、Thumb-2は2003年の発表で、そろそろGNU GCCでThumb-2の対応があっても良いのではと思います。
    Interface編集部、ARM社、富士通、、、、どこでも良いから、GNU GCCのThumb-2対応版をリリースしてほしいものです。  

  ◎FPU (Floating Poing Unit; 浮動小数点演算ユニット)無しで整備する。
    GNU GCCでビルドすると。「…m-elf/4.6.3/thumb/lib**.a(_******.o) uses hardware FP, whereas main uses software FP」のビルドエラー発生 安直にコンパイルオプション -mhard-float を付加、これはCortex-M3ではNG。
    そこで、binutils、gcc、newlibでconfigureオプション --with-float=soft を指定して再インストールしました。    

2.GNU GCC(Vre4.6.3) 開発環境整備 手順
  1)Cygwinのインストール
     gccに加え、binutils、(libiconv)等のパッケージをインストールする。
     ※出来るだけGNU GCCの開発環境(Cygwin上で動くソフトウエアを開発する環境)を整えてしまう。
  2)gccビルド準備( 1)の補足 )
    gccビルド用に以下のパッケージをインストールする。
   ①gmpのインストール
   ②mpfrのインストール
   ③mpcのインストール
   ④libiconvのインストール
    ※今回はCygwinのインストールでは組み込まず、ここでインストール
  3)gccビルド
   ここでビルドするgccは、Cygwin上で稼働し、ARM MCUで動くソフトウエアを出力する。
   ①binutilsのインストール
    binutils ver.2.22ではインストール失敗(初回)、ver.2.21.1で成功
    一旦GNU GCCをインストール後再度 ver.2.22をインストールで成功
   ②gccのインストール
   ③newlibのインストール
        newlib ver.1.20.0ではインストール失敗(初回)、ver.1.18.0で成功
    その後、ver.1.19.0をインストール 成功
    その後、ver.1.20.0をインストール 成功
   ③gccのインストール
     configureでオプション --with-newlib を追加して再インストール         

※ST32F103 LCD出力プログラム


メモ
 ※configureオプション --with-float=
    --with-float=soft 浮動小数点演算をライブラリを使って実行
    --with-float=hard 浮動小数点演算をFPUを使って実行
 ※Cortex-M3では Thumb の一部の命令がサポートされていない。コンパイル オプション -mcpu=cortex-m3 指定がこの問題に対応してくれると良いのですが。後々手こずることになりそうです。

2012年3月3日土曜日

MSP430 温度計

Texas Instruments MSP430 を使って温度計を作成しました。


LaunchPadで実装されているデモプログラムに手を入ただけのものですが、結構よい暇潰しになりました。
1年前は、デモプログラムの通信機能を中心に色々試してみましたが、今回はADCについて機能を検証しました。

1.ADC10コンフィグレーション
 1)入力レンジの設定
   ・GND~Vcc  0V~3.3V
   ・GND~Vref  0V~(1.5V or 2.5V) ※デモプログラム設定 
   ・その他
 2)チャネル 選択 
   ・A0~A7
   ・Temperature Sensor    ※デモプログラム設定
 3)参照電圧(Vref)選択 Reference-generator voltage
   ・1.5V           ※デフォルト
   ・2.5V
 4)参照電圧生成 Reference-generator
 5)サンプリング周期設定 Sample and hold time
   64xADC10CLKs 
 6)割り込み許可 Interrupt enable
 7)ADC ON

2.ADC分解能
 ADC分解能 = 1500mv ÷ 1024(10bit) = 1.4648mv/div

3.温度計算(内蔵温度センサ)
   MSP430G2x52に内蔵された温度センサを利用した温度計
   (ADC10 チャネル選択で温度センサ指定)
   ・温度センサ仕様  3.55mV/℃

   ADC値(1単位)あたりの温度= 1.4648mv/div ÷ 3.55mV/℃ = 0.41263℃

   0℃でのADC値 = 673

   計測温度 = (ADC値 - 673) × 0.41263

4.温度計算(外装温度センサ LM61BIZ)
  ADC10のチャネル A0に 温度センサを繋げた温度計
   ・温度センサ仕様 0℃での出力電圧 600mV、  10mV/℃

   ADC値(1単位)あたりの温度. = 0.14648 ℃/div.

   0℃でのADC値 = 600mV÷1.46484375mv/div = 409.6

   計測温度(℃)=(ADC10の出力値 - 409.6)×0.14648

5.その他

 ADCの出力値はサンプリング毎に結構ぶれるので、サンプルプログラムでは8回のサンプリングの移動平均をとり、この値から温度計算を行っています。

 今回の温度表示は、MSP430内蔵温度センサと外装温度センサでは、最大で1.5℃のずれがありました。また、部屋にあった寒暖計とも2~5℃ずれていました。